Кнопки в заголовке окна
Автор: Anish Mistry.
Требования: VC6 SP4, W2K SP1 - Может не работать в
Win95 с DirectX :).
Здесь представлен класс под названием CCaptionButton,
задача которого упростить создание кнопок
в заголовке окна. Изначально была идея заменить
существующие привычные кнопки (Minimize,
Maximize,Close), но было решено пойти более творческим
путём, и использовать битмапы, которые
позволяли бы создавать свой собственный
уникальный интерфейс.
Возможности:
- Подсказки
- Динамическое изменение
- Динамическое добавление
- Динамическое удаление
- Уведомление о нажатии
- Гибкий дизайн
Вот небольшой пример создания кнопок при
помощи класса CCaptionButton:
// объявляем переменную класса
CCaptionButton cbExtra;
// подкласс окна
cbExtra.Init(hWnd);
// устанавливаем тип заголовка CB_APPWINDOW/CB_TOOLWINDOW
cbExtra.SetCaptionType(CB_APPWINDOW);
// какой тип окна CB_SDIMDI/CB_DIALOG
cbExtra.SetWindowType(CB_SDIMDI);
// устанавливаем количество заголовков (Minimize/Maximize/Close)
cbExtra.SetNumOfDefaultCaptions(3);
// устанавливаем прозрачный цвет картинок
COLORREF crTransparent = RGB(255,0,255);
cbExtra.SetTransparentColor(crTransparent);
// устанавливаем bitmap который будет отображаться
cbExtra.SetSelectionBitmap((HBITMAP)LoadImage(hInstance,
MAKEINTRESOURCE(IDB_SELECTION),
IMAGE_BITMAP,
0,0,
LR_LOADMAP3DCOLORS | LR_DEFAULTCOLOR));
// создаём bitmaps при наведении мышки (можно конечно загружать его
// напрямую, но данный способ экономит память)
HBITMAP hMouseOverBitmap = (HBITMAP)LoadImage(hInstance,
MAKEINTRESOURCE(IDB_MOUSEOVER),
IMAGE_BITMAP,
0,0,
LR_LOADMAP3DCOLORS | LR_DEFAULTCOLOR);
// кнопка AM Productions
HBITMAP hCaptionAMBitmap = (HBITMAP)LoadImage(hInstance,
MAKEINTRESOURCE(IDB_BITMAP_AM),
IMAGE_BITMAP,
0,0,
LR_LOADMAP3DCOLORS | LR_DEFAULTCOLOR);
HBITMAP hCaptionAMBitmapHilite =
CCaptionButton::CombineBitmaps(hCaptionAMBitmap,
hMouseOverBitmap,
crTransparent);
// кнопка 2
HBITMAP hCaption2Bitmap = (HBITMAP)LoadImage(hInstance,
MAKEINTRESOURCE(IDB_BITMAP2),
IMAGE_BITMAP,
0,0,
LR_LOADMAP3DCOLORS | LR_DEFAULTCOLOR);
HBITMAP hCaption2BitmapHilite =
CCaptionButton::CombineBitmaps(hCaption2Bitmap,
hMouseOverBitmap,
crTransparent);
// кнопка 3
HBITMAP hCaption3Bitmap = (HBITMAP)LoadImage(hInstance,
MAKEINTRESOURCE(IDB_BITMAP3),
IMAGE_BITMAP,
0,0,
LR_LOADMAP3DCOLORS | LR_DEFAULTCOLOR);
HBITMAP hCaption3BitmapHilite =
CCaptionButton::CombineBitmaps(hCaption3Bitmap,
hMouseOverBitmap,
crTransparent);
// создаём кнопку с ID = 1, битмап для наведения мышки для
// hCaptionAMBitmapHilite, нормальный bitmap для hCaptionAMBitmap,
// и текст подсказки "AM Productions - Visit Now!"
cbExtra.New(1,hCaptionAMBitmapHilite,hCaptionAMBitmap,
"AM Productions - Visit Now!");
cbExtra.New(2,hCaption2BitmapHilite,hCaption2Bitmap,"Caption 2");
cbExtra.New(3,hCaption3BitmapHilite,hCaption3Bitmap,"Caption 3");
// загружаем их напрямую из ресурсов
cbExtra.New(4,
(HBITMAP)LoadImage(hInstance,
MAKEINTRESOURCE(IDB_BITMAP5),
IMAGE_BITMAP,
0,0,
LR_LOADMAP3DCOLORS | LR_DEFAULTCOLOR),
(HBITMAP)LoadImage(hInstance,
MAKEINTRESOURCE(IDB_BITMAP6),
IMAGE_BITMAP,
0,0,
LR_LOADMAP3DCOLORS | LR_DEFAULTCOLOR),
"Caption 4");
Так же возникает вопрос, как узнать была ли
нажата кнопка ? Ответ: если на кнопке кликнуть, то
вызывается событие WM_CBLBUTTONCLICKED и посылается окну
с кнопкой. WPARAM этого сообщения содержит ID кнопки,
которая была нажата, а LPARAM содержит структуру POINT
с координатами курсора (если вам понадобится
отображать всплывающее меню).
Для того, чтобы добавить кнопку достаточно
вызвать функцию New(), только не забудьте в
качестве пятого параметра указать номер места
расположения кнопки (справа на лево). Так же не
сложно изменять существующие кнопки.
// изменяем кнопку
cbExtra.Replace(nCurrentCaptionID,
nNewCaptionID,
hNewMouseoverBitmap,
hNewNormalBitmap,
pNewToolTipText);
И, соответственно удалять их.
// удаление кнопки
cbExtra.Delete(nCurrentCaptionID);
Downloads
Скачать демонстрашку и
исходник - 42 Kb
|