C Win32api,创建一个没有资源的对话框
发布时间:2020-12-16 06:00:15 所属栏目:百科 来源:网络整理
导读:我是win32api编程的新手.我想知道如何在非gui程序中创建一个对话框(没有任何资源创建). 我看到有一些CreateIndirect函数的例子.这是最好的方法吗?有什么办法吗 谢谢! 解决方法 您将使用 DialogBoxIndirectParam或 CreateDialogIndirectParam 通过这些功能,
我是win32api编程的新手.我想知道如何在非gui程序中创建一个对话框(没有任何资源创建).
我看到有一些CreateIndirect函数的例子.这是最好的方法吗?有什么办法吗 谢谢! 解决方法
您将使用
DialogBoxIndirectParam或
CreateDialogIndirectParam
通过这些功能,它有更多的工作,但是可以在代码中嵌入一个简单的对话框模板作为一个初始化的静态结构体.对话框模板的格式有一些内置可变大小的数组,因此您必须具有特定于特定对话框的结构声明,但这对调试代码起作用. 这样的东西 #define DLGTITLE L"Debug" #define DLGFONT L"MS Sans Serif" #define DLGAPPLY L"&Apply" #define DLGCANCEL L"&Cancel" #define NUMCHARS(aa) (sizeof(aa)/sizeof((aa)[0])) #define IDC_BITMAP 99 #pragma pack(push,4) static struct { // dltt DWORD style; DWORD dwExtendedStyle; WORD ccontrols; short x; short y; short cx; short cy; WORD menu; // name or ordinal of a menu resource WORD windowClass; // name or ordinal of a window class WCHAR wszTitle[NUMCHARS(DLGTITLE)]; // title string of the dialog box short pointsize; // only if DS_SETFONT flag is set WCHAR wszFont[NUMCHARS(DLGFONT)]; // typeface name,if DS_SETFONT is set // control info // struct { DWORD style; DWORD exStyle; short x; short y; short cx; short cy; WORD id; WORD sysClass; // 0xFFFF identifies a system window class WORD idClass; // ordinal of a system window class WCHAR wszTitle[NUMCHARS(DLGAPPLY)]; WORD cbCreationData; // bytes of following creation data // WORD wAlign; // align next control to DWORD boundry. } apply; struct { DWORD style; DWORD exStyle; short x; short y; short cx; short cy; WORD id; WORD sysClass; // 0xFFFF identifies a system window class WORD idClass; // ordinal of a system window class WCHAR wszTitle[NUMCHARS(DLGCANCEL)]; WORD cbCreationData; // bytes of following creation data } cancel; struct { DWORD style; DWORD exStyle; short x; short y; short cx; short cy; WORD id; WORD sysClass; // 0xFFFF identifies a system window class WORD idClass; // ordinal of a system window class WCHAR wszTitle[1]; // title string or ordinal of a resource WORD cbCreationData; // bytes of following creation data } bitmap; } g_DebugDlgTemplate = { WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU // style 0x94c800c4 | DS_MODALFRAME | DS_3DLOOK | DS_SETFONT,0x0,// exStyle; 3,// ccontrols 0,300,180,// menu: none 0,// window class: none DLGTITLE,// Window caption 8,// font pointsize DLGFONT,{ WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP | BS_DEFPUSHBUTTON,// 0x50030001 WS_EX_NOPARENTNOTIFY,// 0x4 190,160,50,14,IDOK,0xFFFF,0x0080,// button DLGAPPLY,},{ WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,// 0x50010000 WS_EX_NOPARENTNOTIFY,// 0x4 244,IDCANCEL,// button DLGCANCEL,{ WS_CHILD | WS_VISIBLE | WS_GROUP | SS_LEFT,// 0x50020000 WS_EX_NOPARENTNOTIFY,// 0x4 6,6,288,8,IDC_BITMAP,0x0082,// static L"",}; #pragma pack(pop) INT_PTR CALLBACK Debug_DlgProc ( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { } break; case WM_COMMAND: { UINT wId = LOWORD(wParam); if (wId == IDOK || wId == IDCANCEL) { EndDialog (hwnd,wId); } } break; case WM_CLOSE: EndDialog(hwnd,IDCANCEL); break; } return FALSE; } LRESULT DoDebugDialog(HWND hwndApp,LPVOID pvData) { HINSTANCE hinst = hwndApp ? (HINSTANCE)(LONG_PTR)GetWindowLongPtr(hwndApp,GWLP_HINSTANCE) : (HINSTANCE)GetModuleHandle(NULL); return DialogBoxIndirectParamW (hinst,(LPCDLGTEMPLATEW)&g_DebugDlgTemplate,hwndApp,Debug_DlgProc,(LPARAM)pvData); } 更复杂的解决方案是在内存中建立一个对话框模板结构,但是对于调试代码,对话框本身并没有太大变化,这样做很好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |