本文详细介绍智能ABC窗口的实现
高级顶层窗口是一种无标题栏、菜单、工具条的一种常居顶层的窗口,最常见的例子就是输入法窗口,比如智能ABC窗口。这类窗口的特点除了上边所说的,最重要的就是窗口移动。普通窗口移动是通过标题栏由系统自动实现的,对于这类窗口就无法依靠系统了,需要手工实现。实现的方法有两种:
- 手工处理WM_MOVE、WM_LBUTTONUP消息,并根据鼠标的移动自己实现窗口移动过程中的绘制;
- 在WM_MOVE消息处理函数中通过向自己发送参数wParam为HTCAPTION lParam为鼠标位置的WM_NCLBUTTONDOWN消息实现窗口移动,此时窗口移动过程的绘制由系统实现。
显然,后者较前者简单。本文采用后者。
为了实现移动,还要对窗口定义有效移动区域,就是当鼠标移动到窗口中哪部分时鼠标变为十字箭头,暗示现在可以按下左键开始拖动。本文实现的窗口中有四个紧密排列的位图“按钮”,它们之间没有空隙,所以我定义位图以外窗口以内为有效移动区域。鼠标进入这片区域时将变为十字箭头形状,提示用户现在可以进行拖动。
在定义窗口类时,如果窗口有边框,那么当鼠标在边框上时,接收到的是WM_NCMOUSEMOVE消息,所以为了在WM_MOUSEMOVE消息处理函数中统一处理,本文窗口没有使用边框,只要鼠标进入窗口,就开始接收到WM_MOUSEMOVE消息了。但这又引入另一个问题:如何绘制3D边框?本文使用了函数 :
void Draw3dRect( LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight)实现了3D边框的绘制。
本文实现的基本原理:
- 从CWnd直接派生一个窗口类CMainWnd,并添加一个共有函数bool CreateMainWnd()用来创建窗口;
- 在相应WM_PAINT时,在客户区中根据四个标记变量绘制相应的四个位图;
- 在WM_LBUTTONDOWN 消息处理中,检测鼠标是否落入某个“按钮”位图,设置相应标志,并强制系统重绘客户区;
- 在WM_MOUSEMOVE消息处理中,检测鼠标是否落入有效移动区域,并设置相应光标。如果按下了左键,就开始发送WM_NCLBUTTONDOWN消息,实现窗口移动;
- 为了关闭窗口,本程序设置了加速键F12,按F12可关闭程序;
代码如下:
作者:王海军 责编:豆豆技术应用
正在加载评论...
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……