Wizard / Property Sheets на VB реально сделать?

Узнай цену своей работы

Формулировка задачи:

Ну то что через API это понятно.
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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5