コンボボックスコントロールのオートコンプリートウィンドウのサイズを変更できるように、右下隅にボーダレスウィンドウのサイズを変更したいと思っています。右下にボーダレスウィンドウのサイズを変更
フォームをそのように構成するプロパティが見つかりません。
多分、誰かが私をこの問題に助けてくれるかもしれません。
画像は、ここで見つけることができます。
コンボボックスコントロールのオートコンプリートウィンドウのサイズを変更できるように、右下隅にボーダレスウィンドウのサイズを変更したいと思っています。右下にボーダレスウィンドウのサイズを変更
フォームをそのように構成するプロパティが見つかりません。
多分、誰かが私をこの問題に助けてくれるかもしれません。
画像は、ここで見つけることができます。
これを実現する適切な方法は、フォームにメッセージプロシージャハンドラ(たとえば、Form.WndProc
をオーバーライド)を追加し、WM_NCHITTEST
メッセージを処理することです。 (そのメッセージのC#定義はPInvoke.netにあります)特に、メッセージを受け取ったら、サイズを指定した地域のヒットテストであるかどうかを計算し、そうであればHTBOTTOMRIGHTを返します。デフォルトのウィンドウprocはあなたのために残りの作業を行います。ウィンドウにはボーダーがなくても、ウィンドウボーダーの右下をクリックしたとみなされます。
このaproachには、Win32 interopのティーンビットが必要ですが、他のウィンドウのサイズ変更とまったく同じようにリサイズ表示が行われます。
@benPearceが言ったように簡単なやり方で、コーナーにパネルを置き、幅/高さを使ってフォームサイズを調整します。これはうまくいくはずですが、サイズ変更はスムーズではありません。特にVistaとWin7 Basicでは、標準の移動とサイズ変更で完全な再描画が無効になり、すべてのステップで再描画を試みます。
更新:どちらの方法でも、グリッパの塗り方を理解する必要があります。たとえば、標準グリッパのビットマップを配置することができます。フォームにタイトルと境界線がないため、標準のWindowsビジュアルに必ずしも固執するわけではありませんが、すばらしいものを選ぶことができます。
更新2:ウィンドウ全体をカバーするコントロールがある場合は、フォームのマウスメッセージが表示されます。そのコントロールからサイズを変更するために使用したい場所をどうにかクリップする必要があります。
私は、最も簡単なオプション1に行くことをお勧めします。オプション3は最も複雑で、Windowsでのマウス入力の仕組みに関する詳細な情報が必要なので、お勧めしません。オプション2はオプション1の良い代替方法ですが、ListViewコントロールがリージョンの調整にどのように反応するかを確認する必要があります。
ありがとう、それはemtpyフォームに最適です。しかし、私のフォームは、フォームを塗りつぶすリストビューを含んでいます。 WM_NCHITTESTメッセージは発行されません。 –
グリッパーを描く方法を探している人は誰でも、 'ControlPaint.DrawSizeGrip'が始まりです。 – AnotherUser
をフォームが適切にサイズ調整し、パネルのMouseDownイベントとのMouseMoveイベントを使用して、パネルやコーナーでいくつかの他のコントロールを置きます。
MouseDownでは、座標を記録し、MouseMoveでは、元の位置からの差を計算してフォームサイズを調整することができます。
フランシスの説明に対応するコードですが、私はそれを書いていましたが、一方彼は答えましたので、このコードがあなたのニーズに合っていれば良いと説明しました。
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()
メソッドを使用することができます。
グリッパの描画に関する詳細は、http://stackoverflow.com/a/4918111/161052を参照してください。 – JYelton
この素晴らしいサンプルと説明を投稿していただきありがとうございます。他の人が興味を持っているかもしれない以下の追加をいくつか追加しました。ここのコードのいくつかは他の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;
}
}
//***********************************************************
投稿コード。コントロールの幅と高さを変更することでサイズを変更できます。 –
Andrew Keithのコメントのため、変更された質問とスクリーンショットへのリンクが追加されました。ユーザーはフォームのサイズを変更できる必要があります。 –
パネルで私のソリューションを参照してください:http://stackoverflow.com/a/8848440/640781 – edid