Пользовательское окно proc в отдельном файле - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я изучаю winapi и хотел бы получить несколько советов о том, как настроить пользовательский элемент управления с помощью различных оконных процедур.

Допустим, у меня 20 кнопок.Я хочу, чтобы каждая кнопка реагировала по-разному, когда на нее наведена мышь.Скажем, кнопка «Выход» рисует красный прямоугольник при наведении или синий при наведении какой-либо другой кнопки.

Итак, я настроил пользовательскую процедуру управления, которая обрабатывает щелчки мыши, наведение мыши и т. Д.,и хранится в custom.cppmain.cpp есть MainProc(), который "связывает / назначает" hwndButton на ButtonProc(), используя

CustomProcHandler = (WNDPROC)SetWindowLong(hwndButton, GWL_WNDPROC, (long)CustomProc)

main.h:

#include <windows.h>
#include <iostream>
using namespace std;

const char g_szClassName[] = "Applicaton";
static HWND hwnd, hwndButton;
static HINSTANCE hInst;
static WNDPROC buttonProcHandler;


LRESULT CALLBACK MainProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ButtonProc(HWND, UINT, WPARAM, LPARAM);

main.cpp:

#include "main.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine, int nCmdShow){
    WNDCLASSEX wc;
    MSG msg;

    hInst = hInstance;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(hInst, 0);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(20, 20, 20));
    wc.lpszMenuName = 0;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm = LoadIcon(hInst, 0);
    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 600, 400,
        NULL, NULL, hInst, NULL);

    ShowWindow(hwnd, 1);
    UpdateWindow(hwnd);

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

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
        case WM_CREATE:
            button = CreateWindow("button", 0, WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 10, 10, 32, 32, hwnd, 0, hInst, 0);
            buttonProcHandler = (WNDPROC)SetWindowLong(hwndButton, GWL_WNDPROC, (long)ButtonProc);
            break;
        case WM_MOUSEMOVE:
            break;
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default: 
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

custom.cpp:

#include "main.h"

LRESULT CALLBACK ButtonProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
        case WM_CREATE:
            break;
        case WM_MOUSEMOVE:
            break;
        case WM_LBUTTONDOWN:
            break;
        default:
            return CallWindowProc(buttonProcHandler, hwnd, msg, wParam, lParam);
    }
    return 0;
}

Проблема в том, что кнопка исчезает ... но когда я перемещаю buttonProc() внутрь main.cpp, тогда все работает нормально.

Итак, я предполагаю, что сделал что-то не так, когда объявлял глобальные переменные, такие как static WNDPROC buttonProcHandler.

Я знаю, что я делаю, это совершенно неправильно, и что есть лучший способ сделать это.Я просто не знаю, что это такое.

Может кто-нибудь может помочь / научить меня стандартному способу создания пользовательских процедур?

...