5

Delphi ネイティブ コントロールのTGroupBoxを継承し、その Paint メソッドをオーバーライドして角丸四角形を描画します。

   procedure TclTransparentGroupBox.CreateParams(var params : TCreateParams);
   begin
     inherited;
     Params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT;
   end;

Create パラメータをオーバーライドした後の Paint メソッドは次のようになります。

   procedure TclTransparentGroupBox.Paint;
   begin
     // Draw the rounded rect to show the group box bounds
     Canvas.Pen.Color := clWindowFrame;
     Canvas.RoundRect(5, 15, ClientRect.Right - 5, ClientRect.Bottom - 5, 10, 10);
     if Caption <> EmptyStr then
     begin
       Canvas.Brush.Style := bsClear;
       Canvas.TextOut(10, 0, Caption);
     end;
   end;

私が直面している主な問題は、透明なグループ ボックスの上にラベルがほとんどないことです。フォームを開くとラベルはきれいに見えますが、テキストが変更されると、ラベルの境界四角形が表示されます。これは、透明なボックスの上に奇妙に見えます。

フォームのサイズを変更してもグループ ボックス自体が消えてしまい、フォーカスを別のアプリケーションに変更してアプリケーションを元に戻すと、グループ ボックス自体が描画されます。

描画に関して何か不足していますか? 対処する必要がある Windows メッセージはありますか???

前もってありがとうラフル

4

1 に答える 1

5

コントロールを透明にするには、次のことを行う必要があります。

不透明にしない

ControlStyle := ControlStyle - [csOpaque]

WM_ERASEBKGND を処理します。

procedure TTransPanel.WM_ERASEBKGND(var Msg: TWM_ERASEBKGND); 
var
    SaveDCInd: Integer;
    Position: TPoint;
begin
    SaveDCInd := SaveDC(Msg.DC); 
    //save device context state (TCanvas does not have that func)
    GetViewportOrgEx(Msg.DC, Position);
    SetViewportOrgEx(Msg.DC, Position.X - Left, Position.Y - Top, nil);
    IntersectClipRect(Msg.DC, 0, 0, Parent.ClientWidth, Parent.ClientHeight);
    try
        Parent.Perform(WM_ERASEBKGND, Msg.DC, 0 );
        Parent.Perform(WM_PAINT, Msg.DC, 0);
        //or
        // Parent.Perform(WM_PRINTCLIENT, Msg.DC, prf_Client); //Themeing
    except
    end;       
    RestoreDC(Msg.DC, SaveDCInd);
    Canvas.Refresh;       
    Msg.Result := 1; //We painted out background
end;

上記の手順では、最初にデバイス コンテキストの状態を保存してから、親のキャンバス (おそらく TForm) をキャンバス (TGroupBox) に描画します。最後に DC を復元し、背景をペイントしたことを示すために 1 を返します。

于 2012-01-20T12:31:35.183 に答える