|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Page Control c CheckBox'aми
В общем какая задача стоит - необходимо чтобы в программе был Page Control, в котором бы в названиях вкладок присутствует CheckBox. Такое видел вживую, но что за компонент - не помню. Подскажите, в каком направлении копать?
Хорошо написанная программа не требует документации ICQ 9-184-668. |
#2
|
|||
|
|||
Это такой собирательный компонент. Ранее такого не встречал.
А на каком языке программирования это приложение разработано, хотя бы предположительно? В 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
|
|||
|
|||
рисовать его ручками с отслеживанием событий щелчков мышом на 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; |
#4
|
|||
|
|||
Мда.. Наворокосил, что называется. Проверив в 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; |