资源DialogBox返回-1

时间:2011-11-18 05:09:21

标签: c++ windows winapi resources

我使用资源编辑器(对话框编辑器?)

创建了对话框作为资源

没什么特别的,只有两个组合框,两个按钮,一个分割按钮,两个图片框,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而初始化!

2 个答案:

答案 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;
 }