IrrLicht-Fenster "eigenschaften" ändern

  • howdy!

    folgendes problem:

    ich verwende IrrLicht für ein projekt und würde gerne das Icon vom fenster ändern.. hab mir mal die WinAPI funktionen durchgeschaut aber dabei nichts gefunden.. vorallem weil ich nicht weiß wie ich an den handler für das irrlicht fenster kommen sollte.

    zweite sache wäre das X^^
    undzwar wird versucht beim betätigen des Xs das programm abrupt zu beenden.. ich möchte aber wie es bei einer normalen GUI möglich ist eine bestimmte funktion zum beenden aufrufen um z.b. die engine erstmal ordnungsgemäßig herunterzufahren und speicher zu leeren usw. etc...

    ich hab jetzt schon ne weile rumprobiert aber nichts hatte funktioniert.. hab sogar solche verzweifelten versuche wie:

    [autoit]

    GUIRegisterMsg(0x0002,"_close")
    GUIRegisterMsg(0x0010,"_close")
    GUIRegisterMsg(0x0012,"_close")

    [/autoit]

    ...ausprobiert.. aber nix^^

    mfg sgtigram

    Einmal editiert, zuletzt von SgtIgram (28. Dezember 2012 um 18:00)

  • Ich weiß nicht, ob das überhaupt geht, in C++ ist das möglich, aber auch nur über plattformabhängige Wege, aber ob diese so selten benutzte Funktion überhaupt in der UDF umgesetzt wurde, bezweifel ich.

    Deswegen empfehle ich die Methode, einen einzigartigen Fenstertitel (z.B. #hjhrjgrjlklwrj##5) zu setzten und über WinGetHandle an das Handle zu kommen.
    Dann verwende

    [autoit]

    GUICtrlSendMsg($hWnd, $WM_SETICON, $ICON_BIG, $iconHandle)

    [/autoit]

    zum Setzen des Icons.

    Du kannst du mit _WinAPI_SetWindowLong einen neuen "Eventhandler" setzen, der beim Klick auf den Close-Button eine spezielle Funktion auslöst und bei allen anderen Events den Originalhandler aufruft.


    Je nach dem, ob die UDF das zulässt, kannst du das Fenster auch als Child in ein AutoItfenster integrieren, aber ich finde die erste Methode besser.

  • hey, dass problem mit Irrlicht hatte ich auch mal^^
    dann hatte ich das sehr unschön gelöst

    dann hab ich mich gerade mal ran gemacht was ganz elegantes zu schreiben^^

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister("_Global_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    ; wir erstellen eine GUI, diese steht symbolisch für die Irrlicht GUI :)
    Global $hGUI = GUICreate("Meine Irrlicht GUI", 600, 400, -1, -1, $WS_SYSMENU)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit", $hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateButton("Exit", 10, 10, 100, 20)
    GUICtrlSetOnEvent(-1, "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    ; wir holen uns das Handle von Irrlicht
    $hGUI_Irrlicht = WinGetHandle("Meine Irrlicht GUI")
    ; wir Adden an die Irrlicht GUI den "Minimieren" Button
    _WinAPI_SetWindowLong($hGUI_Irrlicht, 0xFFFFFFF0, BitOR($WS_MINIMIZEBOX, _WinAPI_GetWindowLong($hGUI_Irrlicht, 0xFFFFFFF0)))
    ; wir setzen ein DLLCallback auf das Fenster
    Global $wWINCallBack = DllCallbackRegister("_MyWindowProc", "ptr", "hwnd;uint;long;ptr")
    Global $wWINCallBackOld = _WinAPI_SetWindowLong($hGUI_Irrlicht, 0xFFFFFFFC, DllCallbackGetPtr($wWINCallBack)) ; rückgabe wird benötigt!
    ; wir ändern das Icon
    WinSetIcon($hGUI_Irrlicht, "PFAD ZUM ICON ANGEBEN!!")

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hGUI)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(200)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _MyWindowProc($hWnd, $uiMsg, $wParam, $lParam)
    Switch $uiMsg
    Case $WM_NCLBUTTONDOWN ; klick auf das X der GUI abfangen
    If $wParam = 20 Then Return _CloseWin()
    Case $WM_SYSCOMMAND ; ESC & Alt+F4 abfangen
    If $wParam = 61536 Then Return _CloseWin()
    EndSwitch
    Return _WinAPI_CallWindowProc($wWINCallBackOld, $hWnd, $uiMsg, $wParam, $lParam)
    EndFunc ;==>_MyWindowProc
    Func _CloseWin()
    ; deine Funktion, die jetzt irgentwas macht :D
    ; willst du KEINE funktion ausführen, kannst du oben auch einfach ein Return 0 hinschreiben anstatt eine Funktion
    MsgBox(48, "Fehler", "Bitte benutzen Sie den 'Exit' Button!")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    Exit
    EndFunc
    Func _Global_Exit()
    ; den callback wieder ausschalten
    _WinAPI_SetWindowLong($hGUI_Irrlicht, 0xFFFFFFFC, $wWINCallBackOld)
    DllCallbackFree($wWINCallBack)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: WinSetIcon
    ; Description ...: Set the Icon from any Win
    ; Syntax.........: WinSetIcon($hWinSetIcon_HWND, $sWinSetIcon_Path)
    ; Parameters ....: $hWinSetIcon_HWND - The HWnd of the Win to Set Icon
    ; $sWinSetIcon_Path - The Path of the Icon to Set
    ; Return values .: Success - 1
    ; Failure - 0
    ; Author ........: Krabat
    ; ===============================================================================================================================
    Func WinSetIcon($hWinSetIcon_HWND, $sWinSetIcon_Path)
    If Not IsHWnd($hWinSetIcon_HWND) Then SetError(1, 0, 0)
    If Not WinExists($hWinSetIcon_HWND) Then Return SetError(2, 0, 0)
    Local $hWinSetIcon_Cursor = DllCall("user32.dll", "hwnd", "LoadCursorFromFile", "str", $sWinSetIcon_Path)
    If $hWinSetIcon_Cursor[0] = 0 Then Return SetError(3, 0, 0)
    DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hWinSetIcon_HWND, "uint", 0x0080, "wparam", 0, "lparam", $hWinSetIcon_Cursor[0])
    DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hWinSetIcon_HWND, "uint", 0x0080, "wparam", 1, "lparam", $hWinSetIcon_Cursor[0])
    Return 1
    EndFunc

    [/autoit]


    ich hoffe es ist erträglich von der kommentierung her^^

    mfg

    PS: _IrrSetWindowCaption("Dein Win Title")
    so setzt du in Irrlicht für die GUI einen title :)

    2 Mal editiert, zuletzt von Krabat (28. Dezember 2012 um 15:30)

  • möpmöp,

    vielen dank euch beiden.. das mit dem WindowCaption wusst ich zwar schon aber trotzdem danke für den tipp.
    funktioniert einwandfrei.

    das problem war nämlich das TCP verbindungen und die soundengine sich im ersten moment immer gesträubt haben sich ordnungsgemäß zu schließen.. und an den server sollte ja auch eine "abmelde" nachricht geschickt werden damits kein timeout wird oder so.

    muss mich wohl echt mal intensiver mit DLLCalls auseinander setzen..

    mfg
    sgtigram