Форум программистов CodeGuru
23 Июль 2018, 09:51:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание своего control'а  (Прочитано 18140 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ShumiArrow
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« : 23 Июль 2006, 20:28:18 »

Добрый день!
Народ, если есть возможность, то не могли бы вы либо посоветовать какие книги почитать, либо помочь разобраться с самой темой.

Очень интересно было бы узнать: Как писать свои контроллы с самого нуля.

То есть написать, например, свою кнопку. Но не через наследование, а через создание всех ее частей: Свойств, методов, событий. Больше всего интересуют события.
Но не просто events, а системные события, типа: Click(). Как это все создается?

С уважением,
Михаил
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 24 Июль 2006, 23:56:41 »

Если в очень общих чертах, то...

Кнопка - это окно windows (как и все остальные контролы).
Каждому окну сопоставлена оконная процедура, обрабатывающая сообщения, поступающие окну.
Оконная процедура указывается при регистрации класса окна (это не C++ класс). В windows есть понятие "класс окна". Он регистрируется функцией RegisterClass или RegisterClassEx. Этим функциям передается структура WNDCLASS или WNDCLASSEX, соответственно:
Код:

typedef struct {
   UINT style;
   WNDPROC lpfnWndProc;
   int cbClsExtra;
   int cbWndExtra;
   HINSTANCE hInstance;
   HICON hIcon;
   HCURSOR hCursor;
   HBRUSH hbrBackground;
   LPCTSTR lpszMenuName;
   LPCTSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;

typedef struct {
   UINT cbSize;
   UINT style;
   WNDPROC lpfnWndProc;
   int cbClsExtra;
   int cbWndExtra;
   HINSTANCE hInstance;
   HICON hIcon;
   HCURSOR hCursor;
   HBRUSH hbrBackground;
   LPCTSTR lpszMenuName;
   LPCTSTR lpszClassName;
   HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;


В поле lpfnWndProc - как раз должен быть адрес оконной процедуры.
В lpszClassName - имя класса окна (произвольное).

Затем окно данного класса может быть создано функцией CreateWindow:
Код:
HWND CreateWindow(
   LPCTSTR lpClassName,
   LPCTSTR lpWindowName,
   DWORD dwStyle,
   int x,
   int y,
   int nWidth,
   int nHeight,
   HWND hWndParent,
   HMENU hMenu,
   HINSTANCE hInstance,
   LPVOID lpParam
);


Как видите, первым параметром (lpClassName) как раз надо указать имя класса окна, зарегестрированного до этого при помощи RegisterClass или RegisterClassEx.
Windows создаст окно с характеристиками, указанными в полях структуры при регистрации класса окна.

Далее, в оконную функцию будут поступать сообщения. В частности, WM_PAINT (при обработке которого надо отрисовывать содержимое окошка - если рисуем кнопку, то  - кнопку, и.т.д.). Будут поступать сообщения пользовательского ввода (от мыши, клавиатуры). на них надо так же соответствующим образом реагировать (изменять внутреннее состояние, перерисовывать свой элемент управления).

Это так - в общих чертах.
Если надо, напишу подробнее.
Я писал свои контролы (правда, использовал MFC - так удобнее). Но можно и с помощью API только.

Вобщем, контрол написать не так уж и сложно.
Надо только продумать логику его работы.
Записан

ShumiArrow
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« Ответ #2 : 25 Июль 2006, 17:40:41 »

Огромное спасибо, 3V!

Но если несложно, то не могли бы вы мне прислать на ящик или как-нибудь показать проект по созданию своего контрола. Уж очень это интересная тема.
Мне, правда, все твердят: "Не надо писать свои контролы и так все написаны!". Но я считаю, что не зная сути как все работает, лучше ничего не писать. Поэтому и прошу помощи в понимании написания своего контролла.
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #3 : 26 Июль 2006, 23:17:31 »

Тот контрол, что я дописал до конца, к сожалению, используется в коммерческом проекте. Его исходники я не имею права распространять Грустный
Начинал писать другой контрол (ruler) - как в VC 6.0 в редакторе ресурсов, но его до конца не довел.
Думаю, скоро напишу статью на данную тему (создание контролов) для одной из своих рассылок. Там выложу что знаю по этому поводу.
Для нее как обычно будет тестовый пример (к нему приступлю сегодня-завтра) - вот его Вам и зашлю тогда. Еще если откопаю старые исходники ruler-а - тоже зашлю.
Записан

ShumiArrow
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« Ответ #4 : 27 Июль 2006, 18:40:24 »

Еще раз Большущее СПАСИБО!!!

Надеюсь на скорое появление статьи =))

Просто все знают как это делается, но нормальной статьи пока еще не видел.

С уважением,
Михаил

(Добавление)
Кстати, благодаря другой теме: нашел хорошую информацию о создании контролов
http://www.firststeps.ru/mfc/steps/
Для самого начала, как мне кажется, подойдет.=)

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!