私は通常、タイトルバーを使用しているのと同じように、左クリックして背景領域を押してフォームウィンドウを移動します。バックグラウンド領域のどこかをドラッグして移動できる非長方形フォームの作成
また、自分のアプリケーションのフォームウィンドウ(つまり、長方形のウィンドウ)を私のカスタムデザインのグラフィックウィンドウに変更したいと考えています。私は他の多くのアプリケーションでこの種のウィンドウを見てきました。
私は通常、タイトルバーを使用しているのと同じように、左クリックして背景領域を押してフォームウィンドウを移動します。バックグラウンド領域のどこかをドラッグして移動できる非長方形フォームの作成
また、自分のアプリケーションのフォームウィンドウ(つまり、長方形のウィンドウ)を私のカスタムデザインのグラフィックウィンドウに変更したいと考えています。私は他の多くのアプリケーションでこの種のウィンドウを見てきました。
質問1:
そのクライアント領域をドラッグするときに、フォームを移動できるようにするために、あなたはそれがタイトルバー(キャプション領域)であるかのようにクライアント領域を治療するためのウィンドウマネージャを伝える必要があります。あなたはあなたの質問に似た何かを提案します。
これは、フォームのWndProc
methodをオーバーライドWM_NCHITTEST
メッセージに応答し、すべてがデフォルトの代わりに、キャプション(タイトル)バーの一部として扱われるべきであることを示すためにHTCAPTION
を返すことで、.NETで行うことができますHTCLIENT
これは、フォームのクライアント領域として扱われるべきであることを示します。フォームクラスに次のコードを追加します。
private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_NCHITTEST)
{
// Convert HTCLIENT to HTCAPTION
if (m.Result.ToInt32() == HTCLIENT)
{
m.Result = (IntPtr)HTCAPTION;
}
}
}
質問2:あなたはカスタムRegion
のにフォームのRegion
propertyを設定することにより、任意の、非矩形形状のフォームを作成することができます
あなたの選択。 Photoshopのようなグラフィックスプログラムの経験がある場合は、フォームの「クリッピング領域」を設定すると考えることができます。ウィンドウマネージャは、指定した範囲外に何も描画しません。このRegion
に記載されている形状のピクセルは、連続していなくてもかまいません。
リージョンを作成する最も簡単な方法は、おそらくGraphicsPath
classを使用し、次にGraphicsPath
オブジェクトをパラメータとして受け入れるconstructor for the Region
classを使用することです。
最初の質問では、ウィンドウマネージャによって描画されるデフォルトの枠線が消えていることを確認するために、FormBorderStyle
propertyをNone
に設定する必要があります。
残念ながら、これらの領域はアンチエイリアスできません。これらの制限の詳細については、Hans's answer to this questionを参照してください。
を:最後に、それは非矩形のフォームを作成するには、この後者のアプローチは全く、製品のユーザビリティを向上させるので、好きではない、いくつかの実に醜いユーザインタフェースを生成することができますことは注目に値します
この手法を控えめに使い、適切な判断を下してください。疑問があるときは、長方形は実際には窓のための本当に良い形です。
ここには、印象的なCodeProjectの記事へのリンクがあります。これは、両方の質問に回答します:An Alpha Channel Composited Windows Form with Designer Support。この実装では、前後のウィンドウの組み合わせが使用されます。 WS_EX_LAYEREDを使用してビットマップベースのウィンドウを表示し、ドラッグするためにマウスイベントをメインフォームにフックします。
ちょっと外に見えるものは、ウィンドウがドラッグされているときです。前後のウィンドウの動きの間に少しの遅延があり、互いを追いかけているように見えます。
この次のCodeProjectの記事では、DeferWindowPos:Alpha Blended Windows Formsを使用してこの問題を解決する方法を示しています。
幸運を祈る!
ありがとうございましたあなたの答えは私には非常に便利です。私はこれを適用しましたが、背景のcontexMenustripは無効になります。私はバックグラウンドのために両方のイベントを持つことができる方法はありますか? – Prince123
WM_NCHITTESTとHTCAPTIONを使用すると副作用が発生することに注意してください。たとえば、フォームをダブルクリックすると、フォームが最大化されます。 – AVIDeveloper
私はMaximizeBoxを無効にすることでこれを解決できます。しかし、どのようにcontexmenustripを解決するには、それに影響を与えた。 – Prince123