Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
4 / 4 / 1
Регистрация: 13.09.2013
Сообщений: 154
1

Отрисовка PageControl'a

20.03.2014, 15:25. Показов 4250. Ответов 22
Метки нет (Все метки)

Добрый день!
Имеется PageControl с ownerdraw:=true;
Динамически в нём создаются и удаляются различные вкладки.
В каждую вкладку запихивается фрейм с белым фоном и некоторым содержимым. Заголовок выделенной вкладки, пока что при помощи OnDrawTab, окрашивается в белый цвет. Выходит вот что:

Отрисовка PageControl'a

Необходимо удалять разделительную линию между заголовком и телом TabSheet'a:
Отрисовка PageControl'a

Вариант с закрашиванием этой области белым цветом в том же OnDrawTab не подходит, т.к. рисуется эта линия в каком-то другом событии (возможно при обработке WMPaint PageControl'a), и при перетаскивании формы за пределы экрана оно вызывается и эта линия рисуется снова, без вызова OnDrawTab.

Подскажите пожалуйста, как реализовать?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2014, 15:25
Ответы с готовыми решениями:

Отрисовка
Форумчани привет, есть код программы в коде текст пишется через канву на форме, НО при сворачивание...

Отрисовка StringGrid
procedure TForm16.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State:...

Отрисовка подменю
Нужно графически нарисовать меню. Например в том же блокноте. То, что отловить нужную программу...

отрисовка линии
пишу логический анализатор, функция читает состояние порта, и присваивает 150 раз в секунду...

22
4 / 4 / 1
Регистрация: 13.09.2013
Сообщений: 154
21.03.2014, 10:05  [ТС] 2
Проблема актуальна : <
0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
21.03.2014, 11:11 3
Такой вариант получился:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
const
{$J+}
  b: Boolean = False;
{$J-}
var
  R: TRect;
begin
  if Active then
  begin
    R := Rect;
    InflateRect(R, -2, 0);
    R.Bottom := R.Bottom + 5;
    Control.Canvas.Brush.Color := clLime;
    Control.Canvas.FillRect(R);
    if b then
    begin
      R.Left := 0;
      R.Right := Control.Canvas.ClipRect.Right;
      InvalidateRect(Control.Handle, R, True);
    end;
    b := not b;
  end;
end;
1
4 / 4 / 1
Регистрация: 13.09.2013
Сообщений: 154
21.03.2014, 11:36  [ТС] 4
спасибо огромное! а что делают {$J+} и {$J-} ?
0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
21.03.2014, 11:43 5
Они делают "локальную переменную глобального типа", т.е. она доступна только в подпрограмме, но ее значения сохраняются при разных вызовах этой подпрограммы.
2
4 / 4 / 1
Регистрация: 13.09.2013
Сообщений: 154
21.03.2014, 11:45  [ТС] 6
Спасибо А можете ссылку дать, где поподробнее про это почитать? Первый раз про такое слышу.
0
5576 / 2182 / 456
Регистрация: 20.11.2009
Сообщений: 7,266
Записей в блоге: 1
21.03.2014, 12:00 7
Цитата Сообщение от FIL Посмотреть сообщение
Они делают "локальную переменную глобального типа"
разве???

я все время думал что эти 2 директивы включают/отключают разрешение на перезапись константы, т.е. это как бы константа изначально, но ее можно в процессе программы все равно изменять

вот что пишет нам справочник
Типизированные константы

Эти константы, в отличие от истинных, могут иметь тип массив, запись, указатель или процедурный. Вообще они могут иметь любой тип, кроме файлового и варианта. По умолчанию (директива компилятора {$J+}) типизированные константы могут изменять свои значения в процессе выполнения программы, т.е. ведут себя как инициализированные переменные. В случае указания директивы компилятора {$J–} они ведут себя как истинные константы, т.е. переменные, доступные только для чтения (read-only variables).
Добавлено через 8 минут
таким примером, сделали константу х дали ей значение 10
разрешили ее изменять
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
{$J+}
const x: Integer = 10;
{$J-}
begin
  x := x + 1;
  Caption := IntToStr(x)
end;
ну и дальше можно таким примером проверить что будет происходить
1
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
21.03.2014, 12:00 8
Цитата Сообщение от Arcor Посмотреть сообщение
вот что пишет нам справочник
Из этого определения мало понятно как это можно использовать, поэтому я написал своими словами и кавычки, кстати, поставил, т.к. это образное выражение.
0
5576 / 2182 / 456
Регистрация: 20.11.2009
Сообщений: 7,266
Записей в блоге: 1
21.03.2014, 12:04 9
FIL, я понял в какое русло ты писал, после того, как сам написал пример

вот еще чем можно дополнить: в подпрограмме эта переменная(константа) не удаляется при выходе из процедуры или функции, она сохраняет свое значение до последующего вызова.

в Си это вроде директива static


Не по теме:

ладно, пошел я сдавать последний экзамен в этой сессии :wall:

1
4 / 4 / 1
Регистрация: 13.09.2013
Сообщений: 154
21.03.2014, 13:02  [ТС] 10
Я извиняюсь, проблема, оказывается, вообще в другом! Эта линия цвета "clBtnFace", толщиной в 2 пикселя, рисуется от фрейма. Хотя цвет фрейма и белый. А я уже все события и сообщения PageControl'a перебрал
Полагаю, нужно обрабатывать WMPaint фрейма теперь

Arcor, удачи

Добавлено через 25 минут
Чего-то не работает : <
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TFrame3.WMPaint(var Message: TWMPaint);
var
OldBrush, NewBrush: HBRUSH;
R: TRect;
begin
  NewBrush := CreateSolidBrush(RGB(0,255,0));
  OldBrush := SelectObject(Message.DC, NewBrush);
  GetUpdateRect(Handle,R,false);
  Windows.FillRect(Message.DC,R,NewBrush);
  SelectObject(Message.DC, OldBrush);
  DeleteObject(NewBrush);
end;
Что я неправильно написал?

Добавлено через 6 минут
Нет я чего-то напутал совсем. фрейм всё-таки тут ни при чём.

Добавлено через 6 минут
Всё разобрался. Прошу прощения ещё раз, затупил по страшному.
0
FIL
21.03.2014, 17:33
  #11

Не по теме:

Цитата Сообщение от Arcor Посмотреть сообщение
пошел я сдавать последний экзамен в этой сессии
Сдал?:)

0
5576 / 2182 / 456
Регистрация: 20.11.2009
Сообщений: 7,266
Записей в блоге: 1
21.03.2014, 17:57 12
Цитата Сообщение от FIL Посмотреть сообщение

Не по теме:

Сдал?

Не по теме:

не знаю.... в течении 6 недель будут результаты.. но что-то у меня дурное предчувствие.. видать не судьба быть мне инженером :(, надеюсь на все наилучшее

0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
21.03.2014, 18:39 13
Цитата Сообщение от Arcor Посмотреть сообщение
в течении 6 недель будут результаты..

Не по теме:

=-O Нифига себе сроки. Удачи тебе и терпения :)

0
5576 / 2182 / 456
Регистрация: 20.11.2009
Сообщений: 7,266
Записей в блоге: 1
21.03.2014, 18:43 14
Цитата Сообщение от FIL Посмотреть сообщение
Нифига себе сроки. Удачи тебе и терпения

Не по теме:

у на тут так всегда... самое плохое то что надо ждать,а когда еще такая ситуация.. то вообще... с ума сойти можно

0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
21.03.2014, 18:55 15
Цитата Сообщение от Arcor Посмотреть сообщение
у на тут так всегда...

Не по теме:

А если не сдал, то пересдача или что?

0
5576 / 2182 / 456
Регистрация: 20.11.2009
Сообщений: 7,266
Записей в блоге: 1
21.03.2014, 19:23 16
Цитата Сообщение от FIL Посмотреть сообщение
А если не сдал, то пересдача или что?

Не по теме:

да пересдача, в течении года, и можно только сдавать тогда, когда этот предмет принимается... и максимум можно сдавать 3 раза, на 3 раз не сдал - не имеешь права на всей территории Германии больше в ВУЗ идти на тот факультет где есть этот предмет. Вот так весело у нас тут :scratch:
принимается 1 и тот же экзамен 3 раза в год это 1 период: февраль-март, 2: июнь, 3: сентябрь. и в основном все предметы только в письменной форме, то что написано на бумажке - то и оценивается

вот зимой не сдал, жди июня или сентября... такая у них система. А я сегодня писал в третий раз, т.е. в последний.. ну не понимаю я эту лабуду в химии.. мне бы чего с программированием или электроникой...

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31192 / 20390 / 7940
Регистрация: 22.10.2011
Сообщений: 35,360
Записей в блоге: 6
21.03.2014, 19:26 17
FIL, Arcor,
А не пора ли вам во всей личной перепиской вместе перебазироваться в ЛС? Темы засорять не надо...
0
4 / 4 / 1
Регистрация: 13.09.2013
Сообщений: 154
23.03.2014, 15:38  [ТС] 18
FIL, помоги ещё немного, пожалуйста!
Как мне совсем убрать эту каёмку? (на рисунке красным обозначил, так она 240,240,240)
Отрисовка PageControl'a

Точнее, окрасить в белый цвет. Для всех PageControl'ов. У меня чего-то с InvalidateRect не получается
0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
23.03.2014, 20:35 19
Цитата Сообщение от Jamplane Посмотреть сообщение
Как мне совсем убрать эту каёмку?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
type
  TPageControl = class(Vcl.ComCtrls.TPageControl)
  private
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  end;
 
  TForm1 = class(TForm)
...
 
procedure TPageControl.WMPaint(var Message: TWMPaint);
var
  R: TRect;
begin
  inherited;
  Canvas.Brush.Color := clLime;
  R := Canvas.ClipRect;
  R.Top := R.Top + 20;
  Canvas.FillRect(R);
end;
20 - высота заголовка - лучше ее как-то програмно определять, т.к. на разных компах она может оказаться разной.
1
4 / 4 / 1
Регистрация: 13.09.2013
Сообщений: 154
23.03.2014, 22:45  [ТС] 20
FIL, Большое спасибо!
А что за <высота заголовка>? Message не содержит в себе данных о перерисовываемой области?
Может, с GetUpdateRect можно как-нибудь сделать? Хотя я вообще не понял, как он работает. Возвращает всегда <0,0,0,0>

Добавлено через 2 минуты
Разобрался с GetUpdateRect: возвращает область, установленную Invalidate'ом.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2014, 22:45

TNextInspector отрисовка
Почему то такая проблема происходит с TNextInspector ... При наведение мыши он перестаёт...

Зависает отрисовка
Добрый вечер всем. Зависает приложение при выходе, если раскомментарить выделенный блок. Причем...

Отрисовка графа
Здравствуйте! Делаю программу для вычисления медианы графа, возникла проблема: При построении...

Отрисовка
Возникла небольшая проблема, панель в фрейме отрисовывается с толчка, примерно с третьего раза....

Отрисовка
Имеется объект Graphics и отрисовка круга с помощью DrawEllipse. Как сделать чтобы вместо полного...

Отрисовка
Доброго времени суток! Есть пара вопросов, добавлено несколько панелей: главная панель, панель...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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