Я искал создание пользовательского элемента управления с помощью WinApi для моего приложения, и я создал класс, который содержит функции CustomDialogProc
и CreateWindowEx
и RegisterClass()
.Do CustomDialogProc должен быть статичным. WinAPI
Я могу установить контрольную точку внутри CustomDialogProc
, и она попадает, поэтому класс зарегистрирован правильно.
Однако, я должен объявить функцию CustomDialogProc как статические INT он заголовок моего класса
static LRESULT CALLBACK CustomDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam,LPARAM lParam);
Если я не ставлю его статичным, я получаю ошибку
Error C3867 'CustomControl::CustomDialogProc': non-standard syntax; use '&' to create a pointer to member
И.С. это необходимо, это требует, чтобы все мои элементы управления, созданные в этом элементе управления, также были статическими. Что делать, если я хочу несколько экземпляров этого элемента управления? Как я могу обойти это? Основной MsgProc не является статической функцией. Также нет UpDownDialogProc
в первой ссылке, приведенной ниже
Ниже приведен мой код для CustomControl.h, если кому-то это понадобится. Соединенный из кода находится по адресу: https://msdn.microsoft.com/en-us/library/windows/desktop/hh298353(v=vs.85).aspx https://www.codeproject.com/Articles/485767/True-Windows-control-subclassing
Спасибо,
#pragma once
#include <windows.h>
#include <commctrl.h>
#pragma comment(lib, "comctl32.lib")
class CustomControl
{
public:
CustomControl();
~CustomControl();
LRESULT CALLBACK CustomDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
//DO STUFF HERE
break;
}
}
bool CreateControl(HWND hwnd, HINSTANCE* m_hApp_instance)
{
g_hInst = m_hApp_instance;
RegisterSubClass(*g_hInst, WC_LISTBOX, TEXT("CustomControl"), CustomDialogProc);
HWND hwndCustom = CreateWindow(TEXT("CustomControl"), NULL, WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hwnd, (HMENU)100, *g_hInst, NULL);
return true;
}
private:
HINSTANCE* g_hInst;
WNDPROC RegisterSubClass(HINSTANCE hInstance, LPCTSTR ParentClass, LPCTSTR ChildClassName, WNDPROC ChildProc) {
WNDCLASSEX twoWayStruct;
WNDPROC parentWndProc;
if (GetClassInfoEx(NULL, ParentClass, &twoWayStruct)) {
parentWndProc = twoWayStruct.lpfnWndProc; // save the original message handler
twoWayStruct.cbSize = sizeof(WNDCLASSEX); // does not always get filled properly
twoWayStruct.hInstance = hInstance;
twoWayStruct.lpszClassName = ChildClassName;
twoWayStruct.lpfnWndProc = ChildProc;
/* Register the window class, and if it fails return 0 */
if (RegisterClassEx(&twoWayStruct))
return parentWndProc; // returns the parent class WndProc pointer;
// subclass MUST call it instead of DefWindowProc();
// if you do not save it, this function is wasted
}
return 0;
}
};
DialogProcs (и аналогичные обратные вызовы) не могут быть нестационарными функциями-членами, поскольку их необходимо передать API-интерфейсам C, которые не понимают таких вещей. –
Поскольку у вас установлена Visual Studio, вы должны прочитать исходный код MFC. Это одна из немногих реализаций, которые получают это право (в принятом ответе нет). – IInspectable
Честно говоря, написание хорошей оболочки Windows API - это работа на полный рабочий день. Это не то, что можно легко ударить. API достаточно сложный со всеми видами завихрений и поворотов, и если вы не знаете C++ достаточно (достаточно, чтобы быть хотя бы близко к продвинутому уровню), это само по себе является препятствием для поднятия. – PaulMcKenzie