注册一个窗口类并且创建了窗口之后,就有了一个窗口句柄HWND和一个窗口实例HINSTANCE。那么,是哪个东西使得我们可以创建一个窗口的多个实例?是不是用HWND 来创建多个HINSTANCE?有没有这方面的例子,比如在MSDN上? 我看了Program windows 5th这本书,想不通这两个到底是什么关系?有点糊涂了。比如在载入资源的时候,使用的是HINSTANCE,可为什么不是HWND呢?他们都能够代表同一个窗口吗?
To chehw(chehw):这样理解是不是正确:HWND只是主窗口的句柄,还可以有其他的子窗口、子控件的HWND,真正代表这个程序的是HINSTANCE?WinMain中的HINSTANCE代表的就是窗口实例,也就是窗口本身;用CreateWindow返回的就是主窗口的句柄?换句话说,真正代表这个程序,这整个主窗口的是HINSTANCE?
HWND:Handle to a window.一个进程窗口可以有很多个,但是自身实例只有一个.
HWND hWnd // handle to window
);和
HWND CreateDialogParam( HINSTANCE hInstance,
LPCTSTR lpTemplateName,
HWND hWndParent,
DLGPROC lpDialogFunc,
LPARAM dwInitParam
);为什么不同的函数有的会使用HWND,有的使用HINSTANCE? 能否用一个来代替呢?
-----------------------------------
因为两者代表了不同的意义啊,这些函数本来就是针对不同的句柄的,当然也就不能用一个来代替,你在获取这些句柄时用到的函数也是不一样的。
HINSTANCE是指向程序文件加载到内存中的首地址。
HWND是Windows下的一个用户对象。
系统提供三类对象:用户对象,GDI对象和内核对象。对象不能直接操作,只能通过handle来完成。
HWND的三类对象中用户对象中的一种。HCURSOR, HICON, HMENU, HDWP, HACCEL,HWND等均为用户对象。
CreateDialogParam中的hInstance指的是从哪儿加载对话框资源,是从程序本身的资源加载,还是从某个外部文件中加载。
hWndParent指的是对话框中的父窗口。
多个实例是指你可以在同一时间运行同一个应用程序多次。HWND是你在应用程序中创建的窗口,(应用程序可以是无窗口的)。
窗口对象是一个数据结构,系统根据它来显示常规界面的建立和维护。该数据结构不能直接操作,必须通过句柄(HWND)借助API来完成。
hinstance 对应于exe或dll
“窗口”不单只是最上层的含标题栏和菜单的Window, 文本框、组合框、工具栏、按钮、列表框等均为窗口。
“窗口”对象为一个数据结构。假设你定义了一个结构struct PERSON{TCHAR szName[100]; UINT gender;};则在程序中可以通过 PERSON p1; 这样的方法使用该对象。“窗口”也为一种数据结构,通过各成员变量和方法来响应消息和刷新屏幕等。但这种数据结构程序员不能直接访问,只能通过称为HWND的句柄来间接使用(无需理会系统处理的细节)。
若你在应用程序中创建了w个窗口对象,则每运行一个实例时就会有w个窗口。n个实例就会有n*w个窗口。