C#无边框窗体实现拖动大小加入了WS_THICKFRAME风格后如何去掉边框
2个回答
展开全部
如果想无边框,直接去掉WS_THICKFRAME不就行了嘛。那为什么还要有WS_THICKFRAME风格,再费劲去掉边框了?
没有WS_THICKFRAME会带来很多问题:
1.没有WS_THICKFRAME,有WS_SYSMENU,就没办法通过相应WM_NCHITTEST,去处理窗口的缩放。
2.没有WS_THICKFRAME,也没有WS_SYSMEN,在xp系统下任务栏就没有右键菜单弹出。
3.没有WS_THICKFRAME,也没有WS_SYSMEN,在xp系统任务栏里,想把右键菜单弹出是有方法,不过是个偏方,方法如下:
1)响应MS没有对外公开的0x313消息,在这个消息里面给主窗口加上WS_SYSMENU风格。
2)在任务栏菜单弹出来后,响应WM_INITMENUPOPUP消息,在这个消息里通过 HIWORD(lParam)
来判断是否为1,如果是1就表示是系统的菜单弹出(这个消息最后要给系统回调函数处理,不能直接return了);这个时候去掉WS_SYSMENU风格。这样一来一去,可以既弹出任务栏右键菜单,也不影响窗口缩放的处理。
4.现在任务栏右键菜单能弹出来了,可是还有一个问题,在xp系统下,当你窗口最大化了,你移动窗口,还是能移动。。。。
这个问题,你也可以通过其他方式去不让窗口在最大化时移动。但是你发现,在win7系统下,“窗口移动到边缘时自动排列窗口”的功能不能正常工作了。
也就是说,去掉WS_THICKFRAME会带来很多问题,但是你又想WS_THICKFRAME的情况下去掉边框,自己去画UI,哈哈,当你看到这里,恭喜你,有方法可以解决:
响应WM_NCCALCSIZE消息,消息响应函数如下(我这里给出的是wtl的):
LRESULT OnNcCalcSize( UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/ )
{
NCCALCSIZE_PARAMS* lpncsp = (NCCALCSIZE_PARAMS*)lParam;
if((BOOL)wParam)
{
lpncsp->rgrc[2] = lpncsp->rgrc[1];
lpncsp->rgrc[1] = lpncsp->rgrc[0];
}
return TRUE;
}
就这样一个消息拦截处理下,搞定。。。。。。
没有WS_THICKFRAME会带来很多问题:
1.没有WS_THICKFRAME,有WS_SYSMENU,就没办法通过相应WM_NCHITTEST,去处理窗口的缩放。
2.没有WS_THICKFRAME,也没有WS_SYSMEN,在xp系统下任务栏就没有右键菜单弹出。
3.没有WS_THICKFRAME,也没有WS_SYSMEN,在xp系统任务栏里,想把右键菜单弹出是有方法,不过是个偏方,方法如下:
1)响应MS没有对外公开的0x313消息,在这个消息里面给主窗口加上WS_SYSMENU风格。
2)在任务栏菜单弹出来后,响应WM_INITMENUPOPUP消息,在这个消息里通过 HIWORD(lParam)
来判断是否为1,如果是1就表示是系统的菜单弹出(这个消息最后要给系统回调函数处理,不能直接return了);这个时候去掉WS_SYSMENU风格。这样一来一去,可以既弹出任务栏右键菜单,也不影响窗口缩放的处理。
4.现在任务栏右键菜单能弹出来了,可是还有一个问题,在xp系统下,当你窗口最大化了,你移动窗口,还是能移动。。。。
这个问题,你也可以通过其他方式去不让窗口在最大化时移动。但是你发现,在win7系统下,“窗口移动到边缘时自动排列窗口”的功能不能正常工作了。
也就是说,去掉WS_THICKFRAME会带来很多问题,但是你又想WS_THICKFRAME的情况下去掉边框,自己去画UI,哈哈,当你看到这里,恭喜你,有方法可以解决:
响应WM_NCCALCSIZE消息,消息响应函数如下(我这里给出的是wtl的):
LRESULT OnNcCalcSize( UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/ )
{
NCCALCSIZE_PARAMS* lpncsp = (NCCALCSIZE_PARAMS*)lParam;
if((BOOL)wParam)
{
lpncsp->rgrc[2] = lpncsp->rgrc[1];
lpncsp->rgrc[1] = lpncsp->rgrc[0];
}
return TRUE;
}
就这样一个消息拦截处理下,搞定。。。。。。
追问
问题一样,解决方法用C#怎么解决
展开全部
把WS_BORDER样式去掉
SetWindowLong(this.Handle, GWL_STYLE, (uint)(GetWindowLong(this.Handle, GWL_STYLE) & ~WS_BORDER ));
WS_BORDER = 0x00C00000L;
GWL_STYLE = (-16);
哦,忘了一件事,你还要实现拖拽功能是吧,在Form的MouseDown里执行2个API,模拟拖拽
WM_NCLBUTTONDOWN = 0xA1;
HT_CAPTION = 0x2;
[DllImport("user32.dll")]
private extern static bool ReleaseCapture();
[DllImport("user32.dll")]
private extern static int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
//可以通过点击客户区,实现窗体的拖拽
void Form_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
SetWindowLong(this.Handle, GWL_STYLE, (uint)(GetWindowLong(this.Handle, GWL_STYLE) & ~WS_BORDER ));
WS_BORDER = 0x00C00000L;
GWL_STYLE = (-16);
哦,忘了一件事,你还要实现拖拽功能是吧,在Form的MouseDown里执行2个API,模拟拖拽
WM_NCLBUTTONDOWN = 0xA1;
HT_CAPTION = 0x2;
[DllImport("user32.dll")]
private extern static bool ReleaseCapture();
[DllImport("user32.dll")]
private extern static int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
//可以通过点击客户区,实现窗体的拖拽
void Form_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询