Servus Community! ![]()
Ich hänge an einem Problem wo ich nicht mehr weiter weiß. Ich versuche ein eigenes Control zu schreiben. Ich weiß dass es die Möglichkeit gibt einfach ein vorhandenes Control (z.B. das AutoIt Graphic Control) mit _WinAPI_SetWindowLong() zu "hooken" (weiß nicht wie man es nennt). Will ich aber nicht, ziel soll es sein das Control von Anfang an mit _WinAPI_CreateWindowEx() zu erstellen.
Die Klasse wird registriert, aber die Erstellung des Controls schlägt fehl. Leider spuckt mir _WinAPI_GetLastError() keinen Fehlercode entgegen. Aber ein Handle bekomme ich trotzdem nicht. Hier der Source:
[autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit][autoit][/autoit][autoit]#include "CustomControl.au3"
#include <WinAPI.au3>
Global $hGUI, $hCustom
[/autoit][autoit][/autoit][autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit][autoit][/autoit][autoit]$hGUI = GUICreate('MainWindow', 350, 250, -1, -1, $WS_OVERLAPPEDWINDOW)
GUISetState()
$hCustom = _WinAPI_CreateWindowEx(0, $CUSTOM_WC, 0, BitOR($WS_CHILD, $WS_VISIBLE), 10, 10, 100, 100, $hGUI)
ConsoleWrite($hCustom & @CRLF & '! ' & _WinAPI_GetLastError() & @CRLF)
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit][autoit][/autoit][autoit]While GUIGetMsg() <> -3
WEnd
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Benötigt wird noch die CustomControl.au3. In der definiere ich mein Control:
CustomControl.au3
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]#include <WinAPI.au3>
#include <WinAPIEx.au3>
#include <WindowsConstants.au3>
OnAutoItExitRegister(__CUSTOM_FREE__)
[/autoit] [autoit][/autoit] [autoit]Global Const $WNDCLASS = 'uint Style;ptr hWndProc;int ClsExtra;int WndExtra;ptr hInstance;ptr hIcon;ptr hCursor;ptr hBackground;ptr MenuName;ptr ClassName'
[/autoit] [autoit][/autoit] [autoit]Global Const $CUSTOM_WC = 'CustomControl'
[/autoit] [autoit][/autoit] [autoit]Global Const $CS_GLOBALCLASS = 0x4000
Global Const $CS_HREDRAW = 0x0002
Global Const $CS_VREDRAW = 0x0001
Global Const $hCustomProc = DllCallbackRegister(CustomProc, 'LRESULT', 'HWND;UINT;WPARAM;LPARAM')
[/autoit] [autoit][/autoit] [autoit]CustomRegister()
[/autoit] [autoit][/autoit] [autoit]; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func CustomPaint($hWnd)
Local $tRect = _WinAPI_GetClientRect($hWnd)
Local $tPS = DllStructCreate($tagPAINTSTRUCT)
Local $hDC = _WinAPI_BeginPaint($hWnd, $tPS)
_WinAPI_SetTextColor($hDC, 0x000000)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)
_WinAPI_DrawText($hDC, 'Hello World!', $tRect, BitOR($DT_SINGLELINE, $DT_CENTER, $DT_VCENTER))
_WinAPI_EndPaint($hWnd, $tPS)
EndFunc
Func CustomProc($hWnd, $uMsg, $wParam, $lParam)
Switch $uMsg
Case $WM_PAINT
CustomPaint(hWnd)
Return
EndSwitch
Return _WinAPI_DefWindowProc($hWnd, $uMsg, $wParam, $lParam)
EndFunc
Func CustomRegister()
Local $tClassName = DllStructCreate('WCHAR str[' & StringLen($CUSTOM_WC) +1 & ']')
Local $tWC = DllStructCreate($WNDCLASS)
$tClassName.str = $CUSTOM_WC
[/autoit] [autoit][/autoit] [autoit]With $tWC
.style = BitOR($CS_GLOBALCLASS, $CS_HREDRAW, $CS_VREDRAW)
.WndProc = DllCallbackGetPtr($hCustomProc)
;~ .hCursor = _WinAPI_LoadCursor(Null, $IDC_ARROW)
.hBackground = _WinAPI_CreateSolidBrush(0xFFFFFF)
.ClassName = DllStructGetPtr($tClassName, 'str')
EndWith
_WinAPI_RegisterClass($tWC)
ConsoleWrite('! ' & _WinAPI_GetLastError() & @CRLF)
EndFunc
Func CustomUnregister()
_WinAPI_UnregisterClass($CUSTOM_WC, Null)
EndFunc
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit] [autoit][/autoit] [autoit]Func __CUSTOM_FREE__()
DllCallbackFree($hCustomProc)
CustomUnregister()
EndFunc
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
[/autoit]Weiß jemand was ich falsch mache? Ich komme zum erbrechen nicht darauf...