Показать сообщение отдельно
  #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
Ответить с цитированием