Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.05.2011, 02:02
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию Page Control c CheckBox'aми

В общем какая задача стоит - необходимо чтобы в программе был Page Control, в котором бы в названиях вкладок присутствует CheckBox. Такое видел вживую, но что за компонент - не помню. Подскажите, в каком направлении копать?
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #2  
Старый 11.05.2011, 18:08
blazonic blazonic вне форума
Прохожий
 
Регистрация: 23.03.2010
Адрес: Украина, Киев
Сообщения: 29
Версия Delphi: 6, 7, 2006
Репутация: 12
По умолчанию

Это такой собирательный компонент. Ранее такого не встречал.
А на каком языке программирования это приложение разработано, хотя бы предположительно?
В C# TabControl похож на PageControl.
Сейчас на C# (VS 2008) в WinForms попробовал сваять собирательный компонент из TabControl (для C# такого компонента как PageControl нет) и CheckBox. Этот новый компонент автоматом регистрируется в VS 2008 и его сразу можно использовать на форме.
Проблема состоит в том, чтобы CheckBox забить в название вкладки компонента TabControl. Пока этот CheckBox просто прорисовывается на канве компонента TabControl.
Полагаю, что необходимо объединить исходный код этих двух визуальных компонентов и т.о. на их базе создать новый компонент.
Если вы найдёте ту программу с этим навороченным PageControl, то для того чтобы узнать среду разработки по компилятору, её можно дизассемблировать в программе IDA.

Последний раз редактировалось blazonic, 12.05.2011 в 10:31.
Ответить с цитированием
  #3  
Старый 23.05.2011, 20:46
kukuruku310 kukuruku310 вне форума
Прохожий
 
Регистрация: 23.05.2011
Сообщения: 6
Репутация: 10
По умолчанию

рисовать его ручками с отслеживанием событий щелчков мышом на CheckBox-ах и ведя учет их текщих состояний
например, рисование, может в самом простом виде выглядеть как
Код:
procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  r: TRect;
begin
  inherited;
  r.Top := 1;
  r.Left := Rect.Left + 1;
  r.Bottom := 17;
  r.Right  := r.Left + 16;
  DrawFrameControl(PageControl1.Canvas.Handle, r, DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_CHECKED or DFCS_FLAT);
  Inc(Rect, Left, 18);
  DrawText(PageControl1.Canvas.Handle, PChar(PageControl1.Pages[TabIndex].Caption), -1, Rect, DT_LEFT);
end;
в свойствах PageControl лучше поставить OwnerDraw
Ответить с цитированием
  #4  
Старый 24.05.2011, 17:58
kukuruku310 kukuruku310 вне форума
Прохожий
 
Регистрация: 23.05.2011
Сообщения: 6
Репутация: 10
По умолчанию

Мда.. Наворокосил, что называется. Проверив в Delphi, вижу такую кучу оБшибок в своем "коде". Пытаюсь исправиться.
Код:
const
  CB_SZ = 12; // размер CheckBox'а

procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  r: TRect;
begin
  PageControl1.Canvas.FillRect(Rect);
  r := PageControl1.TabRect(TabIndex);
  // можно и по-простому CopyRect(r, Rect), но тогда "квадратик" станет немного "прыгать" по вертикали при переключении закладок
  r.Top := (r.Bottom + r.Top - CB_SZ) div 2; // по центру по вертикали
  r.Left := Rect.Left + 1;
  r.Bottom := r.Top + CB_SZ;
  r.Right  := r.Left + CB_SZ;
  if PageControl1.Pages[TabIndex].Tag = 0 then
    DrawFrameControl(PageControl1.Canvas.Handle, r, DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_FLAT)
  else
    DrawFrameControl(PageControl1.Canvas.Handle, r, DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_CHECKED or DFCS_FLAT);
  CopyRect(r, Rect);
  Inc(r.Left, CB_SZ + 2);
  DrawText(PageControl1.Canvas.Handle, PChar(PageControl1.Pages[TabIndex].Caption), -1, r, DT_LEFT);
end;

procedure TForm1.PageControl1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  idx: Integer;
  rect: TRect;
begin
  if mbLeft = Button then begin
    idx := PageControl1.IndexOfTabAt(X, Y);
    rect := PageControl1.TabRect(idx);
    if (X >= rect.Left + 1) and (X <= rect.Left + CB_SZ+1) then begin // наверное нет большого смысла проверять еще и по вертикали
      if PageControl1.Pages[idx].Tag = 0 then
        PageControl1.Pages[idx].Tag := 1
      else
        PageControl1.Pages[idx].Tag := 0;
      InvalidateRect(PageControl1.Handle, @rect, False);
    end;
  end;
end;
И OwnerDraw должно быть True
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter