【问题标题】:C# & C++ MFC : Create a book page using folder file count and orderC# & C++ MFC : 使用文件夹文件计数和顺序创建书页
【发布时间】: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 Application 和C ++ MFC Application solutions 中的任何一个,我一定会投赞成票。

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

【问题讨论】:

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

标签: c# windows mfc


【解决方案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){}
            else{nTotalPage++;}
        } 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 # 代码,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 2016-01-29
  • 1970-01-01
  • 2016-09-08
  • 2012-05-23
  • 1970-01-01
  • 2022-10-20
  • 2014-06-01
相关资源
最近更新 更多