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é:
- Dans chaque état, procédure événementielle Deactivate:
DoCmd.Close acReport, Me.Name
- 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:
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
DoCmd.SelectObject acForm, "frmStart"
CloseForms
CloseReports
End If
- Enlever tout DoCmd.Maximize de la procédure événementielle de chaque
formulaire.
- 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.
- Utiliser les deux lignes de code suivantes pour amener un état en mode
de pré visionnement sur écran:
DoCmd.OpenReport "TheReport", acViewPreview,...
Call sRemoveCaption(Reports("TheReport")
Après ces efforts, votre utilisateur peut maintenant:
- Voir l'état
- Utiliser votre barre d'outils, faire ce quelle permet
- 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.
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
Private Const TWIPSPERINCH = 1440
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)
Dim MDIRect As RECT
If IsZoomed(R.hwnd) <> 0 Then
ShowWindow R.hwnd, SW_SHOWNORMAL
End If
GetClientRect GetParent(R.hwnd), MDIRect
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
lngRet = apiSetWindowLong(rpt.hwnd, GWL_STYLE, lngStyle)
lngX = apiGetWindowRect(rpt.hwnd, tRECT)
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
Call MaximizeRestoredReport(rpt)
End Sub
Sub ConvertPIXELSToTWIPS(x As Long, Y As Long)
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