c - DialogBox 未正确呈现?

标签 c winapi dialog

我不确定我做错了什么,但它看起来是这样的(没有关闭按钮,没有标题栏):

enter image description here

看起来好像没有更新/滴答/重绘。

这是我的 Resource.rc 文件:

#include "resource.h"
#include "windows.h"

#define IDC_STATIC -1

ID_ICON_MAIN ICON "Smile.ico"

ID_DIALOG_ABOUT DIALOG 0, 0, 240, 70
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_BORDER
CAPTION "About"
FONT 8, "Terminal"
{
        DEFPUSHBUTTON   "&OK", IDOK, 174, 18, 50, 14
        PUSHBUTTON      "&Cancel", IDCANCEL, 174, 36, 50, 14
        GROUPBOX        "About this program...", IDC_STATIC, 7, 7, 225, 52
        CTEXT           "An example program\r\nBy vexe", IDC_STATIC, 16, 18, 144, 33
}

更改样式、标题、字体大小等不会改变任何内容。请注意,我使用的是 Windows 经典主题,更改为标准 Windows 7 也无济于事,因此这不是主题问题。

这是我的窗口代码:

#include <Windows.h>
#include "resource.h"

INT_PTR WINAPI DialogWndProc(HWND Window, UINT Message,
                             WPARAM WParam, LPARAM LParam)
{
    INT_PTR Result = TRUE;

    switch (Message)
    {
        case WM_INITDIALOG:
        {
            // UpdateWindow(Window); // Doesn't really help. Taking out the case didn't do anything either
        }
        break;

        case WM_COMMAND:
        {
            int Command = LOWORD(WParam);
            switch(Command)
            {
                case IDOK:
                {
                    EndDialog(Window, IDOK);
                }
                break;

                case IDCANCEL:
                {
                    EndDialog(Window, IDCANCEL);
                }
                break;

                default:
                {
                    Result = FALSE;
                }
                break;
            }
        }
        break;
    }

    return(Result);
}

LRESULT WINAPI MainWndProc(HWND Window, UINT Message, 
                           WPARAM WParam, LPARAM LParam)
{
    LRESULT Result = 0;

    switch (Message)
    {
        // (Causes GetMessage to return false)
        case WM_CLOSE:
        {
            DestroyWindow(Window);
        }
        break;

        case WM_DESTROY:
        {
            PostQuitMessage(0);
        }
        break;

        case WM_COMMAND:
        {
            int Command = LOWORD(WParam);
            switch (Command)
            {
                case ID_MENU_FILE_EXIT:
                {
                    PostMessage(Window, WM_QUIT, 0, 0);
                }
                break;

                case ID_MENU_HELP_ABOUT:
                {
                    int Choice = DialogBox(0, MAKEINTRESOURCE(ID_DIALOG_ABOUT), Window, DialogWndProc);
                    switch (Choice)
                    {
                        case IDOK: MessageBox(Window, "Okay!", "OK", MB_OK | MB_ICONINFORMATION); break;
                        case IDCANCEL: MessageBox(Window, "Canceled!", "Cancel", MB_OK | MB_ICONINFORMATION); break;
                    }
                }
                break;
            }
        }
        break;

        case WM_CREATE:
        {
            HMENU Menu;
            HMENU SubMenu;

            // Create the main menu
            Menu = CreateMenu();

            // Create submenus
            {
                SubMenu = CreatePopupMenu();
                AppendMenu(SubMenu, MF_STRING, ID_MENU_FILE_EXIT, "E&xit");
                AppendMenu(Menu, MF_STRING | MF_POPUP, (UINT_PTR)SubMenu, "&File");

                SubMenu = CreatePopupMenu();
                AppendMenu(SubMenu, MF_STRING, ID_MENU_HELP_ABOUT, "&About");
                AppendMenu(Menu, MF_STRING | MF_POPUP, (UINT_PTR)SubMenu, "&Help");
            }

            // Set the menu on the window
            SetMenu(Window, Menu);
        }
        break;

        default:
        {
            Result = DefWindowProc(Window, Message, WParam, LParam);
        }
    }

    return(Result);
}

int CALLBACK WinMain(HINSTANCE Instance, HINSTANCE Previous, LPSTR CommandLine, int CmdShow)
{
    // Create window class
    WNDCLASSEX WindowClass = {0};
    WindowClass.cbSize = sizeof(WNDCLASSEX);
    WindowClass.style = CS_HREDRAW | CS_VREDRAW;
    WindowClass.lpfnWndProc = (WNDPROC)MainWndProc;
    WindowClass.hInstance = Instance;
    WindowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    WindowClass.lpszMenuName = MAKEINTRESOURCE(ID_MENU_MAIN);
    WindowClass.lpszClassName = "SaedoGames_0";
    WindowClass.hIcon = LoadIcon(Instance, MAKEINTRESOURCE(ID_ICON_MAIN));
    WindowClass.hIconSm = (HICON)LoadImage(0, "Smile.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
    RegisterClassEx(&WindowClass);

    // Create window
    HWND Window = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "SaedoGames_0", "Test Window",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT,
        640, 480,
        0, 0,
        Instance, 0
    );

    // Show window
    ShowWindow(Window, CmdShow);
    UpdateWindow(Window);

    // Message loop
    MSG Msg;
    while (GetMessage(&Msg, Window, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return(0);
}

很确定我错过了一个简单的函数调用,但不确定它是什么。我错过了什么?

最佳答案

您的对话过程无条件地向每条消息返回 TRUE,这意味着“我处理了该消息,您无需执行任何其他操作”。您的对话过程通过在函数顶部将 Result 设置为 TRUE 并且从不更改它(除非您从未知控制)。这是错误的;如果您不自己处理消息,则需要返回 FALSE

WM_INITDIALOG 是少数将其值直接返回到对话系统而不是通过 DWLP_MSGRESULT 的消息之一。在这种情况下,并且仅在这种情况下,您确实需要返回 TRUE(除非您手动调整了制表位)。

关于c - DialogBox 未正确呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41844734/

相关文章:

c - 执行流程 - 可以在退出之前进入函数两次吗?

c - 什么是轻量级跨平台WAV播放库?

c++ - 已写入文件上的 FlushFileBuffers

dialog - jQuery Mobile警报/确认对话框

c# - 如何根据 MessageBox 选择显示对话框

c - 使用函数指针作为参数

c - C-函数定义具有用于参数的指针,在调用时传递的变量不是指针,而是编译和运行(有时)。怎么样?

c# - 如何获取已知文件夹的本地化名称?

c++ - 为什么 ShellExecute 找不到文件?

java - 从 JNLP 运行应用程序时出现不需要的登录对话框