Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Внешний вид checkbox'a 
:(
    Опции темы
rainbow86
Дата 25.12.2005, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Есть checkbox вот с такими стилями BS_AUTOCHECKBOX|WS_TABSTOP|BS_FLAT
Вроде бы всё нормально, но никак не удаётся поменять цвет рамки вокруг него.
Сейчас он черный, а мне нужен синий.
Нашел только FrameRect, для закрашивания области вокруг прямоугольника, но по моему там все проще.
Может кто подскажет как?
smile
PM MAIL   Вверх
Aleksandor
Дата 25.12.2005, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



Ничего не приходит в голову кроме как рисовать кнопку самому smile
-1.
Рисуешь в Фотошопе 2 битмапа нужного размера и цвета - один для чекбокса без галочки и другой с галочкой или чем хочешь smile Сохраняешь в файлы checked.bmp и unchecked.bmp

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!!
PM MAIL   Вверх
rainbow86
Дата 25.12.2005, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Спасибо, счас попробую!
PM MAIL   Вверх
subzer0
Дата 24.8.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.7.2006
Где: Питер

Репутация: нет
Всего: нет



А можно сделать так, чтобы состояние checked/unchecked от чекбоксов с BS_OWNERDRAW, можно было получать обычным способом?
PM MAIL   Вверх
Fixin
Дата 25.8.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



А как выглядит "необычный"?
PM MAIL ICQ   Вверх
subzer0
Дата 26.8.2006, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.7.2006
Где: Питер

Репутация: нет
Всего: нет



Обычный:

CheckDlgButton(hWnd,IDC_CHECKBOX1,BST_CHECKED);

IsDlgButtonChecked(hWnd,IDC_CHECKBOX1);

Это сообщение отредактировал(а) subzer0 - 26.8.2006, 02:09
PM MAIL   Вверх
subzer0
Дата 26.8.2006, 05:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.7.2006
Где: Питер

Репутация: нет
Всего: нет



Ладно, чёрт с ним с состоянием - проще в переменную записать.

Другая проблема: Написал ф-ию для смены внешнего вида чекбоксов. Но работает как-то через раз. Картинка меняется только со второго раза. Например если два чекбокса и я нажал на первый, то когда я жму на второй меняется картинка на первом, а потом уже при повторном нажатии - на втором.
Код

void RedrawCtl (int ctl, HBITMAP destImage)
{
    HWND hCtlWnd = GetDlgItem(hDlg,ctl);
    HDC hdc,hmdc;
    BITMAP bm;

    hdc = GetWindowDC(hCtlWnd);
    hmdc = CreateCompatibleDC(hdc);
    
    SelectObject(hmdc,destImage);
    GetObject(destImage,sizeof(bm),(LPSTR)&bm);

    BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hmdc,0,0,SRCCOPY);
    
    DeleteDC(hmdc);
    ReleaseDC(hCtlWnd,hdc);
}
Подскажите где я ошибся? smile 
PM MAIL   Вверх
GremlinProg
Дата 26.8.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Ошибся в самом подходе прорисовки. Напрямую перерисовывать контрол бессмысленно, установи ownerdraw флаг и перехватывай WM_DRAWITEM у диалога. Так ты получишь возможность обновить контрол в момент изменения состояния чекбокса.

Добавлено @ 10:19 
Вот, кстати, Aleksandor, о WM_DRAWITEM уже упоминал


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
subzer0
Дата 26.8.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.7.2006
Где: Питер

Репутация: нет
Всего: нет



Именно так я и пытался делать. Но проблема в том, что когда я пишу свой RedrawCtl() внутри WM_DRAWITEM он косячит. А если прописать эту ф-ию по WM_COMMAND (клик на чекбоксе), то всё работает нормально.
PM MAIL   Вверх
GremlinProg
Дата 26.8.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Тогда непонятно следующее:
Код

hdc = GetWindowDC(hCtlWnd);
...
ReleaseDC(hCtlWnd,hdc);

Зачем открывать девайс?
WM_DRAWITEM уже передает корректный девайс. В твоем случае, RedrawCtl нужно передать hdc в списке параметров, а не открывать его внутри функции.
Покажи обработку WM_DRAWITEM.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
subzer0
Дата 27.8.2006, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.7.2006
Где: Питер

Репутация: нет
Всего: нет



Код

case WM_DRAWITEM:
RedrawCtl(IDC_CHECK1,stateCheck1?hbmpChecked:hbmpUnchecked);
RedrawCtl(IDC_CHECK2,stateCheck2?hbmpChecked:hbmpUnchecked);
break;

PM MAIL   Вверх
GremlinProg
Дата 27.8.2006, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 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 
прототип должен выглядеть так:
Код

void RedrawCtl (int ctl, HBITMAP destImage,HDC hdc);

а WM_DRAWITEM так:
Код

DRAWITEMSTRUCT&ds    = *(DRAWITEMSTRUCT*)lParam;
switch(ds.CtlID){
    case IDC_CHECK1:
        RedrawCtl(IDC_CHECK1,(ds.itemState&ODS_CHECKED?hbmpChecked:hbmpUnchecked),ds.hDC);
        break;
    case IDC_CHECK2:
        RedrawCtl(IDC_CHECK2,(ds.itemState&ODS_CHECKED?hbmpChecked:hbmpUnchecked),ds.hDC);
        break;
}



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.