![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
В общем какая задача стоит - необходимо чтобы в программе был Page Control, в котором бы в названиях вкладок присутствует CheckBox. Такое видел вживую, но что за компонент - не помню. Подскажите, в каком направлении копать?
|
|
#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; |