注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

禁止窗体resize  

2012-08-30 20:57:38|  分类: win32 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
解法一:SetWindowLong 调整 window style
  dwStyle &= ~(WS_SIZEBOX|WS_MAXIMIZEBOX);
要记得 SetWindowPos() 让其生效
与DX一起用的时候,可能导致 device lost。


解法二:利用 WM_GETMINMAXINFO

case WM_GETMINMAXINFO:
  mmi = (MINMAXINFO*)lParam;
  mmi->ptMinTrackSize.x = 800;
  mmi->ptMinTrackSize.y = 600;
  mmi->ptMaxTrackSize.x = 800;
  mmi->ptMaxTraceSize.y = 600;
  break;

(这个消息其实不是用来干这个的,这样用也有问题)


解法三:利用 WM_NCHITTEST

case WM_NCHITTEST:
  {
    LRESULT hit = DefWindowProc(hWnd, msg, wParam, lParam);
    if (hit == HTMAXBUTTON ||
        hit == HTLEFT              ||
        hit == HTRIGHT            ||
        hit == HTTOP                ||
        hit == HTTOPLEFT       ||
        hit == HTTOPRIGHT     ||
        hit == HTBOTTOM       ||
        hit == HTBOTTOMLEFT ||
        hit == HTBOTTOMRIGHT)
    {
      return HTNOWHERE;
    }
  }
  break;

通过屏蔽点击区域来禁止 resize,这个方案是最佳的。

解法三续:还要处理 Windows Vista/7 中的 aero mode

// Windows Vista/7 开始的 aero mode,会导致 WM_NCHITTEST 中通过 DefWindowProc() 拿不到
// HTMAXBUTTON;而在 non-aero mode 下,处理 WM_NCLBUTTONUP/WM_NCLBUTTONDOWN 还会导致最大化。
// 所以两个地方都处理下。 - -!
switch (msg)
{
case WM_NCHITTEST:  // non-Aero mode
  {
  LRESULT hit = DefWindowProc(hWnd, msg, wParam, lParam);
  if (hit == HTMAXBUTTON  ||
      hit == HTLEFT       ||
      hit == HTRIGHT      ||
      hit == HTTOP        ||
      hit == HTTOPLEFT    ||
      hit == HTTOPRIGHT   ||
      hit == HTBOTTOM     ||
      hit == HTBOTTOMLEFT ||
      hit == HTBOTTOMRIGHT)
  {
    return HTNOWHERE;
  }
  }
  break;

case WM_NCLBUTTONUP:  // Aero mode
case WM_NCLBUTTONDOWN:
  if (wParam == HTMAXBUTTON  ||
      wParam == HTLEFT       ||
      wParam == HTRIGHT      ||
      wParam == HTTOP        ||
      wParam == HTTOPLEFT    ||
      wParam == HTTOPRIGHT   ||
      wParam == HTBOTTOM     ||
      wParam == HTBOTTOMLEFT ||
      wParam == HTBOTTOMRIGHT)
  {
    return 0;
  }
  break;

case WM_NCLBUTTONDBLCLK:
  if (wParam == HTCAPTION)
    return 0;
  break;
}

虽然 MSDN 中说,Vista 之后在处理 WM_NCHITTEST 时,可以先调用 DwmDefWindowProc() 尝试获取下。
但我测试是无效的。坑啊~

  评论这张
 
阅读(911)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017