我使用资源编辑器(对话框编辑器?)
创建了对话框作为资源没什么特别的,只有两个组合框,两个按钮,一个分割按钮,两个图片框,3个静态标签,3个编辑框,3个旋转控件,3个syslink和一个进度条。
当我按Ctrl + T测试对话框时,它似乎工作正常,但是当我按F5调试程序时,对话框永远不会出现,程序退出时代码为-1(0xffffffff)
以下是我用来调用对话框的代码:
#include <Windows.h>
#include "resource.h"
BOOL CALLBACK DlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case (WM_COMMAND):
switch (LOWORD(wParam))
{
default:
break;
}
break;
default:
return FALSE;
}
return FALSE;
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINWINDOW), NULL, DlgProc);
int err = GetLastErro(); // This gives 0
return ret; // This gives -1
}
我还没有DlgProc
中的任何内容,因为我只是想要开始显示对话框。
如果我在DlgProc
中设置断点,那么这些是它收到的消息:
48,85,297,273,273,144,2和130.
我看了这些,他们翻译成:
WM_SETFONT
WM_NOTIFYFORMAT
???
WM_COMMAND
WM_COMMAND
???
WM_DESTROY
WM_NCDESTROY
有人知道我做错了吗?
修改::
我找到了问题的解决方案!我们原本以为它是一个损坏的RC文件,但我意识到我制作的测试RC文件除了SysLink之外还有各种控件。当我添加SysLink时,同样的事情发生了。我尝试在链接器中包含ComCtl32.lib,我也尝试包含公共控件头并调用InitCommonControls
但是没有做任何事情。
我把所有东西都放回原来的样子,并添加了这个修复它的预处理器指令:
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
这就是问题所在。如果没有该指令,对话框将不会因为SysLinks而初始化!
答案 0 :(得分:2)
您无需为Dialog触发器调用DefWindowProc
。它们是由操作系统为您完成的。只需return FALSE;
答案 1 :(得分:0)
常用控件!进度条,作为示例 - 您需要与commctrl dll链接,包含commctrl头,并调用InitCommonControlsEx。这导致程序执行并立即终止。
在资源编辑器中测试对话框实际上并不执行任何其他代码 - 它只是绘制对话框,在适当的位置绘制子窗口,然后坐在那里盯着你。您的dlgproc可能非常不正确,资源编辑器也不会像呜咽一样。
默认情况下,对话框程序应返回0,而不是切换到默认窗口proc。
一旦你滚动,你将处理(某些)对话框收到的消息,如下所示:
switch(msg) {
case WM_COMMAND:{
switch(LOWORD(wParam)) {
// do stuff here when a child window is manipulated
}
break;
}