![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| rainbow86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.10.2005 Репутация: нет Всего: нет |
Есть checkbox вот с такими стилями BS_AUTOCHECKBOX|WS_TABSTOP|BS_FLAT
Вроде бы всё нормально, но никак не удаётся поменять цвет рамки вокруг него. Сейчас он черный, а мне нужен синий. Нашел только FrameRect, для закрашивания области вокруг прямоугольника, но по моему там все проще. Может кто подскажет как? |
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Ничего не приходит в голову кроме как рисовать кнопку самому
-1. Рисуешь в Фотошопе 2 битмапа нужного размера и цвета - один для чекбокса без галочки и другой с галочкой или чем хочешь 0. Определяешь в файле ресурсов 2 битмапа - IDB_BITMAP1 BITMAP MOVEABLE PURE "Bitmaps\\checked.bmp" IDB_BITMAP2 BITMAP MOVEABLE PURE "Bitmaps\\unchecked.bmp" 1. в начале программы загружаешь битмапы static HBITMAP hbmChecked = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP1)); static HBITMAP hbmUncheked = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP2)); и создаешь кнопку hwndButtonCheck = CreateWindow("BUTTON","", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, size_x-60, top_margin+47, 58, 37, hwndOutput, (HMENU) ID_BUTTON1, hInst, NULL); ...или просто добавляешь стиль BS_OWNERDRAW к кнопке если она в диалоге 2. в оконной процедуре в ответ на сообщения WM_DRAWITEM рисуешь битмапы функцией StretchBlt 3. очистка в конце программы DeleteObject(hbmChecked); DeleteObject(hbmUncheked); -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| rainbow86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.10.2005 Репутация: нет Всего: нет |
Спасибо, счас попробую!
|
|||
|
||||
| subzer0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 14.7.2006 Где: Питер Репутация: нет Всего: нет |
А можно сделать так, чтобы состояние checked/unchecked от чекбоксов с BS_OWNERDRAW, можно было получать обычным способом?
|
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
А как выглядит "необычный"?
|
|||
|
||||
| subzer0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 14.7.2006 Где: Питер Репутация: нет Всего: нет |
Обычный:
CheckDlgButton(hWnd,IDC_CHECKBOX1,BST_CHECKED); IsDlgButtonChecked(hWnd,IDC_CHECKBOX1); Это сообщение отредактировал(а) subzer0 - 26.8.2006, 02:09 |
|||
|
||||
| subzer0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 14.7.2006 Где: Питер Репутация: нет Всего: нет |
Ладно, чёрт с ним с состоянием - проще в переменную записать.
Другая проблема: Написал ф-ию для смены внешнего вида чекбоксов. Но работает как-то через раз. Картинка меняется только со второго раза. Например если два чекбокса и я нажал на первый, то когда я жму на второй меняется картинка на первом, а потом уже при повторном нажатии - на втором.
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Ошибся в самом подходе прорисовки. Напрямую перерисовывать контрол бессмысленно, установи ownerdraw флаг и перехватывай WM_DRAWITEM у диалога. Так ты получишь возможность обновить контрол в момент изменения состояния чекбокса.
Добавлено @ 10:19 Вот, кстати, Aleksandor, о WM_DRAWITEM уже упоминал -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| subzer0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 14.7.2006 Где: Питер Репутация: нет Всего: нет |
Именно так я и пытался делать. Но проблема в том, что когда я пишу свой RedrawCtl() внутри WM_DRAWITEM он косячит. А если прописать эту ф-ию по WM_COMMAND (клик на чекбоксе), то всё работает нормально.
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Тогда непонятно следующее:
Зачем открывать девайс? WM_DRAWITEM уже передает корректный девайс. В твоем случае, RedrawCtl нужно передать hdc в списке параметров, а не открывать его внутри функции. Покажи обработку WM_DRAWITEM. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| subzer0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 14.7.2006 Где: Питер Репутация: нет Всего: нет |
|
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Вот об этом я как раз и говорил. Используй члены структуры DRAWITEMSTRUCT:
https://msdn.microsoft.com/library/default....witemstruct.asp для сообщения WM_DRAWITEM: https://msdn.microsoft.com/library/default....wm_drawitem.asp Добавлено @ 09:44 прототип должен выглядеть так:
а WM_DRAWITEM так:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |