Создание контрола Win32 API

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Создание контрола Win32 API

Сообщение SLIM » 04.07.2011 (Пн) 19:56

Интересно поупражняться и глубже узнать WinAPI
Хочу попробовать понять как пишутся контролы 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).

Дальше будем пробовать что-нибудь путевое сделать.

Есть какие-нибудь замечания?
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Создание контрола Win32 API

Сообщение Хакер » 04.07.2011 (Пн) 23:30

SLIM писал(а):либо зарегистрировать сообщения контрола в системе и обрабатывать\слать их

Не нужно ничего регистрировать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Создание контрола Win32 API

Сообщение SLIM » 05.07.2011 (Вт) 20:10

Хакер писал(а):Не нужно ничего регистрировать.

А если необходимо будет использовать сообщение глобально а не только в проекте?
Сообщение может быть не уникально в системе в общем.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Создание контрола Win32 API

Сообщение Хакер » 05.07.2011 (Вт) 20:14

SLIM писал(а):А если необходимо будет использовать сообщение глобально а не только в проекте?

Что значит глобально, и что значит только в проекте? Что такое проект? Windows не определяет такого понятия.

SLIM писал(а):Сообщение может быть не уникально в системе в общем.

И что в этом плохого?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Создание контрола Win32 API

Сообщение SLIM » 05.07.2011 (Вт) 21:26

Ну например...
Например что будет если в следующих версиях Windows будет больше сообщений, и какое-то совпадет с твоим самописным?
Могут также возникнуть проблемы с субклассингом наверное.
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Создание контрола Win32 API

Сообщение SLIM » 05.07.2011 (Вт) 21:26

А в остальном, по делу, подскажи.
Начало хоть верное?
Пишите жизнь на чистовик.....переписать не удастся.....

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Создание контрола Win32 API

Сообщение iGrok » 05.07.2011 (Вт) 21:34

SLIM писал(а):Например что будет если в следующих версиях Windows будет больше сообщений, и какое-то совпадет с твоим самописным?

http://msdn.microsoft.com/en-us/library/ms644931.aspx

UPD: Пофиксил ссыль.
Последний раз редактировалось iGrok 06.07.2011 (Ср) 0:02, всего редактировалось 1 раз.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Создание контрола Win32 API

Сообщение Хакер » 05.07.2011 (Вт) 22:04

SLIM писал(а):Например что будет если в следующих версиях Windows будет больше сообщений, и какое-то совпадет с твоим самописным?
Могут также возникнуть проблемы с субклассингом наверное.

Во-первых, те два диапазона, которые выделены программистам, никогда не будут использованы подо что-то не-класс-специфичное. А в том, что 100 разных класс-специфичных сообщений имеют один и тот же код нет ничего плохого.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Создание контрола Win32 API

Сообщение SLIM » 05.07.2011 (Вт) 22:14

iGrok писал(а):http://msdn.microsoft.com/en-us/library ... 31(v=vs.85).aspx

ы?
Хакер писал(а):Во-первых, те два диапазона, которые выделены программистам, никогда не будут использованы подо что-то не-класс-специфичное. А в том, что 100 разных класс-специфичных сообщений имеют один и тот же код нет ничего плохого.

Ну по большому счету конечно особой необходимости нет, не спорю. Но...не знаю, так правильней что ли. Был ведь заложен подобный функционал в Win32 API. Почему?
Пишите жизнь на чистовик.....переписать не удастся.....

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Создание контрола Win32 API

Сообщение iGrok » 06.07.2011 (Ср) 0:04

SLIM писал(а):ы?

Не "ы", а то же, что написал Хакер:
Хакер писал(а):те два диапазона, которые выделены программистам, никогда не будут использованы подо что-то не-класс-специфичное

Только на инглише, и на мсдн.

SLIM писал(а):Был ведь заложен подобный функционал в Win32 API. Почему?

Какой ещё "подобный"? Регистрация сообщений - это совсем другое.
label:
cli
jmp label

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Создание контрола Win32 API

Сообщение SLIM » 06.07.2011 (Ср) 0:16

iGrok писал(а):Какой ещё "подобный"? Регистрация сообщений - это совсем другое.

А конкретно?
Пишите жизнь на чистовик.....переписать не удастся.....

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Создание контрола Win32 API

Сообщение iGrok » 06.07.2011 (Ср) 0:31

А что конкретно-то? Ты ведь про RegisterWindowMessage? Там достаточно прочитать её описание (или хотя бы даже "список" параметров), чтобы понять, что она предназначена совсем не для "регистрации сообщений контрола в системе".

Или ты про какую-то иную "регистрацию"?
label:
cli
jmp label

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Создание контрола Win32 API

Сообщение SLIM » 06.07.2011 (Ср) 6:02

iGrok писал(а):А что конкретно-то? Ты ведь про RegisterWindowMessage? Там достаточно прочитать её описание (или хотя бы даже "список" параметров), чтобы понять, что она предназначена совсем не для "регистрации сообщений контрола в системе".

Или ты про какую-то иную "регистрацию"?


Про нее. Оно насколько я понял не регистрирует а как бы генерирует уникальное.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Создание контрола Win32 API

Сообщение Хакер » 06.07.2011 (Ср) 7:58

SLIM писал(а):Про нее. Оно насколько я понял не регистрирует а как бы генерирует уникальное.

Она регистрирует факт занятости. Но нужно это для message-based IPC, контролы здесь не причём.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList