Carte du site
 Remerciements
 Netiquette
 Bugs
 Tables
 Requêtes
 Formulaires
 États (rapports)
 Modules
 APIs
 Chaînes
 Date/Time
 Général
 Ressources
 Téléchargeables

 Termes d'usage

APIs: Enlever les boutons Min/Max/Close d'un état en pré visionnement

Author(s)
Terry Kreft et Keri Hardwick

Enlever les boutons Min/Max/Close d'un état en pré visionnement

Pour enlever les boutons Minimise, Maximise, et Restore d'un état en pré visionnement, il faut créer une barre d'outils personnalisée permettant à l'utilisateur de fermer l'état et il faut également utiliser les fonctions de l'API pour enlever le texte de la barre titre de la fenêtre de pré visionnement. De cette façon, vous pouvez maximiser l'état pour qu'il occupe tout l'espace disponible dans la fenêtre d'Access sans automatiquement faire apparaître les boutons de contrôle.

Pour référence, voici les étapes que j'ai utilisé:

  1. Dans chaque état, procédure événementielle Deactivate:
  2. DoCmd.Close acReport, Me.Name
  3. Je possède un formulaire de menu principal(frmStart) qui est toujours ouvert et qui constitue le seul endroit "légal" où on peut quitter l'application. Dans ce formulaire, je déclare:
  4. Dim CanClose as Integer
    Dans la procédure événementielle Open:
    CanClose = 0
    et  Unload:
    If Not CanClose Then
        Cancel = True
        Forms!frmStart.Visible = True
        'le formulaire est caché lorsque l'état est en prévisionnement
        DoCmd.SelectObject acForm, "frmStart"
        CloseForms
        CloseReports
        ' CloseForms et CloseReports ferment tous les objets ouverts
        ' autres que frmStart
      End If
  5. Enlever tout DoCmd.Maximize de la procédure événementielle de chaque formulaire.
  6. Créer une barre d'outils personnalisée pour les états, avec  Print, Close et tout autre option désirée. Assigner le nom de cette barre d'outils à la propriété "toolbar" de l'état. Assigner "-1" à la propriété "menu" de l'état. Ces deux assignations limitent l'utilisateur à utiliser votre barre d'outils.
  7. Utiliser les deux lignes de code suivantes pour amener un état en mode de pré visionnement sur écran:
  8. DoCmd.OpenReport "TheReport", acViewPreview,...
    Call sRemoveCaption(Reports("TheReport")

Après ces efforts, votre utilisateur peut maintenant:

  1. Voir l'état
  2. Utiliser votre barre d'outils, faire ce quelle permet
  3. Minimiser votre application Access

C'est tout. Si l'usager essaie de fermer votre application, il y a un retour à votre menu principal. Il n'y a pas de boutons pour minimiser, maximiser ou fermer l'état.

'********************* Code Start ************************
 
Private Type RECT  '  16  Bytes
    left As Long
    top As Long
    right As Long
    bottom As Long
End Type
 
Private Declare Function apiGetWindowLong Lib "User32" _
    Alias "GetWindowLongA" _
    (ByVal hwnd As Long, _
    ByVal nIndex As Long) _
    As Long
 
Private Declare Function apiSetWindowLong Lib "User32" _
    Alias "SetWindowLongA" _
    (ByVal hwnd As Long, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As Long) _
    As Long
 
Private Declare Function apiGetWindowRect Lib "User32" _
    Alias "GetWindowRect" _
    (ByVal hwnd As Long, _
    lpRect As RECT) _
    As Long
 
Private Declare Function apiGetSystemMetrics Lib "User32" _
    Alias "GetSystemMetrics" _
    (ByVal nIndex&) _
    As Long
 
Private Declare Function apiReleaseDC Lib "User32" _
  Alias "ReleaseDC" _
  (ByVal hwnd As Long, _
  ByVal hDC As Long) _
  As Long
 
Private Declare Function apiGetDeviceCaps Lib "Gdi32" _
    Alias "GetDeviceCaps" _
    (ByVal hDC As Long, _
    ByVal nIndex As Long) _
    As Long
 
Private Declare Function apiGetDC Lib "User32" _
    Alias "GetDC" _
    (ByVal hwnd As Long) _
    As Long
 
Private Declare Function IsZoomed Lib "User32" _
    (ByVal hwnd As Long) As Long
 
Private Declare Function ShowWindow Lib "User32" _
    (ByVal hwnd As Long, _
    ByVal nCmdShow As Long) As Long
 
Private Declare Function MoveWindow Lib "User32" _
    (ByVal hwnd As Long, _
    ByVal x As Long, _
    ByVal Y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal bRepaint As Long) As Long
 
Private Declare Function GetParent Lib "User32" _
    (ByVal hwnd As Long) As Long
 
'Use following instead of GetWindowRect
Private Declare Function GetClientRect Lib "User32" _
    (ByVal hwnd As Long, _
    lpRect As RECT) As Long
 
Public Const SW_MAXIMIZE = 3
Public Const SW_SHOWNORMAL = 1
Private Const GWL_EXSTYLE = -20
Private Const GWL_HINSTANCE = -6
Private Const GWL_HWNDPARENT = -8
Private Const GWL_ID = -12
Private Const GWL_STYLE = -16
Private Const GWL_USERDATA = -21
Private Const GWL_WNDPROC = -4
Private Const WS_CAPTION = &HC00000
Private Const WS_SYSMENU = &H80000
Private Const SM_CYCAPTION = 4  ' Hauteur du titre
Private Const TWIPSPERINCH = 1440
'**  Window Style Constants
Private Const WS_DLGFRAME& = &H400000
Private Const WS_THICKFRAME& = &H40000

Sub aTest()
    DoCmd.OpenReport "Report1", acViewPreview
    Call sRemoveCaption(Reports!Report1)
End Sub
 
Private Sub MaximizeRestoredReport(R As Report)
'Code originalement écrit par Terry Kreft
'Tout crédit et reconnaissance lui sont offerts.
'
Dim MDIRect As RECT
    ' Si l'état est maximisé, le rétablir.
    If IsZoomed(R.hwnd) <> 0 Then
        ShowWindow R.hwnd, SW_SHOWNORMAL
    End If
 
    ' Obtenier les coordonnées et dimensions de la fenêtre
    ' MDIClient.
    ' Cette ligne est différente
    GetClientRect GetParent(R.hwnd), MDIRect
 
    ' Bouger l'état dans le coin supérieur gauche de MDIClient
    ' (0,0) et redimensionner pour qu'il ait même dimensions que
    ' MDIClient.
 
    MoveWindow R.hwnd, 0, 0, MDIRect.right - MDIRect.left, _
        MDIRect.bottom - MDIRect.top, True
End Sub
 
Sub sRemoveCaption(rpt As Report)
 
Dim lngRet As Long, lngStyle As Long
Dim tRECT As RECT, lngX As Long
Dim lngCaptionWidth As Long
Dim lngLeft As Long
Dim lngTop As Long
Dim lngWidth As Long
Dim lngHeight As Long
 
    lngRet = apiGetWindowLong(rpt.hwnd, GWL_STYLE)
    lngStyle = (lngRet Xor WS_DLGFRAME Xor _
                    WS_THICKFRAME) And Not WS_CAPTION
    'Il faut utiliser Xor pour maintenir la possibilité de redimensionner
    lngRet = apiSetWindowLong(rpt.hwnd, GWL_STYLE, lngStyle)
    lngX = apiGetWindowRect(rpt.hwnd, tRECT)
 
    'il faut redimensionner le formulaire...
    'quel était l'étendue du titre
    lngCaptionWidth = apiGetSystemMetrics(SM_CYCAPTION)
 
    With tRECT
        lngLeft = .left
        lngTop = .top
        lngWidth = .right - .left
        lngHeight = .bottom - .top - lngCaptionWidth
        ConvertPIXELSToTWIPS lngLeft, lngTop
        ConvertPIXELSToTWIPS lngWidth, lngHeight
        DoCmd.SelectObject acReport, rpt.Name, False
        DoCmd.Restore
        DoCmd.MoveSize lngLeft, lngTop, lngWidth, lngHeight
    End With
 
    'maintenant, utiliser le code de Terry ici
    Call MaximizeRestoredReport(rpt)
 End Sub
 
Sub ConvertPIXELSToTWIPS(x As Long, Y As Long)
 'De la base de connaissance
    Dim hDC As Long, hwnd As Long, RetVal As Long
    Dim XPIXELSPERINCH, YPIXELSPERINCH
    Const LOGPIXELSX = 88
    Const LOGPIXELSY = 90
 
    hDC = apiGetDC(0)
    XPIXELSPERINCH = apiGetDeviceCaps(hDC, LOGPIXELSX)
    YPIXELSPERINCH = apiGetDeviceCaps(hDC, LOGPIXELSY)
    RetVal = apiReleaseDC(0, hDC)
    x = (x / XPIXELSPERINCH) * TWIPSPERINCH
    Y = (Y / YPIXELSPERINCH) * TWIPSPERINCH
End Sub
'************************ Code End **************************

© 1998-2001, Dev Ashish, All rights reserved. Optimized for Microsoft Internet Explorer