Wizard / Property Sheets на VB реально сделать?
Формулировка задачи:
Ну то что через API это понятно.
How to Create Wizards
About Property Sheets
При первичном чтении меня смущают фразы про Dialog Box Templates.
В VB6 обычно формы/диалоги в ресурсы не запихиваются.
Хотя подобный ресурс полагаю легко сварганить в VC++ 6.0 и засунуть в res файл.
В любом случае опыта здесь нет.
Направьте мысли.
М.б. примеры какие?
How to Create Wizards
About Property Sheets
При первичном чтении меня смущают фразы про Dialog Box Templates.
В VB6 обычно формы/диалоги в ресурсы не запихиваются.
Хотя подобный ресурс полагаю легко сварганить в VC++ 6.0 и засунуть в res файл.
В любом случае опыта здесь нет.
Направьте мысли.
М.б. примеры какие?
Решение задачи: «Wizard / Property Sheets на VB реально сделать?»
textual
Листинг программы
Public Const PSH_USECALLBACK = &H100 'Calls the function specified by the pfnCallback member
'Dialog Box Structures
Public Type DLGTEMPLATE
style As Long
dwExtendedStyle As Long
cdit As Integer
x As Integer
y As Integer
cx As Integer
cy As Integer
End Type
Public Type DLGTEMPLATEEX
dlgVer As Integer
signature As Integer ' If signature is 0xFFFF, this is an extended dialog box template
helpID As Long
exStyle As Long
style As Long
cDlgItems As Integer
x As Integer
y As Integer
cx As Integer
cy As Integer
'...ХЗ
End Type
'PropSheetProc callback function
'uMsg -Message being received.
Public Const PSCB_INITIALIZED = 1
Public Const PSCB_PRECREATE = 2 'not applicable if Aero wizard
...
Dim psh As PROPSHEETHEADER
With psh
...
If sys_WinVista Then
.dwFlags = PSH_WIZARD Or PSH_AEROWIZARD Or PSH_USEICONID Or PSH_USECALLBACK
...
Else
.dwFlags = PSH_WIZARD97 Or PSH_HEADER Or PSH_WATERMARK Or PSH_USECALLBACK
...
End If
.pfnCallback = FARPROC(AddressOf PropSheetProc)
...
End With
PropertySheet psh
End Sub
Private Function PropSheetProc(ByVal hwndDlg As Long, ByVal uMsg As Long, _
ByVal lParam As Long) As Long
Dim IntSignature As Integer 'pDlgTemplateEx->signature
Dim pDlgTemplate As DLGTEMPLATE
Dim dwStyle As Long
Debug.Print uMsg
Select Case uMsg
Case PSCB_PRECREATE
'способ #1:это не работает на PSH_AEROWIZARD!!!
'Debug.Print "PSCB_PRECREATE"
Call CopyMemory(IntSignature, ByVal (lParam + 2), 2)
Debug.Print IntSignature
If IntSignature <> &HFFFF Then 'if (pDlgTemplateEx->signature != 0xFFFF)
Call CopyMemory(pDlgTemplate, ByVal lParam, Len(pDlgTemplate))
pDlgTemplate.style = pDlgTemplate.style And Not WS_SYSMENU
Call CopyMemory(ByVal lParam, pDlgTemplate, Len(pDlgTemplate))
'Call CopyMemory(dwStyle, ByVal lParam, 4) 'pDlgTemplate->style
'dwStyle = dwStyle And Not WS_SYSMENU
'Call CopyMemory(ByVal lParam, dwStyle, 4)
Else 'хотя это вряд ли понадобится
Call CopyMemory(dwStyle, ByVal (lParam + 12), 4) 'pDlgTemplateEx->style
dwStyle = dwStyle And Not WS_SYSMENU
Call CopyMemory(ByVal (lParam + 12), dwStyle, 4)
End If
Case PSCB_INITIALIZED
'способ #2:а вот это работает и на PSH_AEROWIZARD, и на PSH_WIZARD97
'Debug.Print "PSCB_INITIALIZED"
If sys_WinVista Then 'ну не дважды же его устанавливать (для PSH_WIZARD97)
Call SetWindowLong(hwndDlg, GWL_STYLE, GetWindowLong(hwndDlg, GWL_STYLE) And Not WS_SYSMENU)
End If
Case Else
End Select
End Function