일부 배경 (TLabel and TGroupbox Captions Flicker on Resize의 연속의 종류) : 그래서추가 비 VCL 창
- , 나는 다른 플러그인을로드하고 TPageControl에 새 탭을 생성하는 응용 프로그램이 각 하나씩.
- 각 DLL에는 이와 관련된 TForm이 있습니다.
- 양식은 부모 hWnd와 함께 새 TTabSheet로 작성됩니다. TTabSheets은 폼의 부모가 아니기 때문에 VCL이 과 관련되어 있습니다 (은 동적 RTL을 사용하고 싶지 않으며 다른 언어로 만든 플러그인은) 저는 수동으로 크기를 조정해야합니다.
난 그냥 응용 프로그램의 "플러그인"유형에 대한 새로운 문제 (하지만 훌륭한 학습 경험)의 많은으로 실행 것으로 보인다.
그래서 저는 현재 TTabSheet에 삽입되지 않지만 크기가 조정되고 양식에 직접 정렬되는 플러그인을 갖기 위해 노력하고 있습니다.
이 그림으로 설명하기 쉬울 것 때문에 : 지금 수동 정렬 및 크기 조정을 할 수있는,하지만 난 차라리 (등을 alClient, alTop으로,을 VCL 정렬 방법이있을 것이다) 날 위해 해줘. 그런 식으로 생각하지 않고 플러그인의 정렬을 설정해야합니다.
VCL 소스를 살펴본 후에 나는 정렬 코드를 단계별로 실행하고 호출 방법을 알아보기 시작했습니다. TControl의 그것을하는 WM_RESIZE 도착 기본적 때
- 전화 재조정() AlignControl()를 호출
- AlignControl() 클라이언트 RECT를 얻을 AlignControls()
- AlignControls을 (호출) DoAlign를 호출합니다()이 순서대로 각 TAlignment 유형 : alTop으로, alBottom, alLeft, 알았지을 alClient, alCustom, alNone
- DoAlign() FControls 및 FWinControls 적절
내 생각에 새로운 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 그래서. 나는 깨끗한 해결책을 생각하려고 노력하고있다.
그건 내가 한 일보다 훨씬 더 우아한 해결책입니다! 완벽 해, 고마워! – ThievingSix
+1 달콤한 수 있습니다 –
+1. David와 동의 - 멋지다! –