为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕容3067478 2021-08-22 15:31:31
我想开发一个执行分页功能的模块,以便可以像电子书一样查看任意文件夹中的图片。我正在尝试使用C #and实现接口和功能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,我肯定会投票。如果您能同时发布两个解决方案,我将不胜感激。
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

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解决方案相同......怎么样?


查看完整回答
反对 回复 2021-08-22
  • 1 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信