2012-02-17 21 views
4

私は通常、タイトルバーを使用しているのと同じように、左クリックして背景領域を押してフォームウィンドウを移動します。バックグラウンド領域のどこかをドラッグして移動できる非長方形フォームの作成

また、自分のアプリケーションのフォームウィンドウ(つまり、長方形のウィンドウ)を私のカスタムデザインのグラフィックウィンドウに変更したいと考えています。私は他の多くのアプリケーションでこの種のウィンドウを見てきました。

答えて

5

質問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 propertyNoneに設定する必要があります。

残念ながら、これらの領域はアンチエイリアスできません。これらの制限の詳細については、Hans's answer to this questionを参照してください。

Windows Media Player "alien head"

を:

最後に、それは非矩形のフォームを作成するには、この後者のアプローチは全く、製品のユーザビリティを向上させるので、好きではない、いくつかの実に醜いユーザインタフェースを生成することができますことは注目に値します

この手法を控えめに使い、適切な判断を下してください。疑問があるときは、長方形は実際には窓のための本当に良い形です。

+0

ありがとうございましたあなたの答えは私には非常に便利です。私はこれを適用しましたが、背景のcontexMenustripは無効になります。私はバックグラウンドのために両方のイベントを持つことができる方法はありますか? – Prince123

+0

WM_NCHITTESTとHTCAPTIONを使用すると副作用が発生することに注意してください。たとえば、フォームをダブルクリックすると、フォームが最大化されます。 – AVIDeveloper

+0

私はMaximizeBoxを無効にすることでこれを解決できます。しかし、どのようにcontexmenustripを解決するには、それに影響を与えた。 – Prince123

1

ここには、印象的なCodeProjectの記事へのリンクがあります。これは、両方の質問に回答します:An Alpha Channel Composited Windows Form with Designer Support。この実装では、前後のウィンドウの組み合わせが使用されます。 WS_EX_LAYEREDを使用してビットマップベースのウィンドウを表示し、ドラッグするためにマウスイベントをメインフォームにフックします。

ちょっと外に見えるものは、ウィンドウがドラッグされているときです。前後のウィンドウの動きの間に少しの遅延があり、互いを追いかけているように見えます。

この次のCodeProjectの記事では、DeferWindowPos:Alpha Blended Windows Formsを使用してこの問題を解決する方法を示しています。

幸運を祈る!

関連する問題