如何调用PropertySheet函数
编号:QA004344
建立日期: 2001年8月20日 最后修改日期:2001年8月20日
所属类别:
江雯:
Visual Basic 6.0 企业版
Windows 2000 Professional
以下是我翻译VC++ 的声明不知道对不对。(我想写一个Tabstrip可是调用以下函数后,没有效果,请帮我看看以下代码好吗!谢谢先了!)
Private Declare Function PropertySheet Lib "Comctl32" Alias "PropertySheetA" (lppsph As PROPSHEETHEADER) As Long
Private Declare Function CreatePropertySheetPage Lib "Comctl32" Alias "CreatePropertySheetPageA" (lppsp As PROPSHEETPAGE) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Type INITCOMMONCONTROLSEXS
dwSize As Long
dwICC As Long
End Type
Private Declare Function INITCOMMONCONTROLSEX Lib "Comctl32" Alias "InitCommonControlsEx" (lpInitCtrls As INITCOMMONCONTROLSEXS) As Long
Private Type PROPSHEETPAGE
dwSize As Long
dwFlags As Long
hInstance As Long
pszTemplate As String
'pResource as long
'hIcon as long
pszIcon As String
pszTitle As String
pfnDlgProc As Long
lParam As Long
pfnCallback As Long
pcRefParent As Long
pszHeaderTitle As String
pszHeaderSubTitle As String
End Type
Private Type PROPSHEETHEADER
dwSize As Long
dwFlags As Long
hwndParent As Long
hInstance As Long
'hIcon as long
pszIcon As String
pszCaption As String
nPages As Long
'-----------------------
nStartPage As Long
pStartPage As String
'-----------------------
'-----------------------
ppsp As PROPSHEETPAGE
phpage As Long
'-----------------------
pfnCallback As Long
hbmWatermark As Long
pszbmWatermark As String
hplWatermark As Long
'-----------------------
hbmHeader As Long
pszbmHeader As String
'-----------------------
End Type
Private Const SW_SHOW = 5
Private Sub Form_Load()
Dim lps As INITCOMMONCONTROLSEXS
lps.dwICC = ICC_PAGESCROLLER_CLASS
lps.dwSize = len(lps)
Call INITCOMMONCONTROLSEX(lps)
Dim psp(1) As PROPSHEETPAGE
Dim psh As PROPSHEETHEADER
psp(0).dwSize = Len(psp(0))
psp(0).dwFlags = PSP_DLGINDIRECT Or PSP_HASHELP
psp(0).hInstance = App.hInstance
psp(0).lParam = 0
psp(0).pfnCallback = vbNull
psp(1).dwSize = Len(psp(1))
psp(1).dwFlags = PSP_DLGINDIRECT Or PSP_HASHELP
psp(1).hInstance = App.hInstance
psp(1).lParam = 0
psp(1).pfnCallback = vbNull
Dim V&, S&
V& = CreatePropertySheetPage(psp(0))
psh.dwSize = Len(psh)
psh.dwFlags = PSH_USEPSTARTPAGE Or PSH_PROPSHEETPAGE
psh.hwndParent = Me.hwnd
psh.hInstance = App.hInstance
'psh.nPages = 1
psh.pStartPage = 0
psh.pszCaption = "sv"
psh.phpage = V&
psh.pfnCallback = vbNull
ShowWindow V&, 5
S& = PropertySheet(psh)
MsgBox V& & " " & S&
'错误 S 为-1
End Sub
回答:
其实你这样做的意义不大,因为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,向里面添加控件也是很烦的。
此问题由李海回答。
| |
|
|
| |
|
|