2011-11-11 2 views
9

일부 배경 (TLabel and TGroupbox Captions Flicker on Resize의 연속의 종류) : 그래서추가 비 VCL 창

  • , 나는 다른 플러그인을로드하고 TPageControl에 새 탭을 생성하는 응용 프로그램이 각 하나씩.
  • 각 DLL에는 이와 관련된 TForm이 있습니다.
  • 양식은 부모 hWnd와 함께 새 TTabSheet로 작성됩니다. TTabSheets은 폼의 부모가 아니기 때문에 VCL이 과 관련되어 있습니다 (은 동적 RTL을 사용하고 싶지 않으며 다른 언어로 만든 플러그인은) 저는 수동으로 크기를 조정해야합니다.

난 그냥 응용 프로그램의 "플러그인"유형에 대한 새로운 문제 (하지만 훌륭한 학습 경험)의 많은으로 실행 것으로 보인다.

그래서 저는 현재 TTabSheet에 삽입되지 않지만 크기가 조정되고 양식에 직접 정렬되는 플러그인을 갖기 위해 노력하고 있습니다.

이 그림으로 설명하기 쉬울 것 때문에 : Visual representation of question 지금 수동 정렬 및 크기 조정을 할 수있는,하지만 난 차라리 (등을 alClient, alTop으로,을 VCL 정렬 방법이있을 것이다) 날 위해 해줘. 그런 식으로 생각하지 않고 플러그인의 정렬을 설정해야합니다.

VCL 소스를 살펴본 후에 나는 정렬 코드를 단계별로 실행하고 호출 방법을 알아보기 시작했습니다. TControl의 그것을하는 WM_RESIZE 도착 기본적 때

  1. 전화 재조정() AlignControl()를 호출
  2. AlignControl() 클라이언트 RECT를 얻을 AlignControls()
  3. AlignControls을 (호출) DoAlign를 호출합니다()이 순서대로 각 TAlignment 유형 : alTop으로, alBottom, alLeft, 알았지을 alClient, alCustom, alNone
  4. DoAlign() FControls 및 FWinControls 적절
그들을 정렬한다 (TLists
있다 )을 통해 루프 것이다

내 생각에 새로운 TWinControl을 만들면 플러그인 폼 (윈도우)의 핸들을 핸들로 설정하고 FControls 목록에 적절한 작업을 수행하여 저의 작업을 처리해야합니다.

물론 여기 있습니다. 그래서 비참하게 실패했습니다. 무효 창 핸들에 대한 응용 프로그램을 종료 할 때 AV를 얻습니다. 내 생각 엔 내가 만든 TWinControl은 더 이상 존재하지 않는 플러그인 양식 (윈도우)의 핸들을 비우려고합니다. 나는 무엇을 시도했다

:

procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign); 
var 
    NewWinControl : TWinControl; 
begin 
    NewWinControl := TWinControl.Create(frmMain); 
    NewWinControl.WindowHandle := AHandle; 
    NewWinControl.Align := Align; 
    NewWinControl.Width := frmMain.ClientWidth; 
    NewWinControl.Height := 30; 
    NewWinControl.Parent := frmMain; 
end; 

procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign); 
var 
    NewWinControl : TWinControl; 
begin 
    NewWinControl := TWinControl.Create(frmMain); 
    NewWinControl.WindowHandle := AHandle; 
    NewWinControl.Align := Align; 
    NewWinControl.Width := frmMain.ClientWidth; 
    NewWinControl.Height := 30; 
    TWinControl(frmMain).Insert(NewWinControl); 
end; 

soooo는, 생각?

편집 1 :

좋아, 그래서이 올바르게 목록에 컨트롤을 추가하고 준수하여 TAlign 세트 (왜 내가 뭔가를 알아 내려고 8 시간 지출을 것입니다, 내가 여기에 게시

procedure AddHandleToControlList(AHandle: DWORD; AName: PChar; ATop, ALeft, AWidth, AHeight: Integer; AAlign: TAlign); 
var 
    NewWinControl : TWinControl; 
begin 
    NewWinControl := TWinControl.Create(frmMain); 
    With NewWinControl Do 
    begin 
    Name := AName; 
    Top := ATop; 
    Left := ALeft; 
    Width := AWidth; 
    Height := AHeight; 
    Align := AAlign; 
    WindowHandle := AHandle; 
    Visible := True; 
    end; 
    TWinControl(frmMain).InsertControl(NewWinControl); 
end; 

문제는 이제 응용 프로그램을 닫을 때, 나는 잘못된 오류 AV를 얻을 ... 난 계속해야한다 : 그 대답은 바로 오 아니라 다른 사람이 유용이 질문에 내 얘기 일)를 찾을 수 있습니다 ... 나타납니다 !! !!

편집 2 : 좋아,이 창 핸들이 더 이상 존재하지 않기 때문에 AV를 제기 TWinControl.DestroyWindowHandle 그래서. 나는 깨끗한 해결책을 생각하려고 노력하고있다.

답변

9

TWinControl에서 새 클래스를 가져오고 가상 DestroyWindowHandle() 메서드를 재정의하여 HWND을 제공하지 않습니다. TWinControl.DestroyWindowHandle()의 기본 구현은 Win32 API DestroyWnd() 함수를 호출합니다.

+0

그건 내가 한 일보다 훨씬 더 우아한 해결책입니다! 완벽 해, 고마워! – ThievingSix

+0

+1 달콤한 수 있습니다 –

+0

+1. David와 동의 - 멋지다! –