Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как рисовать на контроле CTabCtrl?  (Прочитано 8890 раз)
0 Пользователей и 1 Гость смотрят эту тему.
jur
Помогающий

lt
Offline Offline

« : 25-10-2017 07:03 » 

Привет!

Понадобилось мне сделать окошко в стиле таб-контрола. Это примерно так:

 - справа на главном окне программы есть вертикальный ряд
   управляющих кнопок (типа "Start", "Report", "Setup", "Exit");
 - пользователь нажимает кнопку "Setup";
 - в основной зоне окна программы появляется этот самый таб-контрол;
 - в нем есть два таба: "Info" и "Config";
 - при выборе каждого из них появляются нужные поля ввода и кнопки;

С этим проблем нет. Однако, мне нужно, чтобы в верхней части клиентской области таб-контрола на выделенном месте (соответственно дочерние диалоги урезаны сверху) появилась маленькая картинка (логотип) и строка текста. Эти элементы должны присутствовать на таб-контроле всегда, при любом выбранном табе.

Сначала я подумал, что это фигня. Создал свой класс:

Код:
class CSetupTabCtrl : public CTabCtrl
{
   ...
};

и стал пытаться на этом своем таб-контроле рисовать.

И обломался...

Причем, судя по Интернету, очень далеко не я один. Единственно, чего мне удалось добиться, так это рисования или картинки (пока без текста), или кнопок табов. Но не одновременно обоих :-)  И что интересно, когда кнопки табов не рисуются, они все равно "живые", переключаются нормально.

Код:
void CSetupTabCtrl::OnPaint()
{
  //// CTabCtrl::OnPaint();  <--- Если эту строку раскомментировать,
                                  то рисуются кнопки табов, но нет картинки.
                                  А если оставить так, то есть картинка,
                                  но нет табов.
  CPaintDC dc(this); // device context for painting
  // TODO: Add your message handler code here
  // Do not call CTabCtrl::OnPaint() for painting messages
  Print_logo(dc.m_hDC, 256, 0, 0);
}

Подскажите, друзья, как эту ерунду побороть? Ведь это не должно быть очень сложно!

P.S. Я уж было подумал рисовать эти общие элементы на каждом  дочернем диалоге, но ведь это совсем не спортивно и абсолютно не кошерно! :-)

Помогите, пожалуйста!

Записан

MPEG-4 - в массы!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 25-10-2017 07:09 » 

CTabCtrl::OnPaint() - родительский рисовальщик вызвать в любом случае нужно. Поверх можно рисовать своё. Детали сейчас трудно вспомнить, экспериментировать некогда, я уже давно на Qt перешёл в плане GUI

рисовать нужно на кнопке, кстати. Насколько я помню, CTabCtrl - это чисто полоска с кнопками, без места под страницы, а страницы нужно было пристёгивать сложными телодвижениями на окне, содержащем сам контрол CTabCtrl
« Последнее редактирование: 25-10-2017 07:12 от Алексей++ » Записан

jur
Помогающий

lt
Offline Offline

« Ответ #2 : 25-10-2017 07:40 » new

CTabCtrl::OnPaint() - родительский рисовальщик вызвать в любом случае нужно. Поверх можно рисовать своё.

Во, во, как раз это мне и нужно. Но почему-то если раскомментировать вызов родительского рисовальщика, то перестает рисоваться моя картинка. Почему?!...

рисовать нужно на кнопке, кстати.

Этого предложения не понял. Это о чем речь?

Насколько я помню, CTabCtrl - это чисто полоска с кнопками, без места под страницы, а страницы нужно было пристёгивать сложными телодвижениями на окне, содержащем сам контрол CTabCtrl

Не, у этого контрола есть кнопки и нормальная клиентская область, куда и помещаются дочерние диалоги. Это в общем-то не очень сложно.

Но вот какого черта не рисуется моя картинка, если вызывать родительский рисовальщик?! А если не вызывать - рисуется нормально. Кто там блокирует мое рисование?...

Записан

MPEG-4 - в массы!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 25-10-2017 07:53 » 

jur, попробуй нарисовать поверх не твою картинку (я ж не знаю, что ты там делаешь в твоей функции), а просто красную линию, например. По диагонали через всю область. Рисуется ?
Записан

jur
Помогающий

lt
Offline Offline

« Ответ #4 : 25-10-2017 08:38 » 

jur, попробуй нарисовать поверх не твою картинку (я ж не знаю, что ты там делаешь в твоей функции), а просто красную линию, например. По диагонали через всю область. Рисуется ?

Не рисует, зараза! Вот код:

Код:
void CSetupTabCtrl::OnPaint()
{
  CTabCtrl::OnPaint();
  CPaintDC dc(this); // device context for painting
  // TODO: Add your message handler code here
  // Do not call CTabCtrl::OnPaint() for painting messages
  Graphics graphics(dc.m_hDC);
  Pen      pen(Color(255, 255, 0, 0), 3.0);
  graphics.DrawLine(&pen, 0, 0, 600, 160);
}

А если закомментировать строку "CTabCtrl::OnPaint();", то рисует нормально, без проблем. Но тогда уж без табов. Неисповедимы пути Винды нашей сущей и GDI ее... Аминь...

Так чего делать-то?! Такая простая фигня, а поди-ж ты...

Записан

MPEG-4 - в массы!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 25-10-2017 08:56 » 

Graphics graphics(dc.m_hDC); - это не знаю, у CDC свои методы рисования использовал

так это самое, ты новый контекст создаёшь, попробуй использовать текущий.

Код: (C++)
CTabCtrl::OnPaint();
if(CDC* pDC=GetDC())
{
   ...
   ...
   ...

   ReleaseDC(pDC);
}
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 25-10-2017 09:05 » 

Отрисовывать весь Таб-контрол это круто. А почему не сделать проще?
"Принципиально" "свой собственный" Таб-контрол
1. Родительский диалог
2. в нём всё что угодно +
3. нормальный Таб-контрол

А уже этот диалог использовать вместо оригинального Таб-контрола
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
jur
Помогающий

lt
Offline Offline

« Ответ #7 : 25-10-2017 09:46 » 

так это самое, ты новый контекст создаёшь, попробуй использовать текущий.

Как говаривал Остап Бендер: "Конгениально!" :-) Заработало! Вот код:

Код:
void CSetupTabCtrl::OnPaint()
{
  CTabCtrl::OnPaint();
  if(CDC* pDC = GetDC())
  {
    Print_logo(pDC->m_hDC, 256, 64, 8);
    // Толстая красная линия, я ее потом уберу
    Graphics graphics(pDC->m_hDC);
    Pen      pen(Color(255, 255, 0, 0), 3.0);
    graphics.DrawLine(&pen, 0, 0, 600, 160);
    ReleaseDC(pDC);
  }
}

Как и положено, рисуется картинка и перечёркивается красной линией. И кнопки табов на месте!

Большое тебе спасибо, коллега! Выручил!

Отрисовывать весь Таб-контрол это круто.

А чего крутого-то?! Таб-контрол вообще сам рисуется :-) Я только нужные дочерние диалоги подставляю.

А почему не сделать проще?
"Принципиально" "свой собственный" Таб-контрол
...
А уже этот диалог использовать вместо оригинального Таб-контрола

Я было уже склонялся к такому варианту. Но это просто излишнее усложнение (ненужный шаг в иерархии). Большое спасибо уважаемому Алексей++, подсказал простое и действенное решение.

Спасибо за помощь, друзья!
Записан

MPEG-4 - в массы!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines