Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
PavelT100
0 / 0 / 0
Регистрация: 21.10.2008
Сообщений: 62
#1

Какое сообщение надо обработать для отрисовки фона TabCtrl? - C++

16.08.2011, 15:02. Просмотров 897. Ответов 3
Метки нет (Все метки)

Для отрисовки фона STATIC контролов надо обрабатывать сообщение WM_CTLCOLORSTATIC, для кнопок WM_CTLCOLORBTN.
А какое сообщение надо обработать для отрисовки фона TabCtrl ?
Я проверил все сообщения от WM_CTLCOLORMSGBOX до MN_GETHMENU — ничего не получается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2011, 15:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какое сообщение надо обработать для отрисовки фона TabCtrl? (C++):

какое сообщение для ComboBox-а обрабатывать? - C++
Здравствуйте. У меня есть диалоговое окно и в нем ComboBox. При выборе одного из элементов этого ComboBox-а мне необходимо автоматически...

За какое минимальное время роботы смогут обработать данное количество деталей? - C++
Всем добрый вечер. Есть такая задача: На некотором заводе решили модернизировать производство и закупили для этого роботов. Так как для...

когда вводится нуль,то программа не работает,нужно добавитть еще какое-то условие для нуля ,но я не знаю какое - C++
В массиве целых чисел найти количество чисел с наименьшим ко-личеством цифр. Например, в массиве {123, 34, 56, 1000, 20, 55000, 777, 11}...

как работает функция отрисовки фона картинки - Графика и игры
расскажите пожалуйста как работает эта функция void SetAlpha(AUX_RGBImageRec *image) { int w=image->sizeX; int h=image->sizeY;...

Какое сообщение для окна использовать? - C++ WinAPI
Здравствуйте, у меня такая проблема,я сделал оконное приложение,которое считывает координаты мыши.Считывание происходит следующим путем -...

Какое максимальное число строк может обработать Fasm? - Assembler
Столкнулся с глюком набрал много 3240 строк в fasm. И произошел глюк. Прога запустилась но последние строки не выполнились. Я уменьшил на...

3
PavelT100
0 / 0 / 0
Регистрация: 21.10.2008
Сообщений: 62
17.08.2011, 09:58  [ТС] #2
Вот что я сделал:
создал TabCtrl со стилями WS_VISIBLE|TCS_SINGLELINE|0x0040|TCS_FOCUSNEVER|TCS_OWNERDRAWFIXED и идентификатором idsOng1

В функции родительского MDI окна (контрол у меня находтится в MDI окне) обрабатываю сообщение WM_DRAWITEM:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    case WM_DRAWITEM:
        if(msg.wParam == idsOng1)
        {
        TMDIChild::Go(msg); // это наши заморочки - это значит что выполняется стандартный обработчик
         LPDRAWITEMSTRUCT lpDrawItem = (LPDRAWITEMSTRUCT) msg.lParam;
        RECT rect = lpDrawItem->rcItem;
        rect.top += ::GetSystemMetrics(SM_CYEDGE);
 
            SetBkMode(lpDrawItem->hDC, TRANSPARENT);
            FillRect(lpDrawItem->hDC, &rect, gD.Brush(clrWindow)); //вот это выполняется и закрашивает 
//нужным цветом, но к сожалению только закладку, а не все поле таба где расположены конторлы
 
        SetBkColor(lpDrawItem->hDC, ini.rgb(clrWindow)); //а вот это не вполняется даже при отмене предыдущей функции, а вот почему ?
        return;
        }
Что я делаю не правильно ? Почему не работает SetBkColor и как заставить изменять цвет фона для всего таба, а не только для закладки ?
0
John Paramol
Сообщений: n/a
18.08.2011, 11:21 #3
А что вы ждете от SetBkColor?
Понимаю, очень напоминает TurboПаскаль или TurboСи там какой-нибудь,
WINAPI-шная функция только устанавливает новое значение BkColor,
и больше никаких действий (типа заливки) не выполняет.
А насчет всего поля, незнаю, попробуйте InvalidateRect, что ли.
Скорее всего надо ловить иное message.
PavelT100
0 / 0 / 0
Регистрация: 21.10.2008
Сообщений: 62
18.08.2011, 12:33  [ТС] #4
Согласен. Конечно, SetBkColor только устанавливает значение и больше ничего не делает, но этого было вролне достаточно для Static - ов при обработке сообщения WM_CTLCOLORSTATIC. Все остальное оно само делало. Здесь я SetBkColor применил исключительно из ностальгии по WM_CTLCOLORSTATIC. У меня собственно и вопрос заключается в том, какое иное надо отлавливать сообщение ? InvalidateRect не подохдит по двум причинам, во-первых если его ставить при обработке WM_DRAWITEM, то картинка постоянно будет моргать, все время будет перерисовыватся, а во-вторых, несмотря даже на моргание, фон не поменяется.
Вопрос то у меня вообщем -то должен быть простой, неужели никто с ним не сталкивался ? Получается, что в основной области закладки таба нельзя ничего рисовать. Обратися к этой области через WM_DRAWITEM нельзя, только к области язычка где выводятся надписи.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2011, 12:33
Привет! Вот еще темы с ответами:

Какое максимальное количество полей может обработать SQL Update? - C# ASP.NET
Какое максимальное количество полей может обработать SQL Update. У меня в одной из таблиц 143 поля. INSERT INTO переваривает их без...

В программе надо обработать ситуацию деления на ноль. - Delphi
Возникла проблема при написании обычного калькулятора.Нужно,что бы при деление на 0 выскакивала ошибка,в итоге намудрил что и при умножении...

Переправка сообщений - проверить надо в одном месте, а обработать в другом - C# ASP.NET
ПРоблема такова: есть страница с формой, в ней один input type=text и одна textarea. вводишь данные, отправляешь, прверяешь значения...

TabCtrl MFC - Visual C++
Добавляю вкладки из диалогов, как определить координаты X и Y которые нужно задать в SetWindowPos при установке вкладки, что бы она...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
18.08.2011, 12:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru