自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 收藏
  • 关注

原创 wabc库程序设计-button

在这一篇文章里,主要介绍如何编写一个button。读者看完这篇文章后,能掌握编写自绘控件的一些关键知识点。按钮(Button)是windows上一个常用的控件,很多应用程序里都有按钮的存在,同时,它的实现也是简单的,若没有自绘控件的经验,编写一个自定义的按钮是一个很好的练手项目。先看看标准的windows按钮。winmain.h#pragma once#include "wab...

2019-10-20 11:57:50 259

原创 wabc库程序设计-hello world

'wabc'库用作开发windows桌面程序,若你很擅长windows SDK编程的方式,会发现,'wabc'很适合你,它很小巧,但很高效,里面封装了一套消息处理框架,能极大减少消息处理的工作量。此系列文章主要介绍如何利用wabc库提供的功能开发桌面程序。一开始,请先下载wabc库的源码,编译成功后,打开'include'目录下的'wabc.h'文件,把'wabc.lib'的目录改成你当前的目...

2019-10-19 20:09:56 284

原创 wabc库编译说明

'wabc'库用作开发windows桌面程序,使用C++语言,以最小化的集合封装了常用的windows API,并包含一套消息处理框架。它源代码很小,不到500k,但很高效,使用的时候完全可以包含在自己的工程里。'wabc'库的目录结构如下:- wabc - dlib - include - lib - src -wabc其中:debug版本wabc.lib存...

2019-10-19 16:26:55 268

原创 用c++模拟属性

在支持属性的语言里,属性的使用是很轻松愉快的事情,它好像基本类型一样,可以直接赋值和取值。在c++语言里,并没有属性的语法,但它有union关键字,有操作符重载,依赖这两个语法,可以轻松的模拟属性的实现。这里以wabc库的basewnd为例,讲解设计和实现属性。class basewnd{public: HWND m_hWnd; //...};basewnd只有一个...

2019-10-19 12:42:57 235

原创 win32消息映射13-子类化和超类化

12 子类化和超类化回顾SDK窗口创建的过程。首先注册一个类,这里重要的是类名和窗口的回调函数,然后调用CreateWindowEx创建窗口,创建时必须指定类名,实际上也是指定了窗口的回调函数。windows操作系统内置了一些标准控件,供程序员使用。这些标准控件控件,不需要注册类名,系统已经帮你注册好,直接拿过来用就是了。比如按钮的类名是“BUTTON”,编辑框的类名是“EDIT”……,C...

2019-10-14 16:00:14 425

原创 win32消息映射12-对话框

11 对话框对话框是一种特殊的窗口,它起源于所见即所得(WYSIWYG)的设计思想。当使用api创建窗口的时候,界面的布局存在于程序员的脑海中,只有等代码完成了,能运行了,才能看到效果。有没有一种方式方式,能在设计的时候就能看到效果,不用等到运行的时候呢?在win32 SDK编程里,只有对话框能做到这一点。对初学者而言,对话框好像减少了入门的难度,但实际上,难度并没有减少,一个问题的解决又引入...

2019-10-11 09:37:14 234

原创 win32消息映射11-消息反射

10 消息反射在MFC里,有个消息反射的机制,就是窗口A发送消息给窗口B,窗口B再把这个消息回送到窗口A去,让窗口A自己处理。有时候这种用法很有用,能将窗口B的一些代码剥离到窗口A去,提高了代码的重用性。下面以WM_COMMAN消息为例,讲解如何实现消息反射。假设有如下场景,窗口A是个windows的标准button,它的ID是IDOK,当它被点击的时候,会发送一个BN_CLICKED的WM_...

2019-10-10 18:22:25 280

原创 win32消息映射10-处理WM_COMMAND和WM_NOTIFY消息

9 处理WM_COMMAND和WM_NOTIFY消息在标准的windows消息里,存在两类消息:1.是操作系统发送给窗口的消息;2.是窗口之间用作通讯的消息。我们前面举例的消息,都是windows操作系统发送给窗口的消息,但窗口之间通讯的消息,却一直没有举例,原因在于,窗口之间通讯的消息,其格式有些复杂。若一开始就将这些复杂性引入到介绍消息映射的原理上,这会加大对原理理解的难度。万丈高楼平地起...

2019-10-09 09:42:45 979 1

原创 win32消息映射9-inherited

8.inherited在讲继承的时候我们说过,若映射的回调函数返回false,就继续遍历下一个mapslot链表:class A : public wabc::wndbase{ WABC_DECLARE_MSG_MAP()public: // ... bool on_keydown(wabc::msg_keydown &msg) { ...

2019-10-08 08:12:49 131

原创 win32消息映射8-mapslot链表节点的删除

7. mapslot链表节点的删除mapslot链表节点的删除可能是这一系列文章里,逻辑最为复杂的一部分。原因在于,一个mapslot链表的节点,不一定都存在于一个对象里面。且一个节点处理函数里面,若SendMessage有可能回到了这个链表处理,这里就存在一个嵌套调用的问题。上一篇文章里说道,原先WndProc处理的逻辑,挪到了process_WM函数:void wndproc::...

2019-10-03 16:08:09 185

原创 win32消息映射7-窗口的创建和注销

6. 窗口的创建和注销在Delphi里,有个FormCreate和FormDestroy事件。FormCreate事件在Form创建之后发生,FormDestroy事件在Form销毁之前发生。我们在这里也引入类似的功能,但是和Delphi的这两个事件有所差别。这两个事件很有用,FormCreate相当于是整个窗口生命周期的入口,而FormDestroy,是整个窗口生命周期的出口。可以简单的...

2019-09-30 19:14:23 347

原创 win32消息映射6-继承

5.继承在basewnd里,定义了一个mapslot,由basewnd的派生类使用。当有一个类,比如A,继承自basewnd,且A没有派生类了,这一机制会运行得很好,但若A也有派生类,且A的派生类也有消息映射的需求,这一机制就不能满足需求。若A的派生类也有派生类呢……?这说明,只有一个mapslot已经不能满足我们的需求。现在的需求是必须有n(n>=1)个mapslot:每当一个cl...

2019-09-29 08:30:09 184

原创 win32消息映射5-msg_struct的变异体

4. msg_struct的变异体“变异体”这个名词不那么准确,但没有找到更好的名词之前,暂且先叫“变异体”。什么叫msg_struct的变异体,就是结构的大小和内存布局和msg_struct一样的,就叫做msg_struct的变异体。重温msg_struct的定义:struct msg_struct{ HWND hwnd; UINT message;...

2019-09-27 11:08:51 224

原创 win32消息映射4-优化第二次的改进

3.优化第二次的改进。在上一篇文章,我们讲到,在做消息映射时,每一次都要new一个msg_handler_base的派生类,这必然有个delete,为了delete这个派生类,在msg_handler_base的构造函数里,定义了一个全局变量g_manager,g_manager在析构时候把msg_handler_base的派生类全部干掉,这无疑会增加内存和性能开销,有没有办法避免这情况的发生...

2019-09-26 11:22:47 167

原创 win32消息映射3-第二次改进

2.第二次改进。现在想想,如何解决switch case的问题。switch case的作用,是将某个消息分配到某段处理代码上,这个问题可以抽象成,如何让某个消息和某个函数关联,一旦关联,我们将能编写如下代码:class MyWindow : public base_wnd{public: void on_paint( HDC hdc, const RECT & rt...

2011-05-24 20:23:00 975 1

原创 win32消息映射2-第一次改进

1.第一次改进我们先解决私有数据的问题。查阅MSDN的CreateWindow的帮助,我们发现,CreateWindow的最后一个参数是lpParam,这表明,这是一个用户数据。这个参数起什么作用?答案就在WM_NCCREATE和WM_CREATE消息中,当一个窗口接收到WM_NCCREATE或WM_CREATE消息时,lParam会指向一个CREATESTRUCT地址,而CREATEST...

2010-12-19 13:14:00 1616 1

原创 win32消息映射1-基本的SDK程序

win32程序是靠消息驱动,消息映射是win32编程的一大主题,作为win32平台上程序员,绝对有必要深入了解消息在程序中的流动。消息映射在MFC的实现里,是用宏定义出一颗庞大的消息树,当有消息到来的时候,遍历这棵消息树去寻找对应的处理函数,但在流动的时候,有一个优先级的问题(关于这问题在《深入浅出MFC》里有阐述),这优先级会常常使人陷入迷惑当中。而在delphi里,消息映射直接由编译...

2010-12-17 21:56:00 2403

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除