zoukankan      html  css  js  c++  java
  • 窗口非客户区的绘制

    1.根据需要,要改变nc区的大小.
     响应WM_NCCALCSIZE可改变nc区的大小.关键在于lParam,msdn上说当wParam为True时,
     lParam为LPNCCALCSIZE_PARAMS的指定,当wParam为False时为LPRECT,做了些实验发现
     只有第一次时wParam为False,LPNCCALCSIZE_PARAMS的语义相当复杂,不过我们只用
     看第一个RECT就成.它表是窗口客户区的大小.当lParam为LPRECT时,也同样.只用改变
     客户区的大小,相应的就改变了非客户区的大小.


    2.响应WM_NCPAINT绘制窗口的Title和Border


    3.响应WM_NCHITTEST,在这里要做的是改变原来的HTMAXBUTTON,HTMINBUTTON,HTMINBUTTON 区域.


    4.响应WM_NCACTIVATE,在这里不能调用默认的处理因为当窗口是非激活状态时会画出默认的Title


    5.响应WM_ACTIVATEAPP,在这里先调用默认的处理.然后再自绘nc区.


    6.响应       

            0x00AE://WM_NCUAHDRAWCAPTION
            0x00AF://WM_NCUAHDRAWFRAME
     这两条消息是在xp sp2后加的.xp在以前有个bug在某些时候Titlebar会画错.
     在这里不能调用默认处理,直接自绘nc区.


    7.最后要响应WM_NCMOUSEMOVE,WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,
     WM_NCMOUSELEAVE,来处理Titlebar上的鼠标动作.

    另外最好调用SetWindowTheme(hWnd, L"", L""),和
    DWORD dwAttr = 1;
    DwmSetWindowAttribute(hWnd, 2, &dwAttr, 4));
    以防止xp,和vista用主题绘制窗口nc区.
    这两条函数分别是xp和vista特有的,所以只能动态加载相应的dll以调用之.

    发现在window2000 下当鼠标单击nc区时还是会画出默认的nc区。经过试验当鼠标单击时调用 LockWindowUpdate  这条函数就行了。使用方法。.

    LockWindowUpdate(hWnd);

    ..

    LockWindowUpdate(NULL);

  • 相关阅读:
    python数据类型-字典的练习
    python数据类型-元祖和字典类型、hash函数
    python数据类型-字符串
    python数据类型-列表练习
    python数据类型-列表
    iOS 熟悉CASharpLayer
    iOS 点击tableView的cell,让其滚到屏幕顶部
    iOS pop动画之弹性动画的基本使用
    iOS Json解析框架之MJExtension使用详解
    iOS pop动画之衰减动画的基本使用
  • 原文地址:https://www.cnblogs.com/d3inc/p/3799823.html
Copyright © 2011-2022 走看看