C# & C++ MFC : 使用文件夹文件计数和顺序创建书页

Posted

技术标签:

【中文标题】C# & C++ MFC : 使用文件夹文件计数和顺序创建书页【英文标题】:C# & C++ MFC : Create a book page using folder file count and order 【发布时间】:2018-06-20 01:23:41 【问题描述】:

我想开发一个执行分页功能的模块,以便可以像查看电子书一样查看任意文件夹中的图片。 我正在尝试使用C #C++ MFC 实现接口和功能。

界面:

文件总数不固定。

示例:

+Folder : images
|_  image_01.jpg  
|_  image_02.jpg  
|_  image_03.jpg  

Total page : 3 (If an image is created in the folder:"images", Total page will be 4.)   
Current page : 2 (image_02.jpg)  

如果我按<<PREV(NEXT>>),应用程序将显示image_01.jpg(image_03.jpg)。

不幸的是,我不知道。我该如何实施?

我无法描述代码,因为我在互联网上找不到解决方案。请不要投反对票,教我怎么做。

提前谢谢你。

如果你解决了C # Windows Form ApplicationC ++ MFC Application solutions 中的任何一个,我一定会投赞成票

如果您能同时发布两个解决方案,我将不胜感激。

【问题讨论】:

您可以制作自己的功能:总页数 = GetFileCount(DIR_PATH); GetPrevImage(NAME_CURRENT_IMAGE); GetNextImage(NAME_CURRENT_IMAGE); 重点是文件顺序 MFC 用于 C++,而不是 C#。 @Alexander 非常感谢。请给我一些代码。 (C# Windows Form ApplicationC++ MFC Application)。 不要乞求低质量的内容不被投票:低质量的内容。这个问题应该被否决和近距离投票。请阅读How to Ask了解它有什么问题。 【参考方案1】:

C++ MFC Windows 应用程序实现:

项目名称: CImagePreview

DWORD ev_page_current, ev_page_total;
WCHAR ev_current_file[MAX_PATH];

void CImagePreview::OnPressPrevButton()

    // TODO: Add your control notification handler code here
    ev_page_total = GetTotalPages(IMAGE_PATH);
    WCHAR wszPath[MAX_PATH] = 0;
    GetPrevImagePathW(IMAGE_PATH, ev_current_file, wszPath);
    DisplayImages(wszPath);

    ev_page_current > 1 ? ev_page_current-- : ev_page_current = 1;
    SetPageNumber();


void CImagePreview::OnPressNextButton()

    // TODO: Add your control notification handler code here
    ev_page_total = GetTotalPages(IMAGE_PATH);

    WCHAR wszPath[MAX_PATH] = 0;
    GetNextImagePathW(IMAGE_PATH, ev_current_file, wszPath);
    DisplayImages(wszPath);

    ev_page_current < ev_page_total ? ev_page_current++ : ev_page_current = ev_page_total;
    SetPageNumber();


DWORD CImagePreview::DisplayImage(_In_ WCHAR* wszFilepath)

    // You can display image with path.
    return 0;


DWORD CImagePreview::GetNextImagePathW(_In_ WCHAR* wszFolderpath, _In_ WCHAR* wszFilename, _Out_ WCHAR* wszFilepath)
return GetImagePathW(wszFolderpath, wszFilename, wszFilepath, NEXT);

DWORD CImagePreview::GetPrevImagePathW(_In_ WCHAR* wszFolderpath, _In_ WCHAR* wszFilename, _Out_ WCHAR* wszFilepath)
return GetImagePathW(wszFolderpath, wszFilename, wszFilepath, PREV);

DWORD CImagePreview::GetImagePathW(_In_ WCHAR* wszFolderpath, _In_ WCHAR* wszInputFilename,  _Out_ WCHAR* wszOutputFilepath, _In_ DWORD dwFlag)

    WIN32_FIND_DATA t = 0;
    HANDLE hFindFile = NULL;
    BOOL blBreak = FALSE;

    WCHAR wszFilename[MAX_PATH] = 0;
    WCHAR wszFindpath[MAX_PATH] = 0;
    WCHAR* wszFindname = NULL;

    if (wszInputFilename)
    
        if (NULL != wcsstr(wszInputFilename, L"\\"))
        
            wszFindname = wcsrchr(wszInputFilename, L'\\');
            wszFindname++;
        
    

    // First set folder path.
    wcscpy_s(wszOutputFilepath, MAX_PATH, wszFolderpath);

    wcscpy_s(wszFindpath, MAX_PATH, wszFolderpath);
    wcscat_s(wszFindpath, MAX_PATH, L"*.jpg");

    hFindFile = FindFirstFileW(wszFindpath, &t); if (hFindFile == INVALID_HANDLE_VALUE)return GetLastError();
    wcscpy_s(wszFilename, MAX_PATH, t.cFileName);

    if( hFindFile != INVALID_HANDLE_VALUE )
    
        do 
        
            if (t.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            else
            
                if (NULL != wszFindname && !wcsicmp(wszFindname, t.cFileName))
                
                    if (PREV == dwFlag) break;
                    if (NEXT == dwFlag) blBreak = TRUE; continue;
                    if (0 == dwFlag)wcscpy_s(wszFilename, MAX_PATH, t.cFileName); break;
                

                if (blBreak) break;

                if(0 == wcslen(wszInputFilename)) wcscpy_s(wszFilename, MAX_PATH, t.cFileName); break;

                wcscpy_s(wszFilename, MAX_PATH, t.cFileName);
            
         while (FindNextFileW(hFindFile, &t));
    
    if (blBreak && NEXT == dwFlag) wcscpy_s(wszFilename, MAX_PATH, t.cFileName);

    FindClose(hFindFile);
    wcscat_s(wszOutputFilepath, MAX_PATH, wszFilename);

    return GetLastError();


INT CImagePreview::GetTotalPages(_In_ WCHAR* wszFolderpath)

    INT nTotalPage = 0;
    WIN32_FIND_DATA t = 0;
    HANDLE hFindFile = NULL;
    WCHAR wszFindpath[MAX_PATH] = 0;

    wcscpy_s(wszFindpath, MAX_PATH, wszFolderpath);
    wcscat_s(wszFindpath, MAX_PATH, L"*.jpg");

    hFindFile = FindFirstFileW(wszFindpath, &t); if (hFindFile == INVALID_HANDLE_VALUE)return GetLastError();

    if( hFindFile != INVALID_HANDLE_VALUE )
    
        do 
            if (t.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            elsenTotalPage++;
         while (FindNextFileW(hFindFile, &t));
    
    FindClose(hFindFile);

    return nTotalPage;


VOID CImagePreview::SetPageNumber(void)

    CString cstrPage;
    cstrPage.Format(_T("%d/%d"), ev_page_total, ev_page_current);
    m_edit_page.SetWindowTextW((LPTSTR)(LPCTSTR)cstrPage);

    return VOID();

DIR_PATH 中的文件顺序可以帮助您。我也测试了我的答案,它运行良好。因为你,我才做了一个电子图片预览器。

我认为您不需要更多与C # 相关的解决方案。我觉得和MFC的解决方法一样……怎么样?

【讨论】:

图片的顺序是如何确定的? @Bryant 图片的顺序由文件名决定。 您的代码运行良好。谢谢你。如果您能编辑 C # 代码,我将不胜感激。

以上是关于C# & C++ MFC : 使用文件夹文件计数和顺序创建书页的主要内容,如果未能解决你的问题,请参考以下文章

c++ MFC访问多个文件

您将使用哪种 C# 项目类型来重新开发 MFC C++ activex 控件?

从 C# 调用非托管 C++ VS 6.0 MFC dll

对界面编程来说c++的mfc,qt和c#的winform,wpf哪个应用多?学哪个好?

像 C# 中的 MFC 通用控件插件?

从非托管 C++ mfc active x dll 启动 C# 对话框