繁体   English   中英

未创建对话框WinAPI

[英]Dialog boxes are not created WinAPI

如果我在主窗口中创建一个子窗口(在本例中为“关于”窗口),则由于某种原因该对话框不会被调用。 如果不这样做,则子窗口是一个名为normal的对话框,并且工作正常。 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; 在处理WM_PAINTPointsProc() -它然后跳过调用DefWindowProc()所以窗口状态越来越WM_PAINT消息,因为窗口仍然无效。

//        case WM_PAINT:
//            break;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM