Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Хотелось бы знать в чём минусы подключения второго обработчика сообщений окна, и актуально ли его использование?
Кликаем по окну:
ПКМ - создает окно.
ЛКМ - удаляет окно.
Кликаем по окну:
ПКМ - создает окно.
ЛКМ - удаляет окно.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>
#Include <APIConstants.au3>
OnAutoItExitRegister("CloseMSG")
Global $hMenu
$hForm = GUICreate("", 300, 200, -1, -1)
GUISetState()
$pEvent = DllCallbackRegister("WinMSG", "ptr", "hwnd;uint;wparam;lparam")
$hProc = _WinAPI_SetWindowLong($hForm, $GWL_WNDPROC, DllCallbackGetPtr($pEvent))
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func WinMSG($hWnd, $iMsg, $wParam, $lParam)
Switch $iMsg
Case $WM_RBUTTONDOWN
If $hMenu Then
GUIDelete($hMenu)
EndIf
$iMouse = MouseGetPos()
$hMenu = GUICreate("", 150, 100, $iMouse[0], $iMouse[1], $WS_POPUP, -1, $hWnd)
$Pic = GUICtrlCreatePic('', 0, 0, 150, 100)
$hPic = GUICtrlGetHandle($Pic)
$hDC = _WinAPI_GetDC($hPic)
$hDestDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, 150, 100)
$hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
Dim $aVertex[2][3] = [[0, 0, 0x7FC9FF], [150, 100, 0x005C9E]]
_WinAPI_GradientFill($hDestDC, $aVertex, 0, 2)
_WinAPI_ReleaseDC($hPic, $hDC)
_WinAPI_SelectObject($hDestDC, $hDestSv)
_WinAPI_DeleteDC($hDestDC)
_SendMessage($hPic, 0x0172, 0, $hBitmap)
$hObj = _SendMessage($hPic, 0x0173)
If $hObj <> $hBitmap Then
_WinAPI_DeleteObject($hBitmap)
EndIf
$Ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", 0, "long", 0, "long", 150, "long", 100, "long", 16, "long", 16)
DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $hMenu, "long", $Ret[0], "int", 1)
DllCall('User32.dll', 'long', 'AnimateWindow', 'hwnd', $hMenu, 'long', 1000, 'long', $AW_BLEND)
GUISetState()
WinActivate($hWnd)
Case $WM_LBUTTONDOWN
GUIDelete($hMenu)
EndSwitch
Return _WinAPI_CallWindowProc($hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc
Func CloseMSG()
_WinAPI_SetWindowLong($hForm, $GWL_WNDPROC, $hProc)
DllCallbackFree($pEvent)
GUIDelete()
EndFunc