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来学习的,的确没有其他快捷有效途径,但是现在就只能先这样了。

DuiLib学习笔记5——标题栏不能正常隐藏问题,布布扣,bubuko.com

时间: 2024-10-27 00:07:47

DuiLib学习笔记5——标题栏不能正常隐藏问题的相关文章

DuiLib学习笔记4——布局

有了前面三篇的基础,现在可以开始布局了. 首先任何布局都必须包含在<Window></Window>标签内,跟<html></html>很像. DuiLib提供了两种布局方式,水平布局和垂直布局,虽然没有css左右浮动那么方便,但是有这些东西,完全可以像写页面table一样去完成. 水平布局是HorizontalLayout,垂直布局为VerticalLayout.在Window标签内,默认的是垂直布局. 下面来看一段代码,包含了水平和垂直布局. <?

Duilib学习笔记《05》— 消息响应处理

在Duilib学习笔记<04>中已经知道了如何将窗体显示出来,而如何处理窗体上的事件.消息呢? 一. 系统消息 窗体显示的时候我们就已经说了,窗体是继承CWindowWnd类的,对于窗体的部分消息的处理,需要重载该类的LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); 函数.在显示窗体部分我们创建窗体WM_CREATE消息以及屏蔽标题栏WM_NCACTIVATE.WM_NCCALCSIZE.WM_NCPAINT等消息 

DuiLib学习笔记1——编译运行demo

c++中皮肤问题比较麻烦,MFC自带的太难用.DirectUI界面库就比较强大了,之前像skin++之类的基于DirectUI收费昂贵.DuiLib是基于DirectUI的界面库,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率. duilib的SVN地址:http://duilib.googlecode.com/svn/trunk 下载后运行DuiLib.sln 编译时可能会遇到几个报错. 0.开发环境本身有问题,比如用win7没有装win7sdk之类的. 1. TestApp1

DuiLib学习笔记3——颜色探究

在前面两篇日志已经能使用xml了.今天准备好好的折腾一番,结果在颜色上却掉坑里了. 起初我在ps里取颜色为0104ff 这里01为R,04为G,ff为B 在控件的属性里有这样一个属性bkcolor="#0104ff".这个代码放进去后为黑色,并非我们期望的蓝色. 后来才发现在duilib里颜色正常的是8位,ps里的是6位.另外两位为A,是代表透明度的.在duilib中颜色的表达顺序为: ARGB 透明度|红色|绿色|蓝色 大家知道蓝色加点红色就会变成粉红色,所以我这里采用蓝色的背景,如

DuiLib学习笔记(二) 扩展CScrollbar属性

DuiLib学习笔记(二) 扩展CScrollbar属性 Duilib的滚动条滑块默认最小值为滚动条的高度(HScrollbar)或者宽度(VScrollbar).并且这个值默认为16.当采用系统样式的滚动条,或者 Troy的源码(https://github.com/qdtroy/DuiLib_Ultimate)自带的样式时,是没有问题的,因为这两种样式默认高(宽)度都是16,当滑块最小时,也有16*16,背景图片(九宫格式)不会出拉伸BUG.但是,当自定义背景图片时,如果图片本身大小超过16

Duilib学习笔记《06》— 窗体基类WindowImpBase

在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等…所以,能不能创建一个公有的窗体基类呢?其实,在duilib中已经提供了一个窗体基类 WindowImplBase:在基类内搭建窗口的消息框架,各处理函数为虚函数,子类可以重载处理函数,实现其处理. 此处我们以修改之前的代码为例来进行说明. 1. 窗体显示 CMainWndDlg类修改为继承Windo

Duilib学习笔记《03》— 控件使用

在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控件简介 在之前空白窗体的基础上,在界面上添加了一些控件,让大家先对这些控件效果有个基本的认识.如下图所示: 基本控件 高级控件 一些控件的基本显示效果就如同上面两幅图所示.实际上,在Duilib学习笔记<01>—duilib整体框架认识中我们就已经提到过Duilib这个库的组成,其中就提到了控件这

DuiLib学习笔记2——写一个简单的程序

我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新建一个win32项目 去DuiLib根目录,把目录下DuiLib文件夹拷贝到新建项目的根目录.再把这个项目添加进我们解决方案中. 从教程里面把以下代码粘贴到我们项目的stdafx.h中 // Duilib使用设置部分 #pragma once #define WIN32_LEAN_AND_MEAN

Duilib学习笔记《02》— 界面布局

1. 界面描述XML文件 Duilib主要是通过XML来进行界面的布局配置,程序通过读取并解析XML文件来创建对应的窗体.DuiLib的页面布局分为三类:窗体(Window).容器(Contain)和控件(Control).顾名思义窗体就是要创建的窗口,容器则相当于是窗体内的一个子窗体,可以在容器内添加容器或者控件,当然定义的位置也都是相对与容器内的左上顶点:控件就是一些常用的Button.Edit.Label等窗体上的基本元素. 容器经常使用的有VerticalLayout(垂直布局容器).H