zoukankan      html  css  js  c++  java
  • DuiLib学习笔记5——标题栏不能正常隐藏问题

    我之前代码都是照着官方那个Duilib入门文档.doc来学习的。但是遇到一个问题,虽然他隐藏了windows的自带标题栏,可以自己绘画一个标题栏了,但是在这个标题栏下方,用力乱戳,就可能把系统自带的,最小化,最大化,关闭按钮戳出来。如下图:

    我问了群里的朋友,都说可能是WM_NCHITTEST的问题。于是我去handle里多加了一个if判断

    else if( uMsg == WM_NCHITTEST) {
    	return 0;
    }
    

    结果虽然解决了问题,但是我自己的按钮都失效了。通过debug发现,只要鼠标进入我们程序界面,就会触发WM_NCHITTEST。所以return掉太暴力了。

    后来在一个博客里发现了一个解决方案http://tunps.com/ws_caption-cause-duilib-program-title-bar-cannot-hide

    LRESULT CMainDlg::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    	LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
    	styleValue &= ~WS_CAPTION;
    	::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
    	//.....
    }
    

    我试着去写了个OnCreate无效。后来把代码试着改了下,在创建窗体后,就对窗体进行set,生效了。

    官方教程里的创建代码如下:

    CFrameWindowWnd* pFrame = new CFrameWindowWnd();
        if( pFrame == NULL ) return 0;
        pFrame->Create(NULL, _T("测试"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
        pFrame->ShowWindow(true);
    

    我改了一下改成这样:

    CFrameWindowWnd* pFrame = new CFrameWindowWnd();
    if( pFrame == NULL ) return 0;
    pFrame->Create(NULL, _T("测试"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
    LONG styleValue = ::GetWindowLong(*pFrame, GWL_STYLE);
    styleValue &= ~WS_CAPTION;
    ::SetWindowLong(*pFrame, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
    pFrame->CenterWindow();
    pFrame->ShowWindow(true);

    运行后,果然一切正常了。在此代码基础上,我觉得既然是set,那么原来create的时候就应该可以控制这两个参数。跟上面create代码一对比,我就做了一个尝试,把这两个属性替换掉,改成如下:

    CFrameWindowWnd* pFrame = new CFrameWindowWnd();
    if( pFrame == NULL ) return 0;
    pFrame->Create(NULL, _T("测试"), WS_CLIPSIBLINGS, WS_CLIPCHILDREN);
    pFrame->CenterWindow();
    pFrame->ShowWindow(true);

    官方文档创建时的参数是UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE把他们换成WS_CLIPSIBLINGS, WS_CLIPCHILDREN就可以了

    运行后一切正常,很努力的戳也戳不出那些隐藏按钮了。

    由于整个没有官方文档,本人也不太可能去慢慢阅读源码,所以这样的代码试出来的,多少以后可能存在隐患。群里很多朋友都是靠读官方的demo,看其他朋友写的demo来学习的,的确没有其他快捷有效途径,但是现在就只能先这样了。

  • 相关阅读:
    fork 函数 和vfork 函数的区别
    进程时间
    输出子进程状态
    二维字符串数组字典排序
    括号匹配
    队列实现二叉树层序遍历
    二叉查找树
    分块查找
    JS中的className含义
    Java打印温度转换表
  • 原文地址:https://www.cnblogs.com/duguxue/p/3818243.html
Copyright © 2011-2022 走看看