本帖最后由 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,让其补充完善代码。最后生成无错可编译执行的代码。
代码文本如下:
[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文件中,顶部嵌入函数定义声明,以便混合编程调用函数。
代码文本:
[C++] 纯文本查看 复制代码 #嵌入代码
int browseforfolder(WCHAR path[]); //声明嵌入函数定义以便调用
bool openFileDialog(WCHAR filePath[]);
bool saveFileDialog(WCHAR filePath[]);
#嵌入代码_结束
炫彩IDE v3.3.8.2(20240303) (VS2015)x86和x64模式下调试编译均正常通过,运行结果如下:
项目源码见附件压缩包。
|