Visual C++ - Кнопки в заголовке окна
Требования: 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);
Скачать исходниый текст программы - 42 Kb