2009-08-14 4 views
1

다음과 같은 기법을 사용하여 창에 그림자 효과를 사용하거나 사용하지 않도록 설정하려고합니다. (CreateParams는 물론 재정의됩니다 .TToolWindow는 TForm에서 파생됩니다.) 동일한 폼 클래스의 서로 다른 인스턴스가 서로 다른 윈도우 클래스 스타일을 사용할 수 있습니까?

procedure TToolWindow.CreateParams(var Params: TCreateParams); 
var 
    LShadow: boolean; 

begin 
    inherited; 

    if (Win32Platform = VER_PLATFORM_WIN32_NT) 
    and ((Win32MajorVersion > 5) 
    or ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))) then //Win XP or higher 
     if SystemParametersInfo(SPI_GETDROPSHADOW, 0, @LShadow, 0) then 
     begin 
     if LShadow and HasShadow then 
      Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW; 
     end; 
end; 

이는 TToolWindow 클래스의 첫 번째 인스턴스에 대한 확인을 작동하지만

는 다음과 같은 경우에 관계없이합니다 (TToolWindow 클래스의 게시 된 재산) HasShadow의 가치, 첫 번째 인스턴스에서 설정을 유지합니다.

TToolWindow의 다른 인스턴스에서 어떻게 그림자 설정을 다르게 할 수 있습니까?

TIA

답변

2

VCL은 주어진 클래스의 첫 번째 인스턴스가 생성 될 때마다 한 번씩 폼 클래스에 필요한 창 클래스를 즉시 등록합니다. 이는 TToolWindow의 모든 보조 인스턴스가 HasShadow 값과 관계없이 첫 번째 인스턴스와 동일한 그림자를 갖는 이유를 설명합니다. 동일한 창 클래스의 창을 작성하므로 모두 동일한 클래스 스타일을 갖습니다.

두 가지 클래스를 등록 할 수 있습니다. 하나는 그림자가 있고 다른 하나는 그림자가 있습니다. 클래스 이름이 이전에 등록 된 클래스와 다른 경우 VCL은 새 창 클래스를 등록합니다. 이 같은

뭔가 :

procedure TToolWindow.CreateParams(var Params: TCreateParams); 
var 
    LShadow: boolean; 
begin 
    inherited; 

    if (Win32Platform = VER_PLATFORM_WIN32_NT) 
    and ((Win32MajorVersion > 5) 
    or ((Win32MajorVersion = 5) and (Win32MinorVersion >= 1))) 
    then begin 
    //Win XP or higher 
    if SystemParametersInfo(SPI_GETDROPSHADOW, 0, @LShadow, 0) 
     and LShadow and HasShadow 
    then begin 
     Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW; 
     StrLCopy(Params.WinClassName, 'TDelphiToolWindowWithShadow', 63); 
    end else begin 
     Params.WindowClass.Style := Params.WindowClass.Style and not CS_DROPSHADOW; 
     StrLCopy(Params.WinClassName, 'TDelphiToolWindowNoShadow', 63); 
    end; 
    end; 
end; 
0

그냥 추측 ... 후속 인스턴스는 TToolWindow의 자녀입니까? 아마도 그들은 부모로부터 스타일을 계승하고 있습니다.

편집 : 실제로, 항목을 WS_CHILD 스타일로 지정하면 CS_DROPSHADOW가 무시된다는 사실을 온라인에서 읽었습니다. 다른 모든 것이 실패 할 경우 문제를 해결할 수있는 방법 중 하나 일 수 있습니다.

관련 문제