对话框不创建WinAPI

Dialog boxes are not created WinAPI

本文关键字:WinAPI 创建 对话框      更新时间:2023-10-16

如果我为主窗口创建一个子窗口(在本例中为窗口"About"),则由于某种原因不会调用对话框。如果您不这样做,子窗口是一个对话框称为正常和工作正常。GetLastError返回错误号1812(指定的映像文件不包含资源段)。但是从资源文件来看,一切都很好。正如我所说,如果不创建子窗口,那么一切都可以正常工作。有什么问题吗?

#include <windows.h>
#include "resource.h"
LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK PointsProc(HWND hPoints, UINT message, WPARAM wParam,LPARAM lParam);
HINSTANCE hInst;
HWND hPoints;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    hInst = hInstance;
    HWND hwnd;
    MSG msg;
    WNDCLASS w;
    memset(&w,0,sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    w.lpszClassName = L"My Class";
    RegisterClass(&w);
    hwnd = CreateWindow(L"My Class", L"My title", WS_OVERLAPPEDWINDOW,
    300, 200, 200, 180, NULL, NULL, hInstance, NULL);
    HMENU main_menu = CreateMenu();
    AppendMenu(main_menu, MF_STRING, 1111, L"Box");
    WNDCLASS w2;
    memset(&w2, 0, sizeof(WNDCLASS));
    w2.lpfnWndProc = (WNDPROC)PointsProc;
    w2.hInstance = hInst;
    w2.lpszClassName = L"About";
    w2.hCursor = LoadCursor(NULL, IDC_ARROW); 
    w2.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(111, 111, 111));
    RegisterClass(&w2);
    hPoints = CreateWindowEx(0, L"About", (LPCTSTR) NULL,
    WS_CHILD | WS_BORDER | WS_VISIBLE | WS_DISABLED, 10, 10,
    100, 100, hwnd, (HMENU)1112, hInst, NULL);
    ShowWindow(hPoints,SW_NORMAL);
    UpdateWindow(hPoints);
    SetMenu(hwnd, main_menu);
    ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch (Message)
    {
        case WM_COMMAND:
            switch(LOWORD(wparam)) 
            {
                case 1111:
                    DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, About);
                    return 0;
            }
            break;
        case WM_DESTROY: 
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}
LRESULT CALLBACK PointsProc(HWND hPoints, UINT message, WPARAM wParam,LPARAM lParam)
{   
    switch(message)
    {   
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_PAINT:
            break;
        default:
            return DefWindowProc(hPoints, message, wParam, lParam);
    }
    return 0;
}
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
        case WM_COMMAND:
            if (LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
        break;
    }
    return (INT_PTR)FALSE;
}

对话框调用,只是PointsProc()正在循环,需要很长时间…

问题是break;PointsProc()中处理WM_PAINT时-然后跳过调用DefWindowProc(),因此窗口不断获得WM_PAINT消息,因为窗口仍然无效。

//        case WM_PAINT:
//            break;