MFC实现无标题栏的相对完美简易的方法

来源:互联网 发布:去黑头方法 知乎 编辑:程序博客网 时间:2024/06/05 19:32

1、  修改窗口风格,去掉WM_SYSMENU风格。(MFC主窗口默认WS_OVERLAPPEDNWINDW风格,带有WS_THICKFRAME,这个风格很重要,如果没有,系统不会为你实现可以改变窗口大小的功能,需要自己实现,所以如果没有这个风格要设置。)

    ModifyStyle(/*WS_BORDER  | WS_THICKFRAME*/WS_SYSMENU, 0);

2、  处理WM_NCCALCSIZE消息:

3、   lpncsp->rgrc[0].top +=GNOMECAPTION_HEIGHT  - m_rcBorders.top;

4、   lpncsp->rgrc[0].left += 6 -m_rcBorders.left;

5、   lpncsp->rgrc[0].right -= 6 -m_rcBorders.right + 1;

6、   lpncsp->rgrc[0].bottom -= 6 -m_rcBorders.bottom + 1;

7、   

8、 //CFrameWnd::OnNcCalcSize(bCalcValidRects,  lpncsp);

不要调用基类OnNcCalcSize函数,否则会混乱。

3、处理WM_NCPAINT消息,画自己的非客户区:

    CWindowDC dcWindow(this);

    CRect rc;

     GetWindowRect(&rc);

    CRect rcClient;

     GetClientRect(&rcClient);

    ClientToScreen(&rcClient);

 

    rcClient.OffsetRect(-rc.TopLeft());

    rc.OffsetRect(-rc.TopLeft());

 

    CRgn rgnClient;

    rgnClient.CreateRectRgnIndirect(rcClient);

 

    CRgn rgnWindow;

    rgnWindow.CreateRoundRectRgn(rc.left,rc.top, rc.right, rc.bottom,  11, 11);

 

    dcWindow.SelectClipRgn(&rgnWindow);

    dcWindow.SelectClipRgn(&rgnClient,RGN_XOR  );

    //画出非客户区即可。

4、特别重要的一步,处理WM_NCACTIVE消息,告诉系统,我们已经处理了,不需要系统再处理(否则系统将再会绘制出标题栏和外边框)

         在消息中返回非0值即可。

5All done!

为什么说相对完美,嗯,因为如果想带有标题栏时,如果最大化时,标题栏显示的不太完整(在垂直方向上少一些)。

原创粉丝点击