资源对话框返回-1

Resource DialogBox is returning -1

本文关键字:返回 对话框 资源      更新时间:2023-10-16

我已经使用资源编辑器(对话编辑器?)创建了我的对话框作为资源

它没有什么特别的,只是两个组框,两个按钮,一个拆分按钮,两个图片框,3个静态标签,3个编辑框,3个旋转控件,3个系统链接和一个进度条。

当我按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。我还尝试包括公共控件头并调用InitCommonControls,但这没有任何作用。

我把所有东西都放回原来的样子,并添加了这个预处理指令来修复它:

#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")

这就是问题所在。如果没有这个指令,对话框将不会初始化,因为SysLinks!

您不需要为Dialog进程调用DefWindowProc。它们是由操作系统为您完成的。简写return FALSE;

常用控件!进度条,作为一个例子-你需要链接commctrl dll,包括commctrl头,并调用InitCommonControlsEx。这将导致您的程序执行并立即终止。


在资源编辑器中测试对话框实际上并不执行任何其他代码——它只是绘制对话框,在适当的位置绘制子窗口,然后坐在那里盯着你看。你的dlgproc可能是非常不正确的,而资源编辑器不会呜呜叫。

默认情况下,你的对话过程应该返回0,而不是传递给默认的窗口进程。

一旦你开始滚动,你会处理(一些)你的对话框接收到的消息,像这样:

 switch(msg) {
      case WM_COMMAND:{
           switch(LOWORD(wParam)) {
              // do stuff here when a child window is manipulated
      }
      break;
 }