Suite à l'intrigue, la beauté et la simplicité d'utilisation des interfaces MDI pour les utilisateurs, j'aimerais pouvoir le faire en Autoit3..
Bien entendu, j'ai fais des recherches !
Sur le forum anglophone, j'ai trouvé ceci :
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <GuiEdit.au3>
Opt("GUIOnEventMode", 1)
Global Const $IDC_ARROW = 32512
Global Const $tagCLIENTCREATESTRUCT = "HANDLE hWindowMenu;UINT idFirstChild"
Global Const $tagMDICREATESTRUCT = "ptr szClass;ptr szTitle;HANDLE hOwner;int x;int y;int cx;int cy;DWORD style;LPARAM lParam"
Global Const $CW_USEDEFAULT = 0x80000000
Global Const $IDM_FIRSTCHILD = 50000
Global Const $WM_MDIGETACTIVE = 553
Global Const $WM_MDICREATE = 544
Global Const $WM_MDIACTIVATE = 546
Global Const $WM_MDITILE = 550
Global Const $WM_MDICASCADE = 551
Global Const $MF_ENABLED = 0
Global $hInstance = _WinAPI_GetModuleHandle(0)
Global $hProcChild = DllCallbackRegister('_WndProcChild', 'lresult', 'hwnd;uint;wparam;lparam')
Global $hCursor = _WinAPI_LoadCursor(0, $IDC_ARROW)
Global $tIcon = DllStructCreate('ptr;ptr')
_WinAPI_ExtractIconEx(@SystemDir & '\shell32.dll', 130, DllStructGetPtr($tIcon, 1), DllStructGetPtr($tIcon, 2), 1)
Global $hIcon = DllStructGetData($tIcon, 1)
Global $hIconSm = DllStructGetData($tIcon, 2)
If _MDI_RegisterChildClass() = 0 Then
ConsoleWrite("Error Registering WindowClass!" & @CRLF)
Exit
EndIf
Global $hGui = GUICreate("AutoIt MDI-Example by funkey", -1, -1, -1, -1, BitOR($WS_MAXIMIZE, $GUI_SS_DEFAULT_GUI))
GUISetOnEvent(-3, "_Exit", $hGui)
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")
Global $filemenu = GUICtrlCreateMenu("&File")
Global $file_new = GUICtrlCreateMenuItem("&New Child", $filemenu)
GUICtrlSetOnEvent(-1, "_NewMDIChild")
Global $file_close = GUICtrlCreateMenuItem("E&xit", $filemenu)
GUICtrlSetOnEvent(-1, "_Exit")
Global $windowmenu = GUICtrlCreateMenu("&Window")
Global $window_tileH = GUICtrlCreateMenuItem("Tile &horizontal", $windowmenu)
GUICtrlSetOnEvent(-1, "_TileH")
Global $window_tileV = GUICtrlCreateMenuItem("Tile &vertical", $windowmenu)
GUICtrlSetOnEvent(-1, "_TileV")
Global $window_cascade = GUICtrlCreateMenuItem("&Cascade", $windowmenu)
GUICtrlSetOnEvent(-1, "_Cascade")
Global $hClient = _MDI_CreateClient($hGui)
GUISetState(@SW_SHOW, $hGui)
Global $hChild = _MDI_CreateChild($hClient, "Untitled 0", "MDIChild")
_CreateEditOnMDI($hChild)
While 1
Sleep(20000)
WEnd
Func _TileH()
_SendMessage($hClient, $WM_MDITILE, 1, 0);
EndFunc ;==>_TileH
Func _TileV()
_SendMessage($hClient, $WM_MDITILE, 0, 0);
EndFunc ;==>_TileV
Func _Cascade()
_SendMessage($hClient, $WM_MDICASCADE, 0, 0);
EndFunc ;==>_Cascade
Func _NewMDIChild()
Static $i = 0
$i += 1
_CreateEditOnMDI(_MDI_CreateChild($hClient, "Untitled " & $i, "MDIChild"))
EndFunc ;==>_NewMDIChild
Func _CreateEditOnMDI($hChild)
Local $aPos = WinGetClientSize($hChild)
_GUICtrlEdit_Create($hChild, "", 5, 5, $aPos[0] - 10, $aPos[1] - 10, BitOR($ES_MULTILINE, $ES_WANTRETURN, $ES_AUTOVSCROLL))
EndFunc ;==>_CreateEditOnMDI
Func _Exit()
_WinAPI_UnregisterClass('MDIChild')
GUIDelete($hGui)
Exit
EndFunc ;==>_Exit
Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $nNotifyCode = BitShift($wParam, 16)
Local $hChildMDI
If $nNotifyCode >= $IDM_FIRSTCHILD Then
_WinAPI_DefFrameProc($hWnd, $hClient, $WM_COMMAND, $wParam, $lParam)
Else
$hChildMDI = _SendMessage($hClient, $WM_MDIGETACTIVE, 0, 0, 0, "wparam", "lparam", "hwnd")
If $hChildMDI Then
_SendMessage($hChildMDI, $WM_COMMAND, $wParam, $lParam)
EndIf
EndIf
_WinAPI_DefFrameProc($hWnd, $hClient, $WM_COMMAND, $wParam, $lParam)
EndFunc ;==>_WM_COMMAND
Func _MDI_RegisterChildClass()
Local $sClass = 'MDIChild'
Local $tClass = DllStructCreate('wchar[' & StringLen($sClass) + 1 & ']')
DllStructSetData($tClass, 1, $sClass)
Local $tWCEX = DllStructCreate($tagWNDCLASSEX)
DllStructSetData($tWCEX, 'Size', DllStructGetSize($tWCEX))
DllStructSetData($tWCEX, 'Style', 3)
DllStructSetData($tWCEX, 'hWndProc', DllCallbackGetPtr($hProcChild))
DllStructSetData($tWCEX, 'ClsExtra', 0)
DllStructSetData($tWCEX, 'WndExtra', 0)
DllStructSetData($tWCEX, 'hInstance', $hInstance)
DllStructSetData($tWCEX, 'hIcon', $hIcon)
DllStructSetData($tWCEX, 'hCursor', $hCursor)
DllStructSetData($tWCEX, 'hBackground', 1);_WinAPI_CreateSolidBrush(_WinAPI_GetSysColor($COLOR_3DFACE)))
DllStructSetData($tWCEX, 'MenuName', 0)
DllStructSetData($tWCEX, 'ClassName', DllStructGetPtr($tClass))
DllStructSetData($tWCEX, 'hIconSm', $hIconSm)
;~ DllStructSetData($tWCEX, 'hIconSm', 0)
Return _WinAPI_RegisterClassEx($tWCEX)
EndFunc ;==>_MDI_RegisterChildClass
Func _MDI_CreateClient($hMDIParent)
Local $aClientSize = WinGetClientSize($hGui)
Local $iMenuHeight = _WinAPI_GetSystemMetrics(15)
Local $tCLIENTCREATESTRUCT = DllStructCreate($tagCLIENTCREATESTRUCT)
DllStructSetData($tCLIENTCREATESTRUCT, "hWindowMenu", _GUICtrlMenu_GetItemSubMenu(_GUICtrlMenu_GetMenu($hGui), 1))
DllStructSetData($tCLIENTCREATESTRUCT, "idFirstChild", $IDM_FIRSTCHILD)
Local $hMDIClient = _WinAPI_CreateWindowEx( _
0, "MDICLIENT", "", 0x52000000, _ ; Fensterstile (WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE)
0, 0, $aClientSize[0], $aClientSize[1] - $iMenuHeight, _ ; Position und Grösse des Fensters
$hMDIParent, 0, $hInstance, _
DllStructGetPtr($tCLIENTCREATESTRUCT))
Return $hMDIClient
EndFunc ;==>_MDI_CreateClient
Func _MDI_CreateChild($hMDIClient, $sTitle, $sClassName)
Local $tClass = DllStructCreate('wchar[' & StringLen($sClassName) + 1 & ']')
DllStructSetData($tClass, 1, $sClassName)
Local $tTitle = DllStructCreate('wchar[' & StringLen($sTitle) + 1 & ']')
DllStructSetData($tTitle, 1, $sTitle)
Local $tMDICREATESTRUCT = DllStructCreate($tagMDICREATESTRUCT)
DllStructSetData($tMDICREATESTRUCT, 'szClass', DllStructGetPtr($tClass))
DllStructSetData($tMDICREATESTRUCT, "szTitle", DllStructGetPtr($tTitle))
DllStructSetData($tMDICREATESTRUCT, "hOwner", $hInstance)
DllStructSetData($tMDICREATESTRUCT, "x", $CW_USEDEFAULT)
DllStructSetData($tMDICREATESTRUCT, "y", $CW_USEDEFAULT)
DllStructSetData($tMDICREATESTRUCT, "cx", $CW_USEDEFAULT)
DllStructSetData($tMDICREATESTRUCT, "cy", $CW_USEDEFAULT)
DllStructSetData($tMDICREATESTRUCT, "style", 0)
DllStructSetData($tMDICREATESTRUCT, "lParam", 0)
Local $hRet = _SendMessage($hMDIClient, $WM_MDICREATE, 0, DllStructGetPtr($tMDICREATESTRUCT), 0, "wparam", "lparam", "hwnd")
Return $hRet
EndFunc ;==>_MDI_CreateChild
Func _WndProcChild($hWnd, $iMsg, $wParam, $lParam)
Switch $iMsg
Case $WM_MDIACTIVATE
Local $hMenu = _GUICtrlMenu_GetMenu($hGui)
If $hWnd = HWnd($lParam) Then
_GUICtrlMenu_EnableMenuItem($hMenu, 1, BitOR($MF_BYPOSITION, $MF_ENABLED))
Else
_GUICtrlMenu_EnableMenuItem($hMenu, 1, BitOR($MF_BYPOSITION, $MF_GRAYED))
EndIf
_GUICtrlMenu_DrawMenuBar($hGui)
EndSwitch
Return _WinAPI_DefMDIChildProc($hWnd, $iMsg, $wParam, $lParam)
EndFunc ;==>_WndProcChild
Func _WinAPI_DefMDIChildProc($hWnd, $iMsg, $wParam, $lParam)
Local $Ret = DllCall('user32.dll', 'lresult', 'DefMDIChildProcW', 'hwnd', $hWnd, 'uint', $iMsg, 'wparam', $wParam, 'lparam', $lParam)
If @error Then Return SetError(1, 0, 0)
Return $Ret[0]
EndFunc ;==>_WinAPI_DefMDIChildProc
Func _WinAPI_DefFrameProc($hWnd, $hWndMDIClient, $iMsg, $wParam, $lParam)
Local $Ret = DllCall('user32.dll', 'lresult', 'DefFrameProcW', 'hwnd', $hWnd, 'hwnd', $hWndMDIClient, 'uint', $iMsg, 'wparam', $wParam, 'lparam', $lParam)
If @error Then Return SetError(1, 0, 0)
Return $Ret[0]
EndFunc ;==>_WinAPI_DefFrameProc
Merci d'avance.
PS : J'ai essayé bien entendu de mon côté, et je persiste !