![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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; |