DialogBox无法正确呈现?

时间:2017-01-25 06:18:06

标签: 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);
}

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

1 个答案:

答案 0 :(得分:3)

您的对话程序无条件地将TRUE返回给每条消息,这意味着&#34;我处理了消息,您不必做任何其他事情&#34;。您的对话程序是通过将Result设置为函数顶部的TRUE然后永远不更改它来实现的(除非您从未知控件中获得WM_COMMAND)。这是错的;如果您不自己处理邮件,则需要返回FALSE

WM_INITDIALOG是少数消息之一,它们将值直接返回到对话框系统,而不是通过DWLP_MSGRESULT。在这种情况下和那种情况下,您需要返回TRUE(除非您手动调整制表位)。