5

次のコードを使用して、角が丸いC ++BuilderXEフォームを作成しました。

BorderStyle = bsNone; 

void __fastcall TForm1::FormCreate(TObject *Sender)
{
     HRGN frmrgn;  

     frmrgn = CreateRoundRectRgn (0, 0, ClientWidth, ClientHeight,12,12);
     SetWindowRgn(Handle,frmrgn,true);
}

見た目はかっこいいですが、境界線が欠けています。色々試してみましたが、うまくいきませんでしたので、RGB(96,96,96)色の境界線を描くのを手伝ってください。

そして、フォーム全体をドラッグ可能にしたい。

4

1 に答える 1

3

1.濃い灰色の境界線をペイントする

これは、境界線をどの程度複雑に見せたいかに応じて、簡単です。濃い灰色の輪郭だけが必要な場合は、線と円弧の組み合わせを使用してFrameRgn輪郭を描画するか、関数を使用して特定のブラシで領域の周囲に輪郭を描画します。ウィンドウの形状を定義するために使用した領域がすでにあるため、これを行うのが最善の解決策です。

ただし、のMSDNドキュメントにSetWindowRgnは、「への呼び出しが成功するSetWindowRgnと、システムは領域ハンドルで指定された領域を所有しますhRgn。システムは領域のコピーを作成しません。したがって、この領域でそれ以上関数呼び出しを行うことはできません。取り持つ。" paintメソッド用にリージョンを再度作成する必要があります。

ペイントメソッドのコード:

HRGN hRegion = ::CreateRoundRectRgn (0, 0, ClientWidth, ClientHeight,12,12);
Canvas->Brush->Style = bsSolid;
Canvas->Brush->Color = RGB(96, 96, 96);
::FrameRgn(Canvas->Handle, hRegion, Canvas->Brush->Handle, 2, 2);
::DeleteObject(hRegion); // Don't leak a GDI object

2.タイトルバーなしでウィンドウをドラッグ可能にする

簡単に言うと、WM_NCHITTESTメッセージを処理する必要があるということです。Windowsはこれを送信して、マウスがタイトルバー上にあるかどうかを確認します(「NC」は「非クライアント」を表します。実際には、非クライアント領域のどこかにあるかどうかをテストしています。これは、ウィンドウの境界だけでなく、任意のウィンドウの境界でもかまいません。一番上にあります。)「はい、マウスは現在キャプションにあります」と言って、ウィンドウをドラッグ可能にすることができます。いくつかのコード:

// In the 'protected' section of your form's class declaration
virtual void __fastcall WndProc(Messages::TMessage &Message);

// The implementation of that method:
void __fastcall TForm1::WndProc(Messages::TMessage& Message) {
  TForm::WndProc(Message); // inherited implementation
  if (Message.Msg == WM_NCHITTEST && Msg.Result == htClient) {
    Msg.Result = htCaption;
  }
}

独自のタイトルバーを作成するために、独自のヒットテストを実行して、ウィンドウのどの部分がタイトルバーとして表示されるかを制限できます。

Delphiコードの例。

このメッセージの使用に関する優れた記事、および注意すべき点/陥らないようにするためのトラップ。

于 2011-05-31T00:33:11.353 に答える