Как и в комментариях к комбинату, подходит как static
member и SetWindowLongPtr
.
Вот пример декларации класса, который определяет статическую WindowProc
как функцию-член.
class MyClass
{
public:
void MainThreadProc();
private:
static LRESULT CALLBACK WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT _WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};
Метод MainThreadProc создаст окно. Обязательно перейдите в this
в CreateWindowEx
, так как вы получите доступ к своим ученикам.
void MyClass::MainThreadProc()
{
MSG msg;
HINSTANCE hinstance = GetModuleHandle (NULL);
WNDCLASSEX wcx = {0};
HWND hwnd = NULL;
wcx.cbSize = sizeof wcx;
wcx.hInstance = hinstance;
wcx.hCursor = LoadCursor (NULL, IDC_NO);
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wcx.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wcx.lpfnWndProc = WindowProc;
wcx.lpszClassName = L"MyWindowClass";
RegisterClassEx (&wcx);
hwnd = CreateWindowEx (WS_EX_APPWINDOW,
L"MyWindowClass",
L"MyWindow",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hinstance,
this);
ShowWindow (hwnd, SW_SHOWDEFAULT);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
В WindowProc
вы храните this
объект, используя SetWindowLongPtr
для будущего использования.
LRESULT MyClass::WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (WM_NCCREATE == uMsg)
{
SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR) ((CREATESTRUCT*) lParam)->lpCreateParams);
return TRUE;
}
return ((MyClass*) GetWindowLongPtr (hwnd, GWLP_USERDATA))->_WindowProc (hwnd, uMsg, wParam, lParam);
}
И для полноты, вот последняя функция члена для обработки оконных сообщений, и вы будете иметь доступ ко всем членам класса в этой точке.
LRESULT MyClass::_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage (S_OK);
break;
default:
return DefWindowProc (hwnd, uMsg, wParam, lParam);
}
return 0;
}
Это может быть статическая функция-член, а не то, что она помогает. Существует множество разных трюков для связывания экземпляра класса с дескриптором «HWND» - см., Например, ['SetProp'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633568.aspx) или' SetWindowLongPtr' –
Элементы-члены 'static' могут использоваться как функции обратного вызова без особых усилий , Создание функции 'non-static' member как функции обратного вызова требует создания функций-оболочек. –
hmm okay. Ну, в основном, он получает доступ к ширине и высоте, после чего, без необходимости делать некоторые уродливые работы с использованием глобальных переменных. Я хочу создать компактный и инкапсулированный класс окон –