📄 如何调用propertysheet函数.txt
字号:
其实你这样做的意义不大,因为VB提供了Tab控件和TabStrip控件(包括在Windows Common Controls中),它们都可以实现你要的功能,而又比较简单。而你在VB中调用PropertySheet很麻烦。在VC++中之所以很多人愿意使用PropertySheet,主要是在VC++中每个属性页都相当于一个对话框,可以象对话框资源一样编辑,非常方便。但在VB中却没有简单的方法编写对话框资源,这样使用PropertySheet函数就意味着无法利用VB可视化编辑的长处。下面我会简单地说明你到底错在那里,如果你坚持使用这个函数,可以根据下面的说明去修改、调试,不过比较麻烦。如果你决心采用现成的控件,下面的说明可以帮助你提高一下调用API的水平。
你的声明和调用部分都有错误。
声明部分的主要错误是对Union和LPCTSTR的转换。
两个主要的结构中都有Union定义,如PROPSHEETHEADER中的
union {
HICON hIcon;
LPCTSTR pszIcon;
};
VB没有与这种结构对应的类型,在VC++中hIcon和pszIcon占用同样的空间,在转换为VB时,你必须做一个取舍,要么声明为hIcon As Long,要么为pszIcon As Long,而不能两个都有。你在PROPSHEETPAGE中好象注意了这个问题,但PROPSHEETHEADER中的有关声明都是错的。
另一个问题是LPCTSTR类型,这个类型实际上就是一个指针,占4个字节(和Long相同)。你不能把它声明为String,因为它和VB的String不相同。通常是将这种类型定义为Long,这样可以保证兼容,当然这样做调用起来不太方便。你可能会奇怪为什么如果是一个函数的参数是LPCTSTR,你可以将其定义ByVal ... As String,而在这里不行。那是因为在你声明函数参数,VB会做特殊处理,以保证两者兼容,而对于结构中的LPCTSTR,VB不会做特殊处理。
调用部分的错误更多。首先如果你使用CreatePropertySheetPage的话,每次你只能建立一个页面,而不能象你现在这样想一次建立两个页面。而且如果你在psh.dwFlags中使用 PSH_PROPSHEETPAGE,psh.phpage将被忽略,你使用CreatePropertySheetPage建立的页面就起不到作用了。如果你使用CreatePropertySheetPage,你就不能使用PSH_PROPSHEETPAGE,这两个是互斥的。你不能使用psh.pfnCallback = vbNull,而应该使用psh.pfnCallback = 0,vbNull并不等于0。而且通常你应该指定一个pfnCallback函数,这通常可以使用VB的AddressOf来获得函数的地址,但这个也正是PropertySheet函数在VB中不好用的一个方面,非常麻烦,而且容易出错。一个最大的问题是你的对话框资源呢?自始至终都没有看到你的对话框资源在哪里。从你使用PSP_DLGINDIRECT来看,你似乎想使用DLGTEMPLATE,但你并没有设置有关的成员。即使你建立了DLGTEMPLATE,向里面添加控件也是很烦的。
<END>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -