问题1:
要在拖动其客户区时允许移动表单,您需要告诉窗口管理器将客户区视为标题栏(标题区域).你在问题中建议类似的东西.
这可以在.NET中通过覆盖表单的WndProc方法,响应WM_NCHITTEST消息,并返回HTCAPTION以指示所有内容应被视为标题(标题)栏的一部分而不是默认值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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题2:
您可以通过将表单的Region属性设置Region为您选择的自定义来创建任意非矩形形状的表单.如果您有使用Photoshop等图形程序的经验,可以将其视为为表单设置"剪裁区域":窗口管理器不会在您指定的范围之外绘制任何内容.所描述的形状中的像素Region甚至可以是不连续的.
创建区域的最简单方法可能是使用GraphicsPath类,然后使用接受单个对象作为参数的Region类的构造GraphicsPath函数.
正如我假设你已经知道的那样,在给出第一个问题时,你必须设置FormBorderStyle属性以None确保窗口管理器绘制的默认边框消失.
不幸的是,这些地区不能消除锯齿.有关这些限制的更多详细信息,请参阅Hans对此问题的回答.
最后,值得注意的是,后一种创建非矩形表单的方法可能会产生一些简直丑陋的用户界面,这些界面根本不会提高产品的可用性,如下所示:

请谨慎使用这种技术,并做出良好的判断.如果有疑问,矩形实际上是一个非常好的窗户形状.
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |