永发信息网

C#无边框窗体实现拖动大小加入了WS_THICKFRAME风格后如何去掉边框

答案:2  悬赏:30  手机版
解决时间 2021-12-03 02:55
  • 提问者网友:记得曾经
  • 2021-12-02 09:13
C#无边框窗体实现拖动大小加入了WS_THICKFRAME风格后如何去掉边框
最佳答案
  • 五星知识达人网友:何以畏孤独
  • 2021-12-02 09:59
把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);
}
}
全部回答
  • 1楼网友:十年萤火照君眠
  • 2021-12-02 10:38
如果想无边框,直接去掉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 , WPARAM wParam, LPARAM lParam, BOOL& )
  {
  NCCALCSIZE_PARAMS* lpncsp = (NCCALCSIZE_PARAMS*)lParam;
  if((BOOL)wParam)
  {
  lpncsp->rgrc[2] = lpncsp->rgrc[1];
  lpncsp->rgrc[1] = lpncsp->rgrc[0];
  }
  return TRUE;
  }
  就这样一个消息拦截处理下,搞定。。。。。。追问问题一样,解决方法用C#怎么解决
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯