Googler
Сообщения: 3665
Благодарности: 1563
|
Профиль
|
Отправить PM
| Цитировать
Creat0R
пары часов маловато будет...
Цитата:
нужно создать окно с собственным именем класса. »
|
этот код вроде работает:
Код: 
#include <WinAPI.au3>
#include <GUIConstants.au3>
Global Const $CS_VREDRAW = 1
Global Const $CS_HREDRAW = 2
Global Const $IDI_APPLICATION = 32512
Global Const $WHITE_BRUSH = 0
Global Const $CW_USEDEFAULT = 0x80000000
Global $hMsgHelloWndProc ; переменная для хранения хэндла CallBack-функции класса
; Тестовый ГУИ
$hWndMain = GUICreate("My GUI")
GUISetState (@SW_SHOW)
; Создаем и регистрируем класс
$iRet = MsgHelloReg("HelloMsg", $hMsgHelloWndProc)
; Создаем и активизируем экземпляр класса
$hWndHello = _WinAPI_CreateWindowEx(0, "HelloMsg", "Hello Application", $WS_OVERLAPPEDWINDOW, $CW_USEDEFAULT, 0, $CW_USEDEFAULT, 0, $hWndMain, 0, _WinAPI_GetModuleHandle(""), 0)
$iRet = _WinAPI_ShowWindow($hWndHello)
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend
; Разрегистрируем класс перед выходом
$iRet = MsgHelloUnReg("HelloMsg", $hMsgHelloWndProc)
; UDF для создания и регистрации нашего класса
Func MsgHelloReg($sClassName, ByRef $hWndProc)
; Выбираем иконки и курсоры (тут способов много)
Local $aIcon = DllCall("user32.dll", "hwnd", "LoadIcon", "hwnd", 0, "int", $IDI_APPLICATION)
Local $aCursor = DllCall("user32.dll", "hwnd", "LoadCursor", "hwnd", 0, "int", $IDC_ARROW)
; Регистрируем оконную процедуру, как CallBack-функцию
$hWndProc = DLLCallbackRegister ("MsgHelloWndProc", "int", "hwnd;int;wparam;lparam")
;Создаем и инициализируем структуры класса
Local $tWndClassEx = DllStructCreate("uint cbSize;uint style;ptr lpfnWndProc;int cbClsExtra;int cbWndExtra;hwnd hInstance;hwnd hIcon;hwnd hCursor;hwnd hbrBackground;ptr lpszMenuName;ptr lpszClassName;hwnd hIconSm")
Local $tClassName = DllStructCreate("char["& StringLen($sClassName)+1 &"]")
DllStructSetData($tClassName, 1, $sClassName)
DllStructSetData($tWndClassEx, "cbSize", DllStructGetSize($tWndClassEx) )
DllStructSetData($tWndClassEx, "style", BitOR($CS_VREDRAW, $CS_HREDRAW) )
DllStructSetData($tWndClassEx, "lpfnWndProc", DllCallbackGetPtr($hWndProc))
DllStructSetData($tWndClassEx, "hInstance", _WinAPI_GetModuleHandle(""))
DllStructSetData($tWndClassEx, "hIcon", $aIcon[0])
DllStructSetData($tWndClassEx, "hCursor", $aCursor[0])
DllStructSetData($tWndClassEx, "hbrBackground", _WinAPI_GetStockObject($WHITE_BRUSH))
DllStructSetData($tWndClassEx, "lpszClassName", DllStructGetPtr($tClassName))
DllStructSetData($tWndClassEx, "hIconSm", $aIcon[0])
; Собственно процедура регистрации
Local $aRet = DllCall("user32.dll", "dword", "RegisterClassExA", "ptr", DllStructGetPtr($tWndClassEx) )
Return $aRet[0]
EndFunc ; ==> MsgHelloReg
; UDF для разрегистрации класса (не должно быть экземпляров класса)
Func MsgHelloUnReg($sClassName, ByRef $hWndProc)
DllCallbackFree($hWndProc)
Local $aRet = DllCall("user32.dll", "int", "UnregisterClassA", "str", $sClassName, "hwnd", _WinAPI_GetModuleHandle(""))
Return $aRet[0]
EndFunc ; ==> MsgHelloUnReg
; Код оконной процедуры нашего оконного класса
Func MsgHelloWndProc($hWnd, $uMsg, $wParam, $lParam)
Local $aRet, $iRet, $hDC, $tRect, $sDrawText = "Hello, World!"
Switch $uMsg
Case $WM_PAINT
$hDC = _WinAPI_GetDC($hWnd) ; получаем контекст устройства
$tRect = _WinAPI_GetClientRect($hWnd) ; получаем координаты клиентской области
$aRet = DllCall("user32.dll", "int", "ValidateRect", "hwnd", $hWnd, "ptr", DllStructGetPtr($tRect) ) ; делаем область "валидной"
; здесь код рисования окна
$aRet = DllCall("user32.dll", "int", "FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($tRect), "hwnd", _WinAPI_GetStockObject($WHITE_BRUSH) )
$iRet = _WinAPI_DrawText($hDC, $sDrawText, $tRect, BitOR($DT_SINGLELINE, $DT_CENTER, $DT_VCENTER))
; освобождаем контекст устройства
_WinAPI_ReleaseDC($hWnd, $hDC)
Case $WM_CLOSE
_WinAPI_DestroyWindow($hWnd)
Case $WM_DESTROY
; $aRet = DllCall("user32.dll", "none", "PostQuitMessage", "int", 0 )
Case Else
Return _WinAPI_DefWindowProc($hWnd, $uMsg, $wParam, $lParam) ; передаем "чужие" сообщение дальше на обработку
EndSwitch
Return 0
EndFunc ; ==> MsgHelloWndProc
З.Ы. Есть одна проблемка... почему-то стандартный ход для WM_PAINT (пара ф-ций BeginPaint / EndPaint) у меня не заработал, а именно BeginPaint не возвращает контекст и не заполняет структуру PAINTSTRUCT, поэтому пришлось делать все за нее.
|