簡體   English   中英

C ++ winApi無法處理子窗口事件

[英]C++ winApi cannot handle child window events

因此,我有兩個功能。 第一個用於處理父事件,第二個用於處理子事件。 只是一個簡單的方法。

// Parent
LONG WINAPI WndProc(HWND hwnd, UINT Message,
    WPARAM wparam, LPARAM lparam) {
    // задаются пользователем, по идее.

    HDC hdc;
    PAINTSTRUCT ps;
    switch (Message) {
        case WM_LBUTTONDOWN:
        {
            ShowWindow(hChildWnd, SW_SHOW | SW_SHOWNORMAL);
            UpdateWindow(hChildWnd);

        }
        break;
        case WM_COMMAND:
            switch (lparam) {
                case 300:
                    showNotification(L"Hey"); // not working???
                    break;
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}

// Child
LONG WINAPI WndProc1(HWND hwnd, UINT Message,
    WPARAM wparam, LPARAM lparam) {
    switch (Message) {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_COMMAND:
            switch (lparam) {
                case 300:
                    showNotification(L"Hey"); // not working???
                    break;
            }
            break;
        default:
            return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}

當然,我在WinMain函數中創建,注冊類並初始化這些窗口:

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

    MSG msg;

    // parent
    WNDCLASS wc;
    memset(&wc, 0, sizeof(WNDCLASS));
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = CreateSolidBrush(0x00FFFFFF);
    wc.lpszClassName = L"My Class";
    RegisterClass(&wc);

    // Child
    WNDCLASS wcChild1;
    memset(&wcChild1, 0, sizeof(WNDCLASS));
    wcChild1.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wcChild1.lpfnWndProc = (WNDPROC)WndProc1;
    wcChild1.hInstance = hInstance;
    wcChild1.hbrBackground = CreateSolidBrush(0x00FFFFFF);
    wcChild1.lpszClassName = L"My Dialog Class";
    RegisterClass(&wcChild1);


    hWnd = CreateWindowW(L"My Class", L"График функции loga(x)",
        WS_OVERLAPPEDWINDOW,
        00, 00, 1366, 768, NULL, NULL,
        hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    hChildWnd = CreateWindowW(
        L"My Dialog Class", L"Диалог",
        WS_OVERLAPPED | WS_CAPTION,
        10,
        10,
        90,
        170,
        NULL,
        NULL,
        hInstance,
        NULL);


    HWND hButton1 = CreateWindow(_T("button"), _T("OK"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
        10,//x
        90,//y
        80,//width
        30,//height
        hChildWnd,
        (HMENU)300,//id кнопки
        hInstance, NULL);


    ShowWindow(hChildWnd, SW_HIDE);
    UpdateWindow(hChildWnd);



    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

但是我無法在WndProc1處理此click事件。 WndProc中也是如此。 我的調試器只是繞過我的WM_COMMAND case條目。 也許我用錯誤的名稱注冊了課程? 不,我復制粘貼了它們。 我用谷歌搜索,但沒有找到答案。 請幫忙。

從MSDN WM_COMMAND

lParam表示控制窗口的句柄,對於菜單或加速器,其值為0。

您應該使用LOWORD (wparam)來獲取命令ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM