- 博客(19)
- 资源 (2)
- 收藏
- 关注
原创 金山界面库分析(0)
资源下载地址:代码下载地址http://download.csdn.net/detail/nighsen/4628001word版本文档下载地址http://download.csdn.net/detail/nighsen/4628008
2012-10-09 11:19:41
5865
2
原创 金山界面库分析(10)
鼠标消息、窗口状态的管理首先来看CBkDialogViewImpl类的鼠标消息处理方法 OnMouseLeave方法:如果现在处于非跟踪的状态,那么调用_TrackMouseEvent并设置m_bTrackFlag;之后获取现在鼠标所悬停的控件,通过调用header,body和footer的BkGetHWNDFromPoint方法来判断,因为这三者覆盖整个客户区域如
2012-10-09 10:57:18
1901
原创 金山界面库分析(9)
渲染层的封装和隔离:BkSkin控件的绘制工作基本都封装到了Skin里面,如果控件对应的Skin存在的话,那么会按照Skin的描述进行绘制,在CBkWindow的DrawBkgnd方法中,使用Skin进行了绘制: CBkSkinBase*pSkin = BkSkin::GetSkin(m_style.m_strSkinName); if
2012-10-09 10:56:17
1543
原创 金山界面库分析(8)
如何进行绘制首先我们来看一下CBkDialogViewImpl类的绘制过程:CBkDialogViewImpl含有一个CBkImage类成员m_imgMem用于双缓冲绘制,在WM_SIZE消息处理函数中进行创建:m_imgMem.CreateBitmap(rcClient.Width(),rcClient.Height(),RGB(0,0, 0));CBkDialo
2012-10-09 10:52:43
1459
原创 金山界面库分析(7)
如何进行排版前面我们分析过对于WM_SIZE消息的处理过程,CBkDialogViewImpl窗口类在处理WM_SIZE消息时,调用了自身的_RepositionItems方法,在这个方法内对窗口上的虚拟控件进行处理,现在我们来详细看一下控件体系内是如何进行排版操作的。在_RepositionItems方法中定义了4个CRect变量,就是rcClient, rcHeader, rc
2012-10-09 10:51:32
1915
原创 金山界面库分析(6)
消息和事件的传递、分发、相应既然没有真实的窗口,那么也就不能使用windows的根据句柄来分发消息的方式了,我们需要创建自己的消息和事件分发体系。主要应该包括这几个方面:1. 接收真实窗口的消息,并将其转化虚窗口体系中的处理2. 虚窗口体系内有一套独立的消息分发机制,可以讲系统消息发至该接收的控件3. 虚窗口需要能够抛出事件的能力,因为虚窗口之
2012-10-09 10:39:36
2820
2
原创 金山界面库分析(5)
无窗口模式---逻辑树结构的建立对于无窗口的模式,各种控件之间的关系需要我们自己来维护,因为我们要进行消息传递,排版布局,创建等操作时都需要沿着各种包含关系来逐个调用,这样对于窗口中的控件就形成了一个逻辑上的树形结构。我们看一下CBkPanel类,这个类的名字就表示它是一个有包含功能的类,可以有自己的子节点。这个类有一个成员CAtlList m_lstWndChild,也就是每个CBk
2012-10-09 10:34:30
1572
原创 金山界面库分析(4)
如何创建一个模态对话框我们创建的窗口类从CBkDialogImpl继承而来,这个窗口就是一个模态的窗口,我们需要调用其DoModal方法,但是在界面库里面是如何实现的一个模态的对话框呢。核心就在这个类中的_ModalMessageLoop方法,我们来研究一下。 void _ModalMessageLoop() { BOOL bRet; MS
2012-10-09 10:32:01
1679
原创 金山界面库分析(3)
真实窗口的封装以及实窗口到虚窗口的转化所谓的DUI库,windowless都是在一个窗口体系内虚拟出来虚窗口概念,并且通过接管界面布局、消息传递和分发以及界面绘制来完成更优秀的界面效果。不过这些的根基却又都要落到真实的窗口上,所以在界面库中需要对真实窗口进行封装,并将真实窗口纳入到我们创建的控件体系当中,并在这个过程中完成windows消息的传递,鼠标键盘事件的分发处理,实窗口上的虚窗
2012-10-09 10:30:11
2056
原创 金山界面库分析(2)
统一的资源管理为了对界面资源进行管理,同时也为了方便替换,需要对使用的资源进行统一的管理。在BKLib中,资源管理主要由以下几种:BkBmpPool:HBITMAP资源池,用于统一管理HBITMAP,单例。BkFontPool:FONT资源池,用于统一管理FONT,单例。BkPngPool:PNG图片资源池,用于统一管理PNG图片,单例,使用GDI+。BkStrin
2012-10-09 10:23:52
1944
原创 金山界面库分析(1)
通过XML创建界面---对象的动态创建以及属性的设置为了界面可配置化和换肤,需要界面元素可以根据XML动态创建和设置属性。在BKLib中,CBkObject类就完成了这样的功能,主要负责类的创建和属性的设置。因为对象都是从XML动态创建的,动态的创建是一个类最基本的属性,所以其他类都从CBkObject派生。来看看这个类的四个方法:BOOL IsClass(LPCSTR l
2012-10-09 10:15:55
3763
原创 在C++实现反射
<br />反射这个特性在C++中是没有的。所谓反射,自己的认为就是通过一个名字就可创建、调用、获取信息等一系列的操作,这个在脚本语言里面是比较常见的,COM组件也类似,知道个ID名,就可以做很多的工作了。<br />看看JAVA中的描述:<br />JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。<br />JAVA反射机制主要提供了以下功能:在运行时判
2011-05-09 17:06:00
18988
4
原创 在C++实现委托
<br />在前面提到回调了,那么现在就开始说委托吧。个人是这么理解委托的,就是一件事你不做或者不能做或者不想做,那么就委托给别人做,我只调用别人的函数接口就可以了,也就是我要实现一个功能,我只要接口,实际的实现委托给别人,突然有一天我要做的事的逻辑发生了变化,那么我也不需要更改自己的调用,只需要被委托者更换一下逻辑就可以了。同时,如果在一定的场合下要调用很多相同形式的函数,那么使用委托将很方便。<br />在设计模式中状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托也可以接受多个实
2011-05-09 11:43:00
1929
1
原创 在C++实现回调(续)
Method6:使用类的非静态函数作为回调(采用thunk的方法2)在上面的实现过程中,可以看出来主要的部分就是这里: bMovEcx = 0xB9; dwThis = (DWORD)pThis; bJmp = 0xE9; dwRealProc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(THUNK)));意思就是Move Ecx pThis; 即把this指针保存到了ECX的寄存
2011-05-06 13:43:00
1668
原创 在C++实现回调
来看看怎么在C++中实现回调吧。Method1:使用全局函数作为回调在C语言中的回调很方便。当然,我们可以在C++中使用类似于C方式的回调函数,也就是将全局函数定义为回调函数,然后再供我们调用。typedef void(*pCalledFun)(int *);void GetCallBack(pCalledFunparafun){/*do something*/}如果我们想使用GetCallBack函数,那么就要实现一个pCalledFun类型的回调函数:void funCallback(int *iNum
2011-05-06 13:22:00
8638
2
原创 在C++实现”Final”
<br />在C#中有sealed关键字,而Java中有final关键字,其作用就是为了提供一种机制使一个类不能被继承。当然,C++不能^_^,但是他能实现,下面来讨论一下吧。<br /> <br />Method1:最简单的想法就是使一个类得构造函数和析构函数成为私有函数,这样,子类的构造函数和析构函数就无法调用父类的构造函数和析构函数,也就难以构造或者析构父类对象,就可以了。当然,这样我们也无法构造对象,这个,我们可以采用静态方法来创建和释放类得实例。如下:<br />class NoDerivedCl
2011-04-26 10:04:00
4004
原创 VBScript实现inputbox多输入框和inputbox和checkbox框
VBScript实现inputbox多输入框和inputbox和checkbox框
2010-09-09 13:08:00
9708
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人