MindScape

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  44 随笔 :: 17 文章 :: 48 评论 :: 4 引用

公告

2005年8月23日 #

Wndows中Window Management 的设计
是很符合OO思想。

首先每个Window的定义由WNDCLASS结构定义。在WNDCLASS中我们需要给出
Window class name, Window的class style, 以及Wndow Procedure,WNDCLASS还提供了申请
extra class bytes 和extra window byte的能力。这两个空间可以类比的理解为class static fields和
object fields。和一般的class定义一样,WNDCLASS结构定义了Window对象的状态和行为。
这样凡是同类的Window不论它的位置,大小以及窗口属性如何都可以使用同一个WNDCLASS.
而对于行为有所不同的Window我们亦可以通过Sub-classing的方式通过改变其中一些消息
的行为得到所需的效果,这个方式事实上等同于override virtual method了,当然还有super-classing的说法。
每一个WNDCLASS在使用之前必须先注册到Win32 User Module中,随后用户即可使用CreateWindow创建Window实例了,值得注意的是在CreateWindow是我们并不是获取该WNDCLASS结构的指针来说明所使用的WNDCLASS的,而是通过Window class name, 如果将这些API在C#里面重写一下就可以看到一个很熟悉的设计。
class WindowManager
{
     public static void RegisterWindowClass(WindowClass wc);
     public static IWindow CreateWindow(string windowClassName, CreateWindowParameters params);
     //...
}
没错,Factory method, 事实上我们也正是靠这个方式重用了Common Controls.
这里我将返回的HWND写成IWindow接口,因为我觉得hwnd对于一系列Window function就如同this指针对于成员方法一般。hwnd应该被认为是C函数中的this指针,而不是Window对象的私有数据成员,事实上Window对象的数据封装做的非常到位,没有暴露出一个内部数据结构。
思路断掉了,以后再写。。。
posted @ 2005-08-23 00:48 Jonny Yu 阅读(344) 评论(0) 编辑

这两个是Win16系统遗留下来的产物了
在Win16API中WndProc有两个参数
一个是WORD类型的16位整型变量
另一个是LONG类型的32位整型变量,
因此根据匈牙利命名法,16位的变量就被命名为wParam,
而32位的变量就被命名为lParam。

到了Win32API中,原来的16位变量也被扩展为32位,
因此wParam和lParam的大小完全相同。
在Win32API的早期,为了保证和Win16API的代码可移植性
MS定义了WPARAM和LPARAM两个宏
当时保留了w前缀的原因一方面是由于WPARAM宏也已W开头,
还有也因为要提醒程序员注意到可移植性,当然到了现在
Win16早已退出历史舞台,这个前缀也就约定俗成的沿用下来了。

posted @ 2005-08-23 00:03 Jonny Yu 阅读(828) 评论(0) 编辑