Имя пользователя:
Пароль:
 

Показать сообщение отдельно

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, поэтому пришлось делать все за нее.
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:54, 03-04-2008 | #371