炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 137|回复: 2

[炫源码] 小白学习笔记(2)——简单实现通用对话框

[复制链接]
  • TA的每日心情
    无聊
    6 小时前
  • 发表于 2024-3-4 17:05:33 | 显示全部楼层 |阅读模式
    本帖最后由 feiyu2005 于 2024-3-9 09:36 编辑

    梦总语录——慢慢来,先能用,再好用。
    小白语录——我只要写的代码能编译执行,不管什么内存泄露、溢出、野指针,那不是现阶段的我考虑的事情。
    ——————————————————————————
    在需要用到选择文件夹、打开文件、保存文件等操作时,需要调用通用对话框,易语言里有通用对话框组件,炫语言里面现在还没有,目前选择文件夹可以使用“精易模块”移植过来的“精炫模块2(文件目录)”模块里面的“目录_浏览()”或“目录_浏览A()”,打开文件可以使用“易语言核心模块”里面的“多文件对话框()”,论坛里面也有“系统API选择文件夹对话框”C++源码的帖子。

    本着学习的精神,尝试使用嵌入C++代码、炫语言和C++混合编程方式,来实现简单的通用对话框,这里的“简单”不是说通用对话框简单,是指写得代码粗糙简陋。

    论坛里面梦总分享的“系统API选择文件夹对话框"C++源码(http://bbs.xcgui.com/forum.php?mod=viewthread&tid=58208),没有getDesktoppath()函数代码的部分,咋实现啊,非专业人员,哪里会C++呀,进入AI时代,AI会C++等于我会C++,让AI去写代码。把整体代码发给AI,让它完善优化。
    请AI优化.png
    请AI优化2.png
    生成合适的代码后,顺便让其生成“打开文件对话框”和“保存文件对话框”的代码,在项目中新建一个炫语言源码文件,然后将生成的代码整体嵌入进去。运行调试编译出错的话,出错信息直接发给AI,让其补充完善代码。最后生成无错可编译执行的代码。
    嵌入代码.png

    代码文本如下:
    [C++] 纯文本查看 复制代码
    #嵌入代码
    #include <Windows.h>
    #include<ShlObj.h>
    #include <iostream>
    #include<CommDlg.h>
    
    //直接指定链接 comdlg32.lib,确保编译时正确链接到 comdlg32.lib
    #pragma comment(lib, "comdlg32.lib")
    
    //----------------------------------------------
    void getDesktoppath(char path[])
    {
            LPITEMIDLIST pidl;
            SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl);
    
            if (SHGetPathFromIDList(pidl, (LPWSTR)path))
            {
                    CoTaskMemFree(pidl);
            }
    }
    
    //------------------------------------------------
    int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
    {
            CHAR szDesktop[MAX_PATH]; //MAX_PATH是 Windows系统中定义的常量,用于表示文件路径名缓冲区的最大长度,MAX_PATH的值为260
            getDesktoppath(szDesktop); // 设置默认的打开路径
    
            if (uMsg == BFFM_INITIALIZED)
            {
                    SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)szDesktop);
            }
    
            return 0;
    }
    
    //--------------------------------------------------
    int browseforfolder(WCHAR path[])
    {
            LPITEMIDLIST lpDlist = NULL;
            WCHAR szPathName[MAX_PATH];
            BROWSEINFO bInfo = { 0 };
            bInfo.lpszTitle = L"选择文件的保存路径"; //对话框标题
            bInfo.hwndOwner = GetForegroundWindow();
            bInfo.lpfn = BrowseCallbackProc;
            bInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI | BIF_UAHINT | BIF_NONEWFOLDERBUTTON;
            lpDlist = SHBrowseForFolder(&bInfo);
    
            if (lpDlist != NULL)
            {
                    SHGetPathFromIDListW(lpDlist, szPathName);
                    wcscpy_s(path, MAX_PATH, szPathName);
                    return 1;
            }
            else
            {
                    // 用户取消了对话框,清空文件路径
                    wcscpy_s(path, MAX_PATH, L"");
            }
    
            return 0;
    }
    
    //------------------------------------------------
    bool openFileDialog(WCHAR filePath[])
    {
            OPENFILENAMEW ofn;
            WCHAR szFileName[MAX_PATH] = { 0 };
    
            ZeroMemory(&ofn, sizeof(ofn));
            ofn.lStructSize = sizeof(ofn);
            ofn.hwndOwner = NULL;
            ofn.lpstrTitle = L"选择文件"; //通用对话框标题
            ofn.lpstrFilter = L"All Files (*.*)\0*.*\0"; //文件类型过滤器,可以根据需要设置
            ofn.lpstrFile = szFileName;
            ofn.nMaxFile = MAX_PATH;
            ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    
            if (GetOpenFileNameW(&ofn))
            {
                    wcscpy_s(filePath, MAX_PATH, szFileName);
                    return true;
            }
            else
            {
                    // 用户取消了对话框,清空文件路径
                    wcscpy_s(filePath, MAX_PATH, L"");
            }
    
            return false;
    }
    
    //------------------------------------------------
    bool saveFileDialog(WCHAR filePath[])
    {
            OPENFILENAMEW ofn;
            WCHAR szFileName[MAX_PATH] = { 0 };
    
            ZeroMemory(&ofn, sizeof(ofn));
            ofn.lStructSize = sizeof(ofn);
            ofn.hwndOwner = NULL;
            ofn.lpstrTitle = L"保存为"; //通用对话框标题
            ofn.lpstrFilter = L"All Files (*.*)\0*.*\0"; //文件类型过滤器,可以根据需要设置
            ofn.lpstrFile = szFileName;
            ofn.nMaxFile = MAX_PATH;
            ofn.Flags = OFN_EXPLORER | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST;
    
            if (GetSaveFileNameW(&ofn))
            {
                    wcscpy_s(filePath, MAX_PATH, szFileName);
                    return true;
            }
            else
            {
                    // 用户取消了对话框,清空文件路径
                    wcscpy_s(filePath, MAX_PATH, L"");
            }
    
            return false;
    }
    
    #嵌入代码_结束


    然后在main.xc文件中,顶部嵌入函数定义声明,以便混合编程调用函数。
    嵌入代码2.png
    代码文本:
    [C++] 纯文本查看 复制代码
    #嵌入代码
    int browseforfolder(WCHAR path[]); //声明嵌入函数定义以便调用
    bool openFileDialog(WCHAR filePath[]);
    bool saveFileDialog(WCHAR filePath[]);
    #嵌入代码_结束


    炫彩IDE v3.3.8.2(20240303) (VS2015)x86和x64模式下调试编译均正常通过,运行结果如下:
    运行结果-浏览.png

    运行结果-打开.png

    运行结果-保存.png

    项目源码见附件压缩包。
    游客,如果您要查看本帖隐藏内容请回复




  • TA的每日心情
    开心
    2024-4-14 08:17
  • 发表于 2024-3-4 21:13:27 | 显示全部楼层
    楼主牛逼,炫语言结合AI编程,再来多点教程。
  • TA的每日心情
    无聊
    5 小时前
  • 发表于 3 天前 | 显示全部楼层
    AI会C++等于我会C++.哈哈哈.
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

    GMT+8, 2024-4-27 15:22 , Processed in 0.070444 second(s), 21 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表