windows编程学习任重而道远。一个tab控件折腾好久才勉强能用,还有好多问题存在。暂且将已经实现的记录下来。
首先,初学windows编程,就算知道了一个控件的所有信息,没有示例,学起来也是很迷茫的。msdn官网方文档中有一个叫using...的模块,很有帮助。
就像上方所示,参考using tab controls中的示例代码,能让初学者在使用控件的时候省力不少。
tab控件在dialog和window中的使用方法不同。常规操作中,在window中,为tab的每一页创建或绑定一个子window,而在对话框的使用中,为tab的每一页绑定一个子对话框。
笔者编写的是基于对话框的程序,所以需要为每一页绑定一个子对话框。
依据官方文档给出的做法,首先定义一个struct,用以存储tab的信息。
#define C_PAGES 3
typedef struct tag_dlghdr {
HWND hwndTab; // tab control
HWND hwndDisplay; // current child dialog box
RECT rcDisplay; // display rectangle for the tab control
DLGTEMPLATEEX *apRes[C_PAGES];
} DLGHDR;
struct中的各项定义的含义代码后面的注释已经给出,相当清除,此处不再赘述。
但笔者在使用的时候出现了一个问题。就是找不到DLGTEMPLATEEX的头文件,不知要引入何种头文件才能使用它。在网上搜寻了一番也无果。最后还是看文档中给出的说法解了疑惑。这里说明认真阅读官方文档是很重要的一件事,很多东西人家都说的很清楚了,不去仔细看却到网上一通乱找,及其浪费时间。
DLGTEMPLATEEX结构体用以描述扩展对话框,并且指定其控件个数。在官方文档中有这样一句话:The DLGTEMPLATEEX structure is not defined in any standard header file.
即它不在标准库中定义。至于其在哪里定义,网上似乎有些线索,不过俺没搜出来。笔者的做法是自己将该结构体定义出来。
typedef struct {
WORD dlgVer;
WORD signature;
DWORD helpID;
DWORD exStyle;
DWORD style;
WORD cDlgItems;
short x;
short y;
short cx;
short cy;
sz_Or_Ord menu;
sz_Or_Ord windowClass;
WCHAR title[titleLen];
WORD pointsize;
WORD weight;
BYTE italic;
BYTE charset;
WCHAR typeface[stringLen];
} DLGTEMPLATEEX;
这样结构体就不缺了。本来以为之后就可以快快乐乐地进行下一步了,却发现sz_Or_Ord并非一个标准文档中的类型,该类型在哪里定义,或是其是何含义,皆不知道。在官网上找,只知道其为16位元素组成的可变长度的数组。一通搜索,发现有位仁兄如此定义:
#define sz_Or_Ord WORD
很有效,可以使用。并且在结构体定义的其他变量中,此方法也很适用