
24.05.2011, 17:58
|
|
Прохожий
|
|
Регистрация: 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
|