Хочу попробовать понять как пишутся контролы Win32 API.
Начал вот с чего.
Что есть контрол. Это окно. Для создания окна необходимо вызвать функцию CreateWindow(Ex)
Одним из параметров данной функции является строковой параметр - класс окна.
Класс окна в принципе может быть любым. Но есть зарегестрированные классы окон (такие как EDIT, STATIC и т.д., некоторые регистрируются дополнительно, например с помощью функции InitCommonControls()). Регистрация окна в системе осуществляется вызовом функции RegisterClass(Ex), параметром которой является структура WNDCLASS(EX).
В данной структуре содержатся описания окна - курсоры, иконки, стили и определение оконной функции.
Итак. Для начала необходимо зарегистрировать свой класс окна.
- Код: Выделить всё
void InitControl ()
{
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = ControlWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = GetModuleHandle (NULL);
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = pszWindowName;
RegisterClass(&wndclass);
}
После вызова этой функции можно создавать окна с именем класса pszWindowName.
Осталось реализовать оконную функцию ControlWndProc для контрола. В ней то и будет описываться все поведение контрола, наполнение его данными.
- Код: Выделить всё
LRESULT CALLBACK ControlWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC l_hAppDC;
PAINTSTRUCT l_ps;
static RECT l_rect;
switch (uMsg)
{
case WM_PAINT:
{
GetClientRect(hWnd, &l_rect);
l_hAppDC = BeginPaint(hWnd, &l_ps);
EndPaint(hWnd, &l_ps);
break;
}
default:
return DefWindowProc(hWnd, uMsg,wParam,lParam);
}
return 0;
}
Для работы с контролом необходимо будет написать кучу функций, либо зарегистрировать сообщения контрола в системе и обрабатывать\слать их
В принципе все, до чего я дошел пока.
Да. С каждым контролом может быть связана какая-нибудь информация. Например цвета кисти, какие-то строки, какие-то данные.
Все это можно поместить в структуру CREATESTRUCT, и передавать указатель на нее в CreateWindow(Ex). Получить эту структуру можно в оконной процедуре контрола при обработке WM_NCCREATE (до WM_CREATE).
Дальше будем пробовать что-нибудь путевое сделать.
Есть какие-нибудь замечания?