1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • Controlbetätigung per Skript auslösen

    • BugFix
    • 10. Juli 2012 um 21:57
    Zitat von Raupi

    Warum hast du nicht GUICtrlSendToDummy dafür benutzt?


    OK, wenn man mit Dummy arbeitet ist das eine Lösung. Ich hatte aber noch das Problem, dass ich existierende Controls nutzen musste (in meiner MenuEx-UDF), das normale Event aber zwingend verworfen werden musste und ausschließlich aus der Callbackfunktion heraus stattfinden durfte.

  • Controlbetätigung per Skript auslösen

    • BugFix
    • 10. Juli 2012 um 20:59

    Ich hatte nach einer eleganten Lösung für dieses Problem gesucht und habe sie auch gefunden. :thumbup:
    Falls jemand mal vor dem Problem steht, will ich euch das nicht vorenthalten.

    Wozu braucht man das?
    Nun, wenn man mit GuiRegisterMsg arbeitet muss die Callbackfunktion schnellstmöglich verlassen werden. MsgBox, InputBox etc. dürfen von dort nicht aufgerufen werden
    Nehmen wir aber an, eine in Auswertung der Callbackfunktion aufzurufende Funktion muss auf Usereingabe warten oder eine MsgBox zeigen, dann würde die Rückkehr aus der Callbackfunktion nicht absehbar sein und könnte zu undefinierten Zuständen (bis zum Absturz) führen. Bisher hatte ich dann immer eine Triggervariable gesetzt, deren Wert ich in der Hauptprogrammschleife überprüfte und dann die entsprechende Funktion aufrief.
    Das geht aber auch eleganter. Man verwendet ein Control (wenn es sonst nicht benötigt wird, tuts auch ein Dummy) und läßt es auslösen. ControlClick ist eine Möglichkeit, funktioniert aber nicht in jeder Situation.
    Mit dem folgenden Einzeiler kann man nun ganz elegant und sicher die Control-ID des gewünschten Controls in den Windows Nachrichtenstrom befördern und normal mit GuiGetMsg oder im OnEventMode auswerten.

    [autoit]

    _WinAPI_PostMessage($Handle_GUI, $WM_COMMAND, $ID_Ctrl, 0)

    [/autoit]
  • OwnContext UDF (vorher MenuEx)

    • BugFix
    • 10. Juli 2012 um 19:34

    Schön, wenns euch gefällt. 8o

    Zitat von chesstiger

    Vorschlag: Mach die MouseOver-Farbe festlegbar. Das blau ist ja schön und gut, aber wenn ich meine GUI in Richtung grün beispielsweise designe, dann passt's nicht. Ich meine damit: Ein eigener Parameter zum Farbe festlegen. ;)

    Ich wollte mich da eigentlich an Standardmenüs orientieren. Und eine extra Farbgebung als Funktion möchte ich eigentlich nicht einbauen. Aber du kannst ja bei Bedarf die Globale Variable für die Farbe in deinem Skript überschreiben.

    [autoit]

    Global $__iHOVER_COLOR = 0xADD8E6

    [/autoit]
  • Default-Wert mit Enter übernehmen

    • BugFix
    • 10. Juli 2012 um 19:25

    Also zur Erklärung:
    GUIRegisterMsg registriert ein Callback Funktion. In Abhängigkeit von den verwendeten Windows-Nachrichten enthalten wParam und lParam Werte.
    Wenn du dich da informieren möchtest, lies am besten bei MSDN nach. Hier z.B. die Infos für WM_COMMAND
    $GUI_RUNDEFMSG braucht keinen Wert extra bekommen - ist eine Konstante. ;)
    Mit dem Fokus kannst du das natürlich ganz nach Bedarf händeln.

  • OwnContext UDF (vorher MenuEx)

    • BugFix
    • 9. Juli 2012 um 21:44

    Version v0.6 - s. Post #1

  • OwnContext UDF (vorher MenuEx)

    • BugFix
    • 9. Juli 2012 um 08:05
    Zitat von D2thunder

    könnte man als Traymenü für Linksclick und rechtsclick auch verwenden - also zwei getrennte menüs.

    Hier verstehe ich jetzt nicht, was du meinst. Du möchtest dieses Kontextmenü als Traymenü verwenden? Könnte klappen, musst du dann für das TrayBar-Handle erstellen. Einfach mal Probieren.

    Zitat von D2thunder

    wenn du das menü offen hast, nimmt er bei einem linksclick nicht auf dem menü, erst den zweiten - der erste wird fürs schliessen 'gefressen'.

    Trifft zu, wenn du bei offenem Kontextmenü das Parent schließen willst oder eine andere Mausaktion stattfinden soll.
    --> Behoben in nächster Version

    Zitat von D2thunder

    die geänderten werte werden erst gesetzt wenn man das menü öffnet.

    Gesetzt werden diese sofort. Wenn du das Event auswertest und den Status auslliest, wirst du das feststellen. Es ist nur eine optische Verzögerung, die beim erneuten Öffnen des Menüs erscheint. Funktionell ohne Einfluss.

    Zitat von D2thunder

    schön währe noch wenn die zeile auf der man sich gerade mit dem cursor befindet, erhöht wird.

    Ich schau mal, was sich machen lässt.

  • OwnContext UDF (vorher MenuEx)

    • BugFix
    • 9. Juli 2012 um 00:04

    Das ist schon sehr seltsam, ich hatte zwar eine Codezeile vergessen (Korrektur, wenn Menüfenster den unteren Bildschirmrand überragt), aber das kann eigentlich bei dir nicht zutreffen.
    Die Position richtet sich nach dem Mausklick (Fenster Menü linke obere Ecke an Mauspos).
    Kann ich so nicht nachbilden, sehr seltsam.

    Edit: Ahhh, habs entdeckt: Wenn nach Aufpoppen der GUI, diese verschoben wird und dann das Menü aufgerufen wird, erscheint es in Relation zum alten Standort.
    Da muss ich mal suchen, warum das passiert - bei Parent-Child sollte das eigentlich nicht vorkommen.

  • OwnContext UDF (vorher MenuEx)

    • BugFix
    • 8. Juli 2012 um 23:32

    Hier ein neues Projekt von mir, die MenuEx OwnContext-UDF.
    Im Moment nur für Kontextmenüs, Erweiterung für Standardmenüs in Planung.

    Das sind die Eigenschaften:
    - Anzeige des Menüs kann an Bedingung gekoppelt werden (z.B. Anzahl Item eines Listview muss > 0 sein)
    - Itemtypen: Label, Checkbox, Radio, Image (jpg,bmp,gif), Icon (aus Icondatei, DLL), Shape (Trennlinie) --- Bilddateien sollten quadratisch sein, werden auf 16x16 px skaliert
    - Menübreite wählbar, Standard 200 px
    - Linker Rand für Menü allgemein und zusätzlich für jedes einzelne Item einstellbar (dadurch sind Einzüge möglich)
    - Item-ID sind völlig normale Standard-Ctrl-ID und können somit auch "normal" angesprochen werden. Von Farbgebung (ausser Schrift) rate ich aber ab, da die Controls auf einem Background-Label liegen (vereinfacht die Größenanpassung des Menü-Fensters)


    Edit 1: Noch einen Fehler bei der Positionierung beseitigt

    Edit 2:
    - Neu: Hervorhebung der Item bei Mouse-Hover
    - kleinen Bug für Fensterposition behoben
    - Klick auf GUI bei offenem Menü wird jetzt erkannt

    Edit 3:
    Jetzt ergänzt: Wenn ein Item auf GUI_DISABLE gesetzt ist, wird dieses beim Hover nicht gehighlightet und ein Mausklick bleibt ohne Effekt.

    Edit 4:
    - Funktionen umbenannt zu _GUICtrlOwnContext_...
    - Hover Color kann bei Erstellen des Menüs oder später mit eigener Funktion individuell festgelegt werden
    - Bug beim Rechtsklick auf/neben offenes Menü gefixed
    - Tipp von funkey für Bkcolor eingearbeitet
    - Hover Geschwindigkeit erhöht (Adlibzeit von 50 auf 10 ms verringert)
    - Im Bsp. sind jetzt alle Imagedaten binär hinterlegt (deshalb nur als Anhang)
    aktuelle Version v0.8

    Edit 5:
    - NEU Je Item kann ein Submenü (1 Level tief) erstellt werden. Markierung für Submenü differenziert nach Status Enable/Disable des Item.
    WICHTIG: Bevor Submenüs erstellt werden können, müssen erst alle Item im Hauptmenü erstellt werden:

    Code
    - Hauptmenü
    -- Item1
    -- Item2
    -- Item3
    
    
    -- Submenü1
    --- Item1 Sub1
    --- Item2 Sub1
    --- Item3 Sub1
    
    
    -- Submenü2
    --- Item1 Sub2
    --- Item2 Sub2
    --- Item3 Sub2
    Alles anzeigen


    - überarbeitet: Erkennen, ob Maus über Item - nicht mehr an Ctrl gebunden. Die gesamte Fläche des Eintrags, inkl. Image, wird als Ctrl erkannt
    - keine AdlibRegister-Funktion mehr, alles wird in Window- und Mouse-Procedure ausgewertet
    - funkeys Hinweis berücksichtigt: bei erneutem Aufruf Menü jetzt alte Hovermarkierung gelöscht
    Jetzt auch in der UDF Binärdaten (für SubItem-Markierung), daher neue Version nur im Anhang.
    Neues Bsp-Skript. Die Bsp.-Skripte sind aufgrund kleiner interner Änderungen in der UDF mit den unterschiedlichen Versionen nicht kompatibel.
    aktuelle Version v0.9

    so sieht es z.B. aus:
    v0.8 [Blockierte Grafik: http://www.imgbox.de/users/BugFix/ContextMenu.jpg] v0.9 Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    OwnContext v0.8 ( 0.9 im Anhang )
    [autoit]

    #Region - TimeStamp
    ; 2012-07-11 22:49:23 v 0.8
    #EndRegion - TimeStamp
    #include-once
    #Include <GUIConstantsEx.au3>
    #Include <Constants.au3>
    #include <StaticConstants.au3>
    #Include <StructureConstants.au3>
    #Include <WindowsConstants.au3>
    #Include <WinAPI.au3>

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

    ; ======================================================================================================
    ; FUNCTIONS
    ;
    ; _GUICtrlOwnContext_Startup Initialize Functions
    ; _GUICtrlOwnContext_Shutdown Close Ressources, automatically on AutoIt Exit
    ; _GUICtrlOwnContext_Create Create (Context)Menu
    ; _GUICtrlOwnContext_AddItem Create Menu-Item (Default-Item, Checkbox-Item, Radio-Item, Shape)
    ; _GUICtrlOwnContext_AddImage Create Menu-Item with Image (icon, jpg/gif/bmp, colored squares)
    ; _GUICtrlOwnContext_ShowFlag Condition to show Menu (True/False)
    ; _GUICtrlOwnContext_SetHoverColor Sets custom hover color
    ; ======================================================================================================

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

    OnAutoItExitRegister('_GUICtrlOwnContext_Shutdown')

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

    Global Const $__HC_ACTION = 0
    Global $__hGUI_MNUEX, $__hWIN_PROC, $__hHOOK_PROC
    Global $__hSTUB__MouseProc, $__hMOD, $__hHOOK
    Global $__aHWND_MNU[1][8] ; [[hWnd-ParentCtrl, hWnd-Menu, fCondition, Item-Array, Shape-counter, Margin, Width, HoverColor]] --- Item-Array: [[counter], [fIsRadio], [ID1, iType], [ID2, iType], [..IDn]]
    Global $__iMNU_DEF_HOVERCOLOR = 0xEFFFFF
    Global $__iMNU_DEF_WIDTH = 200
    Global $__iMNU_DEF_HEIGHT = 23
    Global $__iMNU_DEF_MARGIN = 10
    Global $__iMNU_DEF_LABELSHIFT = 4
    Global $__iMNU_DEF_SHAPEHEIGHT = 3
    Global $__hCURRENT_ACTIVE_MNU = 0

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

    ;===============================================================================
    ; Function Name....: _GUICtrlOwnContext_Startup
    ; Description......: Initialize functions
    ; Parameter(s).....: $_hGUI GUI Handle
    ; Return Value(s)..: Nothing
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlOwnContext_Startup($_hGUI)
    $__hGUI_MNUEX = $_hGUI
    ; == initialize Callback Function to analyze $WM_NOTIFY
    $__hWIN_PROC = DllCallbackRegister('__WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
    $__hHOOK_PROC = _WinAPI_SetWindowLong($__hGUI_MNUEX, $GWL_WNDPROC, DllCallbackGetPtr($__hWIN_PROC))
    ; == initialize Callback Function to analyze MOUSE-Message
    $__hSTUB__MouseProc = DllCallbackRegister("__MouseProc", "long", "int;wparam;lparam")
    $__hMOD = _WinAPI_GetModuleHandle(0)
    $__hHOOK = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($__hSTUB__MouseProc), $__hMOD)
    EndFunc ;==>_GUICtrlOwnContext_Startup

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

    ;===============================================================================
    ; Function Name....: _GUICtrlOwnContext_Shutdown
    ; Description......: Close ressources, automatically on AutoIt exit
    ; Requirement(s)...: _GUICtrlOwnContext_Startup() must be called before
    ; Return Value(s)..: Nothing
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlOwnContext_Shutdown()
    _WinAPI_SetWindowLong($__hGUI_MNUEX, $GWL_WNDPROC, $__hHOOK_PROC)
    _WinAPI_UnhookWindowsHookEx($__hHOOK)
    DllCallbackFree($__hSTUB__MouseProc)
    EndFunc ;==>_GUICtrlOwnContext_Shutdown

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

    ;===============================================================================
    ; Function Name....: _GUICtrlOwnContext_Create
    ; Description......: Create (Context)Menu
    ; Parameter(s).....: $_hParentCtrl hWnd or ID of control, for which the menu is to be effective
    ; .................: $_iWidth Menu width (-1 = 200 px, Default)
    ; .................: $_iMarginLeft Left margin (-1 = 10 px, Default)
    ; .................: $_iHoverColor Item hover color, (-1=$__iMNU_DEF_HOVERCOLOR)
    ; Requirement(s)...: _GUICtrlOwnContext_Startup() must be called before
    ; Return Value(s)..: Menu Handle
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlOwnContext_Create($_hParentCtrl, $_iWidth=-1, $_iMarginLeft=-1, $_iHoverColor=-1)
    If Not IsHWnd($_hParentCtrl) Then $_hParentCtrl = GUICtrlGetHandle($_hParentCtrl)
    If IsKeyword($_iMarginLeft) Or $_iMarginLeft = -1 Then $_iMarginLeft = $__iMNU_DEF_MARGIN
    If IsKeyword($_iWidth) Or $_iWidth = -1 Then $_iWidth = $__iMNU_DEF_WIDTH
    Local $hMenu = GUICreate('', $_iWidth, $__iMNU_DEF_HEIGHT, -1, -1, BitOR($WS_BORDER,$WS_POPUP), $WS_EX_MDICHILD, $__hGUI_MNUEX)
    If $__aHWND_MNU[UBound($__aHWND_MNU)-1][0] <> '' Then ReDim $__aHWND_MNU[UBound($__aHWND_MNU)+1][8]
    $__aHWND_MNU[UBound($__aHWND_MNU)-1][0] = $_hParentCtrl
    $__aHWND_MNU[UBound($__aHWND_MNU)-1][1] = $hMenu
    $__aHWND_MNU[UBound($__aHWND_MNU)-1][2] = True
    Local $aItem[2][3] = [[0],[False]]
    $__aHWND_MNU[UBound($__aHWND_MNU)-1][3] = $aItem
    $__aHWND_MNU[UBound($__aHWND_MNU)-1][4] = 0
    $__aHWND_MNU[UBound($__aHWND_MNU)-1][5] = $_iMarginLeft
    $__aHWND_MNU[UBound($__aHWND_MNU)-1][6] = $__iMNU_DEF_WIDTH
    If $_iWidth <> $__iMNU_DEF_WIDTH Then $__aHWND_MNU[UBound($__aHWND_MNU)-1][6] = $_iWidth
    $__aHWND_MNU[UBound($__aHWND_MNU)-1][7] = $__iMNU_DEF_HOVERCOLOR
    If $_iHoverColor <> -1 Then $__aHWND_MNU[UBound($__aHWND_MNU)-1][7] = $_iHoverColor
    Return $hMenu
    EndFunc ;==>_GUICtrlOwnContext_Create

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

    ;===============================================================================
    ; Function Name....: _GUICtrlOwnContext_AddItem
    ; Description......: Create Menu-Item (Default-Item, Checkbox-Item, Radio-Item, Shape)
    ; Parameter(s).....: $_hMnu Menu Handle
    ; .................: $_sText Item-Text, if empty string (Default) ==> create shape
    ; .................: $_iType 1=Label (Default), 2=Checkbox, 3=Radio
    ; .................: $_iMarginLeft Left margin, only if different from value, that used with _GUICtrlOwnContext_Create
    ; Requirement(s)...: with _GUICtrlOwnContext_Create menu created
    ; Return Value(s)..: Success Item-ID
    ; .................: Failure -1, @error=1 on specified handle does not exist
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlOwnContext_AddItem($_hMnu, $_sText='', $_iType=1, $_iMarginLeft=-1)
    Local $iIndexArray = __GetIndexFromMnuArray($_hMnu)
    If @error Then Return SetError(1,0,-1)
    Local $aItem = $__aHWND_MNU[$iIndexArray][3]
    Local $iCountShape = $__aHWND_MNU[$iIndexArray][4]
    Local $iCountEntry = $aItem[0][0] -$iCountShape
    If IsKeyword($_iMarginLeft) Or $_iMarginLeft = -1 Then $_iMarginLeft = $__aHWND_MNU[$iIndexArray][5]
    Local $iWidth = $__aHWND_MNU[$iIndexArray][6]
    Local $iHeight = $__iMNU_DEF_HEIGHT
    If $_sText = '' Then $_iType = 4
    If $_iType = 4 Then $iHeight = $__iMNU_DEF_SHAPEHEIGHT

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

    Local $iID, $iTop_BackLabel = ($iCountEntry*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
    GUICtrlCreateLabel('', 0, $iTop_BackLabel, $iWidth, $iHeight)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUICtrlSetState(-1, $GUI_DISABLE)
    If $_iType = 4 Then $iCountShape += 1

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

    ReDim $aItem[UBound($aItem)+1][3]
    $aItem[0][0] += 1
    WinMove($_hMnu, '', 10, 10, $iWidth, ($aItem[0][0]-$iCountShape)*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
    Local $iItemTop = ($__iMNU_DEF_LABELSHIFT+ $iCountEntry*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
    Switch $_iType
    Case 1 ; Standard Label
    $iID = GUICtrlCreateLabel($_sText, $_iMarginLeft, $iItemTop, $iWidth-$_iMarginLeft-2, 17)
    Case 2 ; Checkbox
    $iID = GUICtrlCreateCheckbox($_sText, $_iMarginLeft, $iItemTop-1, $iWidth-$_iMarginLeft-2, 17)
    Case 3 ; Radio
    $iID = GUICtrlCreateRadio($_sText, $_iMarginLeft, $iItemTop-1, $iWidth-$_iMarginLeft-2, 17)
    $aItem[1][0] = True
    Case 4 ; Shape
    $iID = GUICtrlCreateLabel('', 4, ($iCountEntry*$__iMNU_DEF_HEIGHT + ($iCountShape-1)*$__iMNU_DEF_SHAPEHEIGHT), $iWidth-8, 1, $SS_GRAYFRAME)
    EndSwitch
    GUICtrlSetResizing($iID, $GUI_DOCKALL)

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

    $aItem[$aItem[0][0]+1][0] = $iID
    $aItem[$aItem[0][0]+1][1] = $_iType
    $__aHWND_MNU[$iIndexArray][3] = $aItem
    $__aHWND_MNU[$iIndexArray][4] = $iCountShape
    Return $iID
    EndFunc ;==>_GUICtrlOwnContext_AddItem

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

    ;===============================================================================
    ; Function Name....: _GUICtrlOwnContext_AddImage
    ; Description......: Create Menu-Item with Image (icon, jpg/gif/bmp, colored squares)
    ; Parameter(s).....: $_hMnu Menu Handle
    ; .................: $_sText Item-Text
    ; .................: $_sPathImage Path image file
    ; .................: $_sIconName Name or number of icon inside icon file with multiple icons, -1 (Default)
    ; .................: $_iType 1=Picture(bmp,jpg,gif), 2=Icon, 3=colored squares
    ; .................: $_iMarginLeft Left margin, only if different from value, that used with _GUICtrlOwnContext_Create
    ; .................: $_iColor Color for squares
    ; Requirement(s)...: with _GUICtrlOwnContext_Create menu created
    ; Return Value(s)..: Success Item-ID
    ; .................: Failure -1, @error=1 on specified handle does not exist
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlOwnContext_AddImage($_hMnu, $_sText, $_sPathImage='', $_sIconName=-1, $_iType=1, $_iMarginLeft=-1, $_iColor=0xFFFFFF)
    Local $iIndexArray = __GetIndexFromMnuArray($_hMnu)
    If @error Then Return SetError(1,0,-1)
    Local $aItem = $__aHWND_MNU[$iIndexArray][3]
    Local $iCountShape = $__aHWND_MNU[$iIndexArray][4]
    Local $iCountEntry = $aItem[0][0] -$iCountShape
    If IsKeyword($_iMarginLeft) Or $_iMarginLeft = -1 Then $_iMarginLeft = $__aHWND_MNU[$iIndexArray][5]
    Local $iWidth = $__aHWND_MNU[$iIndexArray][6]

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

    Local $iID, $iTop_BackLabel = ($iCountEntry*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
    GUICtrlCreateLabel('', 0, $iTop_BackLabel, $iWidth, $__iMNU_DEF_HEIGHT)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    ReDim $aItem[UBound($aItem)+1][3]
    $aItem[0][0] += 1
    WinMove($_hMnu, '', 10, 10, $iWidth, ($aItem[0][0]-$iCountShape)*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT)
    Local $iItemTop = ($__iMNU_DEF_LABELSHIFT+ $iCountEntry*$__iMNU_DEF_HEIGHT + $iCountShape*$__iMNU_DEF_SHAPEHEIGHT), $iIDPic
    If $_iMarginLeft < 2 Then $_iMarginLeft = 2
    Switch $_iType
    Case 1
    Local $iStyle = $SS_NOTIFY
    If StringRight($_sPathImage, 3) = 'bmp' Then $iStyle = BitOR($iStyle,$SS_BITMAP)
    $iIDPic = GUICtrlCreatePic($_sPathImage, $_iMarginLeft -2, $iItemTop-1, 16, 16, $iStyle)
    $iID = GUICtrlCreateLabel($_sText, $_iMarginLeft +16 , $iItemTop, $iWidth-$_iMarginLeft-18, 17)
    Case 2
    $iIDPic = GUICtrlCreateIcon($_sPathImage, $_sIconName, $_iMarginLeft -2, $iItemTop-1, 16, 16, BitOR($SS_NOTIFY,$SS_ICON))
    $iID = GUICtrlCreateLabel($_sText, $_iMarginLeft +16 , $iItemTop, $iWidth-$_iMarginLeft-18, 17)
    Case 3
    $iIDPic = GUICtrlCreateLabel('', $_iMarginLeft -2, $iItemTop-1, 16, 16)
    GUICtrlSetBkColor(-1, $_iColor)
    $iID = GUICtrlCreateLabel($_sText, $_iMarginLeft +16 , $iItemTop, $iWidth-$_iMarginLeft-18, 17)
    EndSwitch
    GUICtrlSetResizing($iIDPic, $GUI_DOCKALL)
    GUICtrlSetResizing($iID, $GUI_DOCKALL)

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

    $aItem[$aItem[0][0]+1][0] = $iID
    $aItem[$aItem[0][0]+1][1] = 1
    $__aHWND_MNU[$iIndexArray][3] = $aItem
    Return $iID
    EndFunc ;==>_GUICtrlOwnContext_AddImage

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

    ;===============================================================================
    ; Function Name....: _GUICtrlOwnContext_ShowFlag
    ; Description......: Condition to show Menu (True/False)
    ; .................: If the condition is TRUE, the menu will displayed.
    ; Parameter(s).....: $_hMnu Menu Handle
    ; .................: $_fFlag Boolean expression (eg a test function to return True / False)
    ; Requirement(s)...: with _GUICtrlOwnContext_Create menu created
    ; Return Value(s)..: Nothing
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlOwnContext_ShowFlag($_hMnu, $_fFlag=False)
    For $i = 0 To UBound($__aHWND_MNU) -1
    If $__aHWND_MNU[$i][1] = $_hMnu Then
    $__aHWND_MNU[$i][2] = $_fFlag
    Return
    EndIf
    Next
    EndFunc ;==>_GUICtrlOwnContext_ShowFlag

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

    ;===============================================================================
    ; Function Name....: _GUICtrlOwnContext_SetHoverColor
    ; Description......: Sets custom hover color
    ; Parameter(s).....: $_hMnu Menu Handle
    ; .................: $_iColor custom RGB color
    ; Requirement(s)...: with _GUICtrlOwnContext_Create menu created
    ; Return Value(s)..:
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GUICtrlOwnContext_SetHoverColor($_hMnu, $_iColor=$__iMNU_DEF_HOVERCOLOR)
    Local $iIndexArray = __GetIndexFromMnuArray($_hMnu)
    If @error Then Return SetError(1,0,$iIndexArray)
    $__aHWND_MNU[$iIndexArray][7] = $_iColor
    Return '0x' & Hex($_iColor,6)
    EndFunc ;==>_GUICtrlOwnContext_SetHoverColor

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

    #region - internal functions
    ;===============================================================================
    ; Function Name....: __IsHover
    ; Description......: Checks if the mouse is over an entry. Change background color, if so.
    ;===============================================================================
    Func __IsHover()
    Local Static $iID_LastOver = 0
    If $__hCURRENT_ACTIVE_MNU = 0 Then Return
    Local $aCursor = GUIGetCursorInfo()
    If Not IsArray($aCursor) Then Return
    Local $iID = $aCursor[4]
    Local $iIndexArray = __GetIndexFromMnuArray($__hCURRENT_ACTIVE_MNU)
    Local $aItem = $__aHWND_MNU[$iIndexArray][3]
    Local $iWidth = $__aHWND_MNU[$iIndexArray][6]
    Local $aMPos[2] = [$aCursor[0],$aCursor[1]]
    Local $iHoverColor = $__aHWND_MNU[$iIndexArray][7]
    For $i = 2 To $aItem[0][0] +1
    If __MouseOverCtrl($__hCURRENT_ACTIVE_MNU, $aItem[$i][0], $aMPos) And _
    $iID_LastOver <> $aItem[$i][0] And _
    ControlGetText($__hCURRENT_ACTIVE_MNU, '', $aItem[$i][0]) <> '' And _
    BitAND(GUICtrlGetState($aItem[$i][0]), $GUI_ENABLE) Then
    If $iID_LastOver <> 0 Then GUICtrlSetBkColor($iID_LastOver, $GUI_BKCOLOR_TRANSPARENT)
    $iID_LastOver = $aItem[$i][0]
    GUICtrlSetBkColor($aItem[$i][0], $iHoverColor)
    ExitLoop
    EndIf
    Next
    EndFunc ;==>__IsHover

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

    ;===============================================================================
    ; Function Name....: __GetIndexFromMnuArray
    ; Description......: Search index from menu array for given menu handle
    ;===============================================================================
    Func __GetIndexFromMnuArray($_hMnu)
    For $i = 0 To UBound($__aHWND_MNU) -1
    If $__aHWND_MNU[$i][1] = $_hMnu Then
    Return $i
    EndIf
    Next
    Return SetError(1,0,-1)
    EndFunc ;==>__GetIndexFromMnuArray

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

    ;===============================================================================
    ; Function Name....: __WinProc
    ; Description......: Callback windows procedure
    ;===============================================================================
    Func __WinProc($hWnd, $Msg, $wParam, $lParam)
    Switch $Msg
    Case $WM_NOTIFY
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $iOldOpt, $aMPos

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

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")

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

    $iOldOpt = Opt('MouseCoordMode', 1)
    $aMPos = MouseGetPos()
    Opt('MouseCoordMode', $iOldOpt)

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

    ; == Menu is shown, clicked outside menu, but inside assigned control ==> Menu hide
    If $__hCURRENT_ACTIVE_MNU <> 0 And $iCode = $NM_CLICK Then
    Local $tPoint = DllStructCreate('int;int')
    DllStructSetData($tPoint, 1, $aMPos[0])
    DllStructSetData($tPoint, 2, $aMPos[1])
    Local $tRectContext = _WinAPI_GetWindowRect($__hCURRENT_ACTIVE_MNU)
    If Not _WinAPI_PtInRect($tRectContext, $tPoint) Then
    GUISetState(@SW_HIDE, $__hCURRENT_ACTIVE_MNU)
    AdlibUnRegister('__IsHover')
    $__hCURRENT_ACTIVE_MNU = 0
    Return _WinAPI_CallWindowProc($__hHOOK_PROC, $hWnd, $Msg, $wParam, $lParam)
    EndIf
    EndIf

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

    ; == Menu show
    Switch $iCode
    Case $NM_RCLICK
    For $i = 0 To UBound($__aHWND_MNU) -1
    If $hWndFrom = $__aHWND_MNU[$i][0] Then
    If $__aHWND_MNU[$i][2] Then ; == Condition True?
    $__hCURRENT_ACTIVE_MNU = $__aHWND_MNU[$i][1]
    Local $aWin = WinGetPos($__hGUI_MNUEX)
    Local $aWinMnu = WinGetPos($__hCURRENT_ACTIVE_MNU)
    Local $iX = $aMPos[0], $iY = $aMPos[1]
    If $iX +$aWinMnu[2] > @DesktopWidth Then $iX -= $aWinMnu[2]
    If $iY +$aWinMnu[3] > @DesktopHeight Then $iY -= $aWinMnu[3]
    WinMove($__hCURRENT_ACTIVE_MNU, '', $iX, $iY)
    AdlibRegister('__IsHover', 10)
    GUISetState(@SW_SHOW, $__hCURRENT_ACTIVE_MNU)
    EndIf
    ExitLoop
    EndIf
    Next
    EndSwitch
    Case Else
    Return _WinAPI_CallWindowProc($__hHOOK_PROC, $hWnd, $Msg, $wParam, $lParam)
    EndSwitch
    EndFunc ;==>__WinProc

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

    ;===============================================================================
    ; Function Name....: __MouseProc
    ; Description......: Callback mouse procedure
    ;===============================================================================
    Func __MouseProc($nCode, $wParam, $lParam)
    If $nCode < 0 Or $__hCURRENT_ACTIVE_MNU = 0 Then
    Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
    EndIf
    Local $iCtrl = 0, $iType, $aItem
    Local $iOldOpt = Opt('MouseCoordMode', 2)
    Local $aMPos = MouseGetPos()
    Opt('MouseCoordMode', $iOldOpt)
    For $i = 0 To UBound($__aHWND_MNU) -1
    If $__aHWND_MNU[$i][1] = $__hCURRENT_ACTIVE_MNU Then
    $aItem = $__aHWND_MNU[$i][3]
    For $j = 2 To $aItem[0][0] +1
    If __MouseOverCtrl($__hCURRENT_ACTIVE_MNU, $aItem[$j][0], $aMPos) Then
    $iCtrl = $aItem[$j][0]
    $iType = $aItem[$j][1]
    ExitLoop(2)
    EndIf
    Next
    EndIf
    Next

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

    If $nCode = $__HC_ACTION Then
    Switch $wParam
    Case $WM_RBUTTONDOWN
    If $iCtrl <> 0 Then
    Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
    Else
    __MenuHide()
    Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
    EndIf
    Case $WM_LBUTTONDOWN
    If $iCtrl <> 0 Then
    ; ctrl is disabled ==> do nothing
    If BitAND(GUICtrlGetState($iCtrl), $GUI_DISABLE) Then Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
    ; set state for checkbox/radios
    If $iType = 2 Then
    GUICtrlSetState($iCtrl, BitXOR(BitOR($GUI_CHECKED, $GUI_UNCHECKED), BitAND(GUICtrlRead($iCtrl),$GUI_CHECKED)))
    ElseIf $iType = 3 Then
    GUICtrlSetState($iCtrl, BitXOR(BitOR($GUI_CHECKED, $GUI_UNCHECKED), BitAND(GUICtrlRead($iCtrl),$GUI_CHECKED)))
    For $j = 2 To $aItem[0][0] +1
    If $aItem[$j][1] <> 3 Or $aItem[$j][0] = $iCtrl Then ContinueLoop
    GUICtrlSetState($aItem[$j][0], $GUI_UNCHECKED)
    Next
    EndIf
    Else
    __MenuHide()
    Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
    EndIf
    _WinAPI_PostMessage($__hGUI_MNUEX, $WM_COMMAND, $iCtrl, 0)
    __MenuHide()
    Return -1
    EndSwitch
    EndIf
    Return _WinAPI_CallNextHookEx($__hHOOK, $nCode, $wParam, $lParam)
    EndFunc ;==>__MouseProc

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

    ;===============================================================================
    ; Function Name....: __MenuHide
    ; Description......: Hides menu and stops hover check
    ;===============================================================================
    Func __MenuHide()
    AdlibUnRegister('__IsHover')
    GUISetState(@SW_HIDE, $__hCURRENT_ACTIVE_MNU)
    GUISetState(@SW_SHOW, $__hGUI_MNUEX)
    $__hCURRENT_ACTIVE_MNU = 0
    EndFunc ;==>__MenuHide

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

    ;===============================================================================
    ; Function Name....: __MouseOverCtrl
    ; Description......: Checks if mouse is over an given control
    ;===============================================================================
    Func __MouseOverCtrl($_hGUI, $_iID, $_aMPos)
    Local $posC = ControlGetPos($_hGUI, '', $_iID)
    If @error Then Return False
    If ($_aMPos[0] >= $posC[0] And $_aMPos[0] <= $posC[0]+$posC[2]) And _
    ($_aMPos[1] >= $posC[1] And $_aMPos[1] <= $posC[1]+$posC[3]) Then
    Return True
    Else
    Return False
    EndIf
    EndFunc ;==>__MouseOverCtrl

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

    #endregion

    [/autoit]


    DL bisher: 15

    Dateien

    OwnContext[0.8].au3 20,55 kB – 413 Downloads OwnContext_Example.au3 39,77 kB – 446 Downloads context_w_submenu.jpg 110 kB – 0 Downloads OwnContext_Example[0.9].au3 43,39 kB – 479 Downloads
  • Vorgaben in Input-Felder mit Enter übernehmen

    • BugFix
    • 8. Juli 2012 um 09:44
    Zitat von entsel

    Ich fürchte, Deine Mühe dürfte umsonst gewesen zu sein und eine Lösung scheint nicht möglich.


    (Fast) Nichts ist unmöglich. :D
    Hier inkl. "Anschieben" weiteren Codes:

    Spoiler anzeigen
    [autoit]

    #Include <WinAPI.au3>
    #Include <Array.au3>
    #Include <GUIConstantsEx.au3>
    #Include <WindowsConstants.au3>

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

    Global $fID_Changed = False, $iID_Current, $iIndex_Current

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

    $hGUI = GUICreate('TEST')
    $input1 = GUICtrlCreateInput('1', 40, 30, 60, 20)
    $input2 = GUICtrlCreateInput('', 40, 60, 60, 20)
    $input3 = GUICtrlCreateInput('', 40, 90, 60, 20)
    $input4 = GUICtrlCreateInput('', 40, 120, 60, 20)
    $btArray = GUICtrlCreateButton('Zeige Werte-Array', 20, 200, 150, 25)

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

    Global $aInput[4][2] = [[$input1],[$input2],[$input3],[$input4]] ; == alle Input in einem Array verwalten, Werte werden in das Array gelesen

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

    GUISetState(@SW_SHOW, $hGUI)

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

    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND') ; == registriert Windows-Message "WM_COMMAND" und weist dieser Msg die gleichnamige Funktion zu

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

    While 1
    If $fID_Changed Then
    $fID_Changed = False
    _Event()
    EndIf
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btArray
    _ArrayDisplay($aInput)
    EndSwitch
    WEnd

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

    Func _Event()
    Switch $iID_Current
    Case $input1
    MsgBox(0, '', 'Hier dein Code für Input-1' & @CRLF & 'Wert: ' & $aInput[$iIndex_Current][1])
    Case $input2
    MsgBox(0, '', 'Hier dein Code für Input-2' & @CRLF & 'Wert: ' & $aInput[$iIndex_Current][1])
    Case $input3
    MsgBox(0, '', 'Hier dein Code für Input-3' & @CRLF & 'Wert: ' & $aInput[$iIndex_Current][1])
    Case $input4
    MsgBox(0, '', 'Hier dein Code für Input-4' & @CRLF & 'Wert: ' & $aInput[$iIndex_Current][1])
    EndSwitch
    EndFunc

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode, $iNext, $fFound = False
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16) ; Hi Word
    Select
    Case $iCode = 0x0
    Local $ID = _WinAPI_GetDlgCtrlID(ControlGetHandle($hGUI, '', ControlGetFocus($hGUI)))
    For $i = 0 To UBound($aInput) -1
    If $aInput[$i][0] = $ID Then
    $fFound = True
    ExitLoop
    EndIf
    Next
    If Not $fFound Then Return $GUI_RUNDEFMSG ; == Control-ID gehört nicht zu den überwachten Input
    $iNext = $i +1
    If $iNext = UBound($aInput) Then $iNext = 0 ; == Array-Index für nächstes Control, bei Ende wieder zum ersten
    $aInput[$i][1] = GUICtrlRead($aInput[$i][0]) ; == Wert auslesen und in das Array schreiben
    ControlFocus($hGUI, '', $aInput[$iNext][0]) ; == Fokus auf nächstes Input setzen
    $iID_Current = $ID ; == aktuelle ID in Globale Variable schreiben (für Weiterverarbeitung)
    $iIndex_Current = $i ; == Array-Index der ID in Globale Variable schreiben (für Weiterverarbeitung)
    $fID_Changed = True ; == Triggerwert zum Start der Weiterverarbeitung
    EndSelect
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • Default-Wert mit Enter übernehmen

    • BugFix
    • 8. Juli 2012 um 09:06

    Ich hatte dir in dem angesprochenen Thread eine Lösungsvariante gepostet. (deine letzte Frage dort hatte ich aber nicht mitbekommen ;))
    Aber diese stellt sich auch gar nicht, da den Inputs ja konkret Felder zugeordnet sind. In der WM_COMMAND wird erkannt welches Control den Fokus hat (verwaltet in einem Array), während ENTER betätigt wird. Dein Problem ist also bereits gelöst.

    EDIT:

    Ich habe dir die Lösung inklusive "Anschieben" weiteren Codes im Original-Thread gepostet.
    Bitte beachten: In Funktionen, die mit GuiRegisterMsg registriert werden, sollten keine Funktionen gestartet werden, die einen undefinierten Zeitablauf haben. (z.B. MsgBox enthalten oder Warten auf Usereingabe etc.)!
    Deshalb schalte ich in diesen Fällen boolsche Variablen als Trigger, über deren Status dann in der Hauptprogrammschleife die weiteren Funktionen aktiviert werden können.

  • PDF Datei nach Wort durchsuchen und dieses dann als Dateiname verwenden und die Datei umbenennen.

    • BugFix
    • 7. Juli 2012 um 11:26
    Zitat von $var

    Ja, stimmt doch so. Schau mal in Zeile 13 - da ist es leicht verschachtelt..


    ..du hast tatsächlich PDF-Dateien, die den Text im Klartext enthalten?? Sollte mich sehr wundern und ist, wenn überhaupt, sicher die Ausnahme. ;)
    (Schau dir mal eine PDF-Datei im Editor an, dann weißt du was ich meine)

  • PDF Datei nach Wort durchsuchen und dieses dann als Dateiname verwenden und die Datei umbenennen.

    • BugFix
    • 7. Juli 2012 um 09:15

    $var: Er will die Datei-Inhalte nach dem Wort durchsuchen, nicht die Datei-Namen.
    Ich glaube, im EN-Forum habe ich etwas derartiges für PDF schonmal gesehen. Mußt du mal dort suchen.

  • neue HotKey UDF benötigt oder nicht?

    • BugFix
    • 7. Juli 2012 um 08:03
    Zitat von D2thunder

    Unnütz ist etwas nur wenn man es nicht benötigt(du solltest aber an andere auch denken), wäre nicht grad toll wenn die alle befehle aus AutoIt löschen die du als unnüzu empfindest(also welche die du sonst nie benutzt) :P Jetzt stell ich mir die Frage ob du bei allen Projekten anderer Personen die dich sowieso nicht interessieren immer hinschreibst das du das "als absolut unnütz empfinde"´st ??? ?(


    1. Obwohl ich es persönlich nicht brauche habe ich den Hinweis (Hook) gegeben. - Das war meine Intention hier zu posten.
    2. Du solltest Lesen lernen. Ich habe begründet, warum ich keinerlei Aktivitäten in dieser Richtung unternehme, mit dem Zusatz, dass das aber für jeden anders sein kann (Geschmackssache). Un du wirst mir schon zugestehen müssen, dass ich eine persönliche Meinung zu etwas habe und auch noch die Frechheit besitze diese zu Äüßern. :P

  • neue HotKey UDF benötigt oder nicht?

    • BugFix
    • 6. Juli 2012 um 20:42
    Zitat von D2thunder

    Mein Ziel währe es jetzt die drei Funktionen/UDF´s zu "verschmelzen" - also von jeder den Vorteil aber keiner den Nachteil.


    Ist so schwer nicht: Mouse-Hook und Keyboard-Hook in einem gemeinsamen Skript lösen das. Die entsprechenden Hook-Skripte findest du hier im Forum, habe ich garantiert schon gepostet, musst dann nur noch anpassen.
    Ich selbst habe keinen Bock dazu, weil ich eine Hotkey-UDF als absolut unnütz empfinde (aber das ist Geschmackssache). :D

  • Firefox url auslesen

    • BugFix
    • 2. Juli 2012 um 21:34
    Zitat von Tweaky

    Aber die DDEMLServer.au3 brauche ich nicht, oder?

    Nein, ich habe den nur der Vollständigkeit halber dazugefügt.

    Zitat von Tweaky

    Mit dem IE funktioniert es nun auch.

    Du kannst den DDE-Aufruf auch für die IE-Abfrage (und jeden sonstigen Browser) verwenden. Mußt nur in der Funktion statt "Firefox" den entsprechenden Programmnamen mit übergeben (wenn ich die Funktion jetzt richtig interpretiert habe, leider nicht beschrieben).

  • Firefox url auslesen

    • BugFix
    • 30. Juni 2012 um 15:38

    Hier die Lösung.
    Mittels DDE kann man das Auslesen vornehmen. Für DDE in AutoIt habe ich hier eine Lösung gefunden.
    Ich hänge die notwendigen Dateien aber gleich mal an (habe dort auch die ganzen parallelen Konsolenausgaben auskommentiert).

    Und hier das Skript:

    [autoit]

    #include <DDEML.au3>
    #include <DDEMLClient.au3>
    ConsoleWrite(_Get_FF_url() & @CRLF)

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

    Func _Get_FF_url()
    Local $sRet = _DDEMLClient_RequestString("Firefox", "WWW_GetWindowInfo", "0xFFFFFFFF", $CF_TEXT)
    Local $aSplit = StringSplit($sRet, ',')
    Local $aUrl = StringRegExp($aSplit[1], '(?<=")([^"]+)', 1)
    Return $aUrl[0]
    EndFunc

    [/autoit]

    Dateien

    DDEML.au3 34,36 kB – 545 Downloads DDEMLClient.au3 16,43 kB – 541 Downloads DDEMLConstants.au3 8,72 kB – 520 Downloads DDEMLServer.au3 9,65 kB – 504 Downloads
  • WM_NOTIFY funktioniert nicht richtig

    • BugFix
    • 29. Juni 2012 um 12:31

    Ich zeig dir trotzdem mal, wie du das nutzt - ist ganz simpel:

    Spoiler anzeigen
    [autoit]

    #include <GuiListBox.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Constants.au3>
    #include <WinAPI.au3>
    #include <StructureConstants.au3>

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

    $hGui = GUICreate('Test')
    $cListBox = GUICtrlCreateList('', 10, 10, 300, 150)
    $hListBox = GUICtrlGetHandle($cListbox)
    $cEdit = GUICtrlCreateEdit('', 10, 180, 300, 150)
    GUICtrlSetData($cListBox, 'Zeile1|Zeile2|Zeile3|Zeile4')

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

    ; == Da WM_NOTIFY ausser dem Event nur die Mausposition als Info bereitstellt, muss bei mehreren Controls geprüft werden,
    ; == ob die Maus gerade über dem Control ist. Dazu werden die (relativen) Controlpositionen in einem RECT gespeichert.
    $tList = DllStructCreate($tagRECT)
    $tEdit = DllStructCreate($tagRECT)
    _WinAPI_SetRect($tList, 10, 10, 310, 160)
    _WinAPI_SetRect($tEdit, 10, 180, 310, 330)
    Global $aID[2][2] = [[$cListBox,$tList],[$cEdit,$tEdit]]

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

    GUISetState()

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

    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
    GUIRegisterMsg($WM_PARENTNOTIFY, 'WM_PARENTNOTIFY')

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

    Do
    Until GUIGetMsg() = -3

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Switch $ilParam
    Case $hListBox
    Switch BitShift($iwParam, 16)
    Case $LBN_DBLCLK
    ConsoleWrite('Double-Click' & @CRLF)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    Func WM_PARENTNOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Switch $hWnd
    Case $hGui
    Local $iX = BitAND($ilParam, 0xFFFF)
    Local $iY = BitShift($ilParam, 16)
    Local $sControl = _ClickedControl($iX, $iY)
    Switch BitAND($iwParam, 0xFFFF)
    Case $WM_LBUTTONDOWN
    ConsoleWrite('Left-Down, X,Y: ' & $iX & ',' & $iY & @TAB & @TAB & 'on ' & $sControl & '-Control' & @CRLF)
    Case $WM_RBUTTONDOWN
    ConsoleWrite('Right-Down, X,Y: ' & $iX & ',' & $iY & @TAB & @TAB & 'on ' & $sControl & '-Control' & @CRLF)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PARENTNOTIFY

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

    Func _ClickedControl($_iX, $iY)
    Local $cCtrl
    For $i = 0 To UBound($aID) -1
    If _WinAPI_CoordInRect($aID[$i][1], $_iX, $iY) Then
    $cCtrl = $aID[$i][0]
    ExitLoop
    EndIf
    Next
    Switch $cCtrl
    Case $cListBox
    Return 'ListBox'
    Case $cEdit
    Return 'Edit'
    EndSwitch
    EndFunc

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

    ;===============================================================================
    ; Function Name: _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
    ; Description: Befüllt eine RECT-Struktur in einem Aufruf mit Werten
    ; Parameter(s): $tRECT RECT-Struktur
    ; $X1, $Y1, $X2, $Y2 Werte des Rectangle (left, top, right, bottom)
    ; Return Value(s): Erfolg <> 0
    ; Fehler 0 set @error 1-keine Struktur übergeben
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
    If Not IsDllStruct($tRECT) Then Return SetError(1,0,0)
    Local $ret = DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($tRECT), 'long', $X1, 'long', $Y1, 'long', $X2, 'long', $Y2)
    If @error > 0 Then Return SetError(1,@error,0)
    Return $ret[0]
    EndFunc ;==>_WinAPI_SetRect

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

    ;===============================================================================
    ; Function Name: _WinAPI_CoordInRect(ByRef $tRECT, $X, $Y)
    ; Description: Ermittelt ob eine übergebene Koordinate innerhalb einer RECT-Struktur ist
    ; Analog zu _WinAPI_PtInRect, aber statt $tagPOINT werden Einzelkoordinaten übergeben
    ; Parameter(s): $tRECT RECT-Struktur
    ; $X X-Koordinate
    ; $Y Y-Koordinate
    ; Return Value(s): Erfolg True/False Punkt in/nicht in RECT
    ; Fehler 0 set @error 1-keine Struktur übergeben
    ; 2-Dll-Fehler (s. @extended)
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _WinAPI_CoordInRect(ByRef $tRECT, $X, $Y)
    If Not IsDllStruct($tRECT) Then Return SetError(1,0,0)
    Local $ret = DllCall("user32", "long", "PtInRect", "ptr", DllStructGetPtr($tRECT), "long", $X, "long", $Y)
    If @error > 0 Then Return SetError(2,@error,0)
    If $ret[0] Then Return True
    Return False
    EndFunc ;==>_WinAPI_CoordInRect

    [/autoit]


    Edit: Ich habe das Bsp. mal erweitert, um zu zeigen, wie du bei mehreren Controls vorgehst.

  • WM_NOTIFY funktioniert nicht richtig

    • BugFix
    • 29. Juni 2012 um 10:08

    Für die Listbox mußt du WM_COMMAND auswerten, Doppelklick=LBN_DBLCLICK
    (s. Bsp. in der Hilfe zu

    [autoit]

    _GUICtrlListBox_Create

    [/autoit]

    )
    Einfacher Klick wird nicht direkt als Nachricht ausgegeben, da mußt du den Umweg gehen über über das Parent-Handle (im Normalfall dein GUI-Handle) und dort abfragen:
    WM_PARENTNOTIFY
    mit LOWORD(wParam) = WM_LBUTTONDOWN

  • Excel die zweite...

    • BugFix
    • 28. Juni 2012 um 17:59

    Ich denke mal, dass bei den paar Zellen, das Einlesen in ein Array und dann erst vergleichen eher langsamer ist.
    So sollte es flott laufen.

    [autoit]

    $oBook1 = _ExcelBookOpen('Pfad1')
    $oBook2 = _ExcelBookOpen('Pfad2')
    For $i = 0 To 34
    If $oBook1.Range('B1').Offset($i, 0).Value = $oBook2.Range('B1').Offset($i, 0).Value Then ConsoleWrite('Inhalt gleich: ' & $oBook2.Range('B1').Offset($i, 0).Value & @CRLF)
    If $oBook1.Range('C1').Offset($i, 0).Value = $oBook2.Range('C1').Offset($i, 0).Value Then ConsoleWrite('Inhalt gleich: ' & $oBook2.Range('C1').Offset($i, 0).Value & @CRLF)
    If $oBook1.Range('D1').Offset($i, 0).Value = $oBook2.Range('D1').Offset($i, 0).Value Then ConsoleWrite('Inhalt gleich: ' & $oBook2.Range('D1').Offset($i, 0).Value & @CRLF)
    If $oBook1.Range('I1').Offset($i, 0).Value = $oBook2.Range('I1').Offset($i, 0).Value Then ConsoleWrite('Inhalt gleich: ' & $oBook2.Range('I1').Offset($i, 0).Value & @CRLF)
    Next

    [/autoit]

    Man könnte auch für 'B' bis 'D' das Spaltenoffset in einer extra Schleife nutzen. Ist aber dieselbe Menge Code - also kein Vorteil.

  • Problem mit "Case"

    • BugFix
    • 28. Juni 2012 um 17:37

    Im " Case $Button4 " fehlt ein EndIf, dafür ist es beim letzten Case zuviel.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™