2009-10-08 7 views
14

コンボボックスコントロールのオートコンプリートウィンドウのサイズを変更できるように、右下隅にボーダレスウィンドウのサイズを変更したいと思っています。右下にボーダレスウィンドウのサイズを変更

フォームをそのように構成するプロパティが見つかりません。

多分、誰かが私をこの問題に助けてくれるかもしれません。

画像は、ここで見つけることができます。

enter image description here

+0

投稿コード。コントロールの幅と高さを変更することでサイズを変更できます。 –

+0

Andrew Keithのコメントのため、変更された質問とスクリーンショットへのリンクが追加されました。ユーザーはフォームのサイズを変更できる必要があります。 –

+0

パネルで私のソリューションを参照してください:http://stackoverflow.com/a/8848440/640781 – edid

答えて

13

これを実現する適切な方法は、フォームにメッセージプロシージャハンドラ(たとえば、Form.WndProcをオーバーライド)を追加し、WM_NCHITTESTメッセージを処理することです。 (そのメッセージのC#定義はPInvoke.netにあります)特に、メッセージを受け取ったら、サイズを指定した地域のヒットテストであるかどうかを計算し、そうであればHTBOTTOMRIGHTを返します。デフォルトのウィンドウprocはあなたのために残りの作業を行います。ウィンドウにはボーダーがなくても、ウィンドウボーダーの右下をクリックしたとみなされます。

このaproachには、Win32 interopのティーンビットが必要ですが、他のウィンドウのサイズ変更とまったく同じようにリサイズ表示が行われます。

@benPearceが言ったように簡単なやり方で、コーナーにパネルを置き、幅/高さを使ってフォームサイズを調整します。これはうまくいくはずですが、サイズ変更はスムーズではありません。特にVistaとWin7 Basicでは、標準の移動とサイズ変更で完全な再描画が無効になり、すべてのステップで再描画を試みます。

更新:どちらの方法でも、グリッパの塗り方を理解する必要があります。たとえば、標準グリッパのビットマップを配置することができます。フォームにタイトルと境界線がないため、標準のWindowsビジュアルに必ずしも固執するわけではありませんが、すばらしいものを選ぶことができます。

更新2:ウィンドウ全体をカバーするコントロールがある場合は、フォームのマウスメッセージが表示されます。そのコントロールからサイズを変更するために使用したい場所をどうにかクリップする必要があります。

  1. コントロールのサイズを変更して、サイズ変更グリップのスペースを確保します。
  2. サイズ変更グリップを除外するには、コントロール領域を調整します(Regionプロパティを調整します)。
  3. パネルのサイズ変更グリップを覆い、MouseEnterメッセージを聞き、フォームのキャプチャプロパティをtrueに設定します。これにより、すべてのマウスメッセージが表示されます。 注::サイズ変更が完了した後にマウスがその領域を離れると、キャプチャを解放する必要があります。

私は、最も簡単なオプション1に行くことをお勧めします。オプション3は最も複雑で、Windowsでのマウス入力の仕組みに関する詳細な情報が必要なので、お勧めしません。オプション2はオプション1の良い代替方法ですが、ListViewコントロールがリージョンの調整にどのように反応するかを確認する必要があります。

+1

ありがとう、それはemtpyフォームに最適です。しかし、私のフォームは、フォームを塗りつぶすリストビューを含んでいます。 WM_NCHITTESTメッセージは発行されません。 –

+1

グリッパーを描く方法を探している人は誰でも、 'ControlPaint.DrawSizeGrip'が始まりです。 – AnotherUser

2

をフォームが適切にサイズ調整し、パネルのMouseDownイベントとのMouseMoveイベントを使用して、パネルやコーナーでいくつかの他のコントロールを置きます。

MouseDownでは、座標を記録し、MouseMoveでは、元の位置からの差を計算してフォームサイズを調整することができます。

+0

私は2番目の文の "MouseDown"の最後のインスタンスは "MouseMove"であると考えられます。 – bentsai

+0

修正!更新しました。 – benPearce

+0

これは少し作業が必要でしたが、私はきれいなイベント駆動型ソリューションが他の提案よりも優れています。おかげで – BrianLegg

31

フランシスの説明に対応するコードですが、私はそれを書いていましたが、一方彼は答えましたので、このコードがあなたのニーズに合っていれば良いと説明しました。

protected override void WndProc(ref Message m) { 
    const int wmNcHitTest = 0x84; 
    const int htBottomLeft = 16; 
    const int htBottomRight = 17; 
    if (m.Msg == wmNcHitTest) { 
     int x = (int) (m.LParam.ToInt64() & 0xFFFF); 
     int y = (int) ((m.LParam.ToInt64() & 0xFFFF0000) >> 16); 
     Point pt = PointToClient(new Point(x, y)); 
     Size clientSize = ClientSize; 
     if (pt.X >= clientSize.Width - 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) { 
      m.Result = (IntPtr) (IsMirrored ? htBottomLeft : htBottomRight); 
      return; 
     } 
    } 
    base.WndProc(ref m); 
} 

編集:グリッパーを書くために、あなたはnew VisualStyleRenderer(VisualStyleElement.Status.Gripper.Normal)を初期化し、そのPaintBackground()メソッドを使用することができます。

+1

グリッパの描画に関する詳細は、http://stackoverflow.com/a/4918111/161052を参照してください。 – JYelton

19

この素晴らしいサンプルと説明を投稿していただきありがとうございます。他の人が興味を持っているかもしれない以下の追加をいくつか追加しました。ここのコードのいくつかは他のstackoverflowの投稿から来たものですが、あるコードブロックで見ることができるようにすることは他の人にとって役に立ちます。 右下隅だけでなく、すべての罫線でフォームのサイズを変更できるようにしたいと思いました。私はまた、フォームをドラッグすることができたかった。最後に、私はドロップシャドウが欲しかった。

//*********************************************************** 
//This gives us the ability to resize the borderless from any borders instead of just the lower right corner 
protected override void WndProc(ref Message m) 
{ 
    const int wmNcHitTest = 0x84; 
    const int htLeft = 10; 
    const int htRight = 11; 
    const int htTop = 12; 
    const int htTopLeft = 13; 
    const int htTopRight = 14; 
    const int htBottom = 15;    
    const int htBottomLeft = 16; 
    const int htBottomRight = 17;   

    if (m.Msg == wmNcHitTest) 
    { 
     int x = (int)(m.LParam.ToInt64() & 0xFFFF); 
     int y = (int)((m.LParam.ToInt64() & 0xFFFF0000) >> 16); 
     Point pt = PointToClient(new Point(x, y)); 
     Size clientSize = ClientSize; 
     ///allow resize on the lower right corner 
     if (pt.X >= clientSize.Width - 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) 
     {   
      m.Result = (IntPtr)(IsMirrored ? htBottomLeft : htBottomRight); 
      return; 
     }  
     ///allow resize on the lower left corner 
     if (pt.X <= 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(IsMirrored ? htBottomRight : htBottomLeft); 
      return; 
     } 
     ///allow resize on the upper right corner 
     if (pt.X <= 16 && pt.Y <= 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(IsMirrored ? htTopRight : htTopLeft); 
      return; 
     } 
     ///allow resize on the upper left corner 
     if (pt.X >= clientSize.Width - 16 && pt.Y <= 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(IsMirrored ? htTopLeft : htTopRight); 
      return; 
     } 
     ///allow resize on the top border 
     if (pt.Y <= 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(htTop); 
      return; 
     } 
     ///allow resize on the bottom border 
     if (pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(htBottom); 
      return; 
     } 
     ///allow resize on the left border 
     if (pt.X <= 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(htLeft); 
      return; 
     } 
     ///allow resize on the right border 
     if (pt.X >= clientSize.Width - 16 && clientSize.Height >= 16) 
     { 
      m.Result = (IntPtr)(htRight); 
      return; 
     } 
    } 
    base.WndProc(ref m); 
} 
//*********************************************************** 
//*********************************************************** 
//This gives us the ability to drag the borderless form to a new location 
public const int WM_NCLBUTTONDOWN = 0xA1; 
public const int HT_CAPTION = 0x2; 

[DllImportAttribute("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 
[DllImportAttribute("user32.dll")] 
public static extern bool ReleaseCapture(); 

private void YOURCONTROL_MouseDown(object sender, MouseEventArgs e) 
{ 
    //ctrl-leftclick anywhere on the control to drag the form to a new location 
    if (e.Button == MouseButtons.Left && Control.ModifierKeys == Keys.Control) 
    {  
     ReleaseCapture(); 
     SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
    } 
} 
//*********************************************************** 
//*********************************************************** 
//This gives us the drop shadow behind the borderless form 
private const int CS_DROPSHADOW = 0x20000; 
protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.ClassStyle |= CS_DROPSHADOW; 
     return cp; 
    } 
} 
//*********************************************************** 
関連する問題