Herzlichen Glückwunsch zum Burzeltag und alles Gute !
[Blockierte Grafik: http://www10.pic-upload.de/17.02.12/2xeusp3i6po.gif]
LG
Greenhorn
Herzlichen Glückwunsch zum Burzeltag und alles Gute !
[Blockierte Grafik: http://www10.pic-upload.de/17.02.12/2xeusp3i6po.gif]
LG
Greenhorn
Hallo Ilse,
ja, ich schaue es mir noch einmal an.
Kann aber ein/zwei Tage dauern, habe im Moment viel RL-mäßig um die Ohren.
LG
Greenhorn
Also wenn ich das alles richtig verstanden habe, dann möchtest Du eine Bitmap aus einer EXE extrahieren und auf Deiner Schaltfläche anzeigen ???
Gruß
Greenhorn
Hallo Ilse,
so nun haben wir es.
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
;-- Global variables
Global $sDataDir = @ScriptDir & "\Data"
Global $idButton [1], $idcbo
Global $sCurComboSel
;-- Start script
Exit (ScriptMain ( ))
;-- Main function of the script
Func ScriptMain ( )
Local $hwnd
Local $nMsg
Local $rcClient
$hwnd = GUICreate ("Form1", 625, 443, 192, 124, _
BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS))
GUICtrlCreateLabel ("Auswahl", 12, 5)
$idcbo = GUICtrlCreateCombo ("", 12, 23, 145, 25)
InitComboData ($idcbo)
CreateButtons ($idcbo)
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg ($WM_SIZE, "OnSize")
GUISetState (@SW_SHOW)
While 1
$nMsg = GUIGetMsg ( )
Switch ($nMsg)
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idButton[0] To $idButton[UBound($idButton) - 1]
MsgBox(4096, "", StringFormat ("Es wurde eine Schaltfläche gedrückt.\nID: %d\nText: %s", $nMsg, GUICtrlRead ($nMsg)))
Case $idcbo
If ($sCurComboSel <> GUICtrlRead ($idcbo)) Then
$sCurComboSel = GUICtrlRead ($idcbo)
[/autoit] [autoit][/autoit] [autoit]DeleteButtons ( )
CreateButtons ($idcbo)
$rcClient = WinGetClientSize ($hwnd)
OnSize ($hwnd, $WM_SIZE, 0, MAKELPARAM($rcClient[0], $rcClient[1]))
EndIf
EndSwitch
WEnd
Return 0
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit];-- Aligns the buttons
Func OnSize ($hwnd, $message, $wParam, $lParam)
Local $cx, $cy
Local $nWidth, $nHeight
Local $cnLoop = 0
Local $cnButtons = UBound ($idButton) ; Anzahl der Schaltflächen
Local $nColumns = 2 ; Anzahl der Spalten
Local $nRows = Ceiling ($cnButtons / $nColumns) ; Anzahl der Reihen
$cx = 10 ; Abstand links/rechts
$cy = 200 ; Abstand oben
$nWidth = Int(((BitAND($lParam, 0xffff) - $cx * 2) - (22 * ($nColumns - 1))) / ($nColumns))
$nHeight = Int(((BitShift($lParam, 16) - $cy - 10) - (22 * ($nRows - 1))) / $nRows)
For $i = 0 To $nRows - 1
For $j = 0 To $nColumns - 1
If ($cnLoop >= $cnButtons) Then ExitLoop
WinMove (GUICtrlGetHandle ($idButton[$cnLoop]), "", $cx, $cy, $nWidth, $nHeight)
$cx += $nWidth + 22
$cnLoop += 1
Next
$cx = 10
$cy += $nHeight + 22
Next
Return 0
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>OnSize
[/autoit] [autoit][/autoit] [autoit];-- Initializes the content of the combo box
Func InitComboData ($idCombo)
Local $aInis
Local $sFileName
$aInis = _FileListToArray ($sDataDir, "*.ini", 1)
[/autoit] [autoit][/autoit] [autoit]If IsArray ($aInis) Then
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To $aInis[0]
[/autoit] [autoit][/autoit] [autoit]$sFileName = StringTrimRight ($aInis[$i], 4)
GUICtrlSetData ($idcbo, $sFileName, $sFileName)
Next
EndIf
$sCurComboSel = GUICtrlRead ($idcbo)
[/autoit] [autoit][/autoit] [autoit]Return 0
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit];-- Creates a button for each entry in the INI section "Name"
Func CreateButtons ($idCombo)
Local $var
Local $iniwahl
$iniwahl = StringFormat ("%s\\%s.ini", $sDataDir, GUICtrlRead ($idCombo))
[/autoit] [autoit][/autoit] [autoit]$var = IniReadSection ($iniwahl, "Namen")
[/autoit] [autoit][/autoit] [autoit]ReDim $idButton[$var[0][0]]
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $var[0][0]
[/autoit] [autoit][/autoit] [autoit]$idButton[$i - 1] = GUICtrlCreateButton ($var[$i][1], 0, 0)
Next
Return 0
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit];-- Deletes all buttons
Func DeleteButtons ( )
For $i = 0 To UBound($idButton) - 1
[/autoit] [autoit][/autoit] [autoit]GUICtrlDelete ($idButton[$i])
Next
Return 0
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit];-- Helper function
Func MAKELPARAM($wLow, $wHigh)
Return BitOR ( BitAND ( $wLow, 0xFFFF ), BitShift (BitAND ( $wHigh, 0xFFFF ), -16) )
EndFunc
Evtl musst Du noch den Pfad zu Deinen INIs wieder anpassen.
LG
Greenhorn
Hallo Ilse,
ich sehe es mir mal an.
Heute Abend oder morgen melde ich mich dann bei Dir.
LG
Greenhorn
Moin Crys,
wenn Du einen Windows-Konformen Installer erstellen möchtest, dann solltest Du so etwas wie NSIS nehmen.
Da hast dann auch eine ordentliche Deinstallationsroutine dabei und es lässt sich über die Systemsteuerung deinstallieren.
Für Programmeinträge in der Registrierung nimmt man im Allgemeinen den Hive HKCU\Software\Progammname.
Gruß
Greenhorn
Moin,
hier noch einmal die einfache Version:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
Global $g_DropFiles [1]
; ...
GUIRegisterMsg($WM_DROPFILES, 'OnDropFiles')
; (...)
Func OnDropFiles ($hWnd, $msgID, $wParam, $lParam)
Local $cnFiles
$cnFiles = DragQueryFile ($wParam, 0xFFFFFFFF, 0, 0)
ReDim $g_DropFiles[$cnFiles] ; $g_DropFiles ist globales Array
For $i = 0 To $cnFiles - 1
DragQueryFile ($wParam, $i, $gaDropFiles[$i], 261) ; 261 = MAX_PATH + 1
Next
Return 0
EndFunc
Func DragQueryFile ($hDrop, $iFile, ByRef $lpszFile, $cch)
[/autoit] [autoit][/autoit] [autoit]Local $aRes = DllCall ("shell32.dll", "UINT", "DragQueryFileW", _
"HANDLE", $hDrop, _
"UINT", $iFile, _
"WSTR", $lpszFile, _
"UINT", $cch)
$lpszFile = $aRes[3]
Return $aRes[0]
EndFunc
[/autoit] [autoit][/autoit] [autoit][/autoit]Oder Deine ursprüngliche Version:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
Global $g_DropFiles [1]
; ...
GUIRegisterMsg($WM_DROPFILES, 'OnDropFiles')
; (...)
Func OnDropFiles ($hWnd, $msgID, $wParam, $lParam)
Local $cnFiles
Local $cchBuffer
Local $szBuffer
$szBuffer = DllStructCreate ("WCHAR [261]") ; 261 = MAX_PATH + 1
[/autoit] [autoit][/autoit] [autoit]$cnFiles = DragQueryFile ($wParam, 0xFFFFFFFF, 0, 0)
[/autoit] [autoit][/autoit] [autoit]ReDim $g_DropFiles[$cnFiles] ; $g_DropFiles ist globales Array
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To $cnFiles - 1
[/autoit] [autoit][/autoit] [autoit]$cchBuffer = DragQueryFile ($wParam, $i, 0, 0)
[/autoit] [autoit][/autoit] [autoit]If ($cchBuffer < 261) Then
; Dateiname in Puffer kopieren
DragQueryFile ($wParam, $i, DllStructGetPtr ($szBuffer), 260)
$g_DropFiles[$i] = DllStructGetData ($szBuffer)
Else
; Eher unwahrscheinlich ...
MsgBox (BitOR($MB_OK, $MB_ICONHAND), "Fehler", "Puffer ist zu klein!")
EndIf
Next
Return 0
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func DragQueryFile ($hDrop, $iFile, $lpszFile, $cch)
[/autoit] [autoit][/autoit] [autoit]Local $aRes = DllCall ("shell32.dll", "UINT", "DragQueryFileW", _
"HANDLE", $hDrop, _
"UINT", $iFile, _
"ptr", $lpszFile, _
"UINT", $cch)
Return $aRes[0]
EndFunc
[/autoit]Edith sagte ich hatte noch etwas vergessen ...
Gruß
Greenhorn
Hi,
um welches Proggie handelt es sich denn ?
Ansonsten bleibt immer noch die rohe Methode mit MouseClick ...
Gruß
Greenhorn
SCHADE und das geht leider bei diesem GuiScroll nicht.
Sonst wäre das die Lösung.
Dann schau doch mal hier wie Crys es gemacht hat.
Das solltest Du leicht an Dein Skript anpassen können.
Scrollbar GUI
Gruß
Greenhorn
Hi,
hier mal der Lösungsansatz von Andy (und ein wenig von mir).
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Global $idButton [1]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$Form1 = GUICreate("Form1", 625, 443, 192, 124, _
BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS))
$var = IniReadSection(@ScriptDir & '\Namen.ini',"Name")
If @error Then
MsgBox(4096, "", StringFormat ("Es ist ein Fehler aufgetreten.\nWarscheinlich keine INI Datei vorhanden."))
Else
ReDim $idButton [$var[0][0]]
For $i = 1 To $var[0][0]
$idButton[$i - 1] = GUICtrlCreateButton ($var[$i][1],0,0)
Next
EndIf
GUIRegisterMsg ($WM_SIZE, "OnSize")
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch ($nMsg)
Case $GUI_EVENT_CLOSE
Exit
Case $idButton[0] To $idButton[UBound ($idButton) - 1]
MsgBox(4096, "", StringFormat ("Es wurde eine Schaltfläche gedrückt.\nID: %d\nText: %s", $nMsg, GUICtrlRead ($nMsg)))
EndSwitch
WEnd
Func OnSize ($hwnd, $message, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]Local $rcClient
Local $cx, $cy
Local $nWidth, $nHeight
Local $cnLoop = 0
Local $cnButtons = UBound ($idButton) ; Anzahl der Schaltflächen
Local $nColumns = 4 ; Anzahl der Spalten
Local $nRows = Ceiling ($cnButtons / $nColumns) ; Anzahl der Reihen
$cx = 10 ; Abstand links/rechts/unten
$cy = 200 ; Abstand oben
$nWidth = int(((BitAND($lParam, 0xffff) - $cx * 2) - (22 * ($nColumns -1))) / ($nColumns ))
$nHeight = int(((BitShift($lParam, 16) - $cy - $cx) - (22 * ($nRows - 1))) / $nRows)
For $i = 0 To $nRows - 1
For $j = 0 To $nColumns - 1
If ($cnLoop >= $cnButtons) Then ExitLoop
WinMove (GUICtrlGetHandle ($idButton[$cnLoop]), "", $cx, $cy, $nWidth, $nHeight)
$cx += $nWidth + 22
$cnLoop += 1
Next
$cx = 10
$cy += $nHeight + 22
Next
Return 0
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit][/autoit]Mit der Schriftgröße muss ich mal sehen, ob ich das gebacken bekomme ...
Edith hat gesagt ich sollte den Abstand unten gleichmäßig zu denen an den Seiten halten.
Gesagt, getan.
Gruß
Greenhorn
AutoIt ist ziemlich lahm, aber so ist es schon etwas besser:
While 1
$Maus_pos = GUIGetCursorInfo()
Switch ($Button)
Case 1
If ($Maus_pos[4] <> $player1) Then
DeleteFrame ($player1)
$Button = 0
EndIf
Case 2
If ($Maus_pos[4] <> $player2) Then
DeleteFrame ($player2)
$Button = 0
EndIf
Case 3
If ($Maus_pos[4] <> $player3) Then
DeleteFrame ($player3)
$Button = 0
EndIf
EndSwitch
Select
Case $Maus_pos[4] = $player1 And $Button <> 1
GUICtrlSetData($label, "rot")
DrawFrame ($player1)
$Button = 1
Case $Maus_pos[4] = $player2 And $Button <> 2
GUICtrlSetData($label, "blau")
DrawFrame ($player2)
$Button = 2
Case $Maus_pos[4] = $player3 And $Button <> 3
GUICtrlSetData($label, "grün")
DrawFrame ($player3)
$Button = 3
Case GUIGetMsg() = -3
Exit
EndSelect
WEnd
; ...
[/autoit] [autoit][/autoit] [autoit]Func DeleteFrame ($idCtrl)
[/autoit] [autoit][/autoit] [autoit]_WinAPI_InvalidateRect (GUICtrlGetHandle ($idCtrl))
_WinAPI_UpdateWindow (GUICtrlGetHandle ($idCtrl))
Return
EndFunc
[/autoit]Du musst nach dem Neuordnen nMax neu berechnen und dann SetScrollInfo aufrufen. So ähnlich, wie Du es in der WM_Size machst.
SetScrollRange könntest Du auch dafür benutzen.
Ich denke, dass es am $WS_VSCROLL Parameter von Windows liegt, denn tut der nicht aktualisieren ...
Wenn ich "crys_scroll()" bzw "_GUIScroll_Init()" ein weiteres mal aufrufe, sollte AutoIt ja $WS_VSCROLL neu bestimmen, macht der aber irgendwie nicht.
Ich habe mir die Funktion _GUIScroll_Init einmal angesehen. Wenn Du Die Funktion ein zweites mal aufrufst, dann wird das globale Array $aSB_WindowInfo erweitert. D.h. Dein erster Eintrag für das jeweilige Fenster bleibt bestehen und da wird der Hund begraben liegen, denke ich.
Ich meinte das Beispiel aus der AutoIt-Hilfe: _GUIScrollBars_Init
Beispiele in der MSDN findest Du hier: Using Scroll Bars
EDIT: Warum soll Dein Skript nicht unter 64bit laufen ?
Gruß
Greenhorn
Ja, so scheint es nicht zu funktionieren.
Hier ein schmutziger Workaround:
#include <WindowsConstants.au3>
#include <GUIConstantsEX.au3>
#include <WinAPI.au3>
$Login = GUICreate("", 810, 400)
[/autoit] [autoit][/autoit] [autoit]$label = GUICtrlCreateLabel("", 20, 20, 100, 20)
$player1 = GUICtrlCreatePic("Res\bild 1.jpg", 20, 80, 250, 250)
$player2 = GUICtrlCreatePic("Res\bild 2.jpg", 280, 80, 250, 250)
$player3 = GUICtrlCreatePic("Res\bild 3.jpg", 540, 80, 250, 250)
GUISetState()
[/autoit] [autoit][/autoit] [autoit]$Button = 0
[/autoit] [autoit][/autoit] [autoit]While 1
$Maus_pos = GUIGetCursorInfo()
Select
Case $Maus_pos[4] = $player1 And $Button <> 1
GUICtrlSetData($label, "rot")
DrawFrame ($player1)
$Button = 1
Case $Maus_pos[4] = $player2 And $Button <> 2
GUICtrlSetData($label, "blau")
DrawFrame ($player2)
$Button = 2
Case $Maus_pos[4] = $player3 And $Button <> 3
GUICtrlSetData($label, "grün")
DrawFrame ($player3)
$Button = 3
Case GUIGetMsg() = -3
Exit
Case Else
Switch ($Button)
Case 1
If ($Maus_pos[4] <> $player1) Then
DeleteFrame ($player1)
$Button = 0
EndIf
Case 2
If ($Maus_pos[4] <> $player2) Then
DeleteFrame ($player2)
$Button = 0
EndIf
Case 3
If ($Maus_pos[4] <> $player3) Then
DeleteFrame ($player3)
$Button = 0
EndIf
EndSwitch
EndSelect
WEnd
Func DrawFrame ($idCtrl)
[/autoit] [autoit][/autoit] [autoit]Local $hwnd
Local $hdc
Local $rcClient
Local $rcDraw
Local $hbr
$hwnd = GUICtrlGetHandle ($idCtrl)
[/autoit] [autoit][/autoit] [autoit]$hbr = _WinAPI_GetStockObject ($BLACK_BRUSH)
$hdc = _WinAPI_GetDC ($hwnd)
$rcClient = _WinAPI_GetClientRect ($hwnd)
$rcDraw = DllStructCreate ("LONG;LONG;LONG;LONG")
[/autoit] [autoit][/autoit] [autoit]DllStructSetData ($rcDraw, 3, 3)
DllStructSetData ($rcDraw, 4, DllStructGetData ($rcClient, 4))
_WinAPI_FillRect ($hdc, $rcDraw, $hbr)
DllStructSetData ($rcDraw, 3, DllStructGetData ($rcClient, 3))
DllStructSetData ($rcDraw, 4, 3)
_WinAPI_FillRect ($hdc, $rcDraw, $hbr)
DllStructSetData ($rcDraw, 1, DllStructGetData ($rcClient, 3) - 3)
DllStructSetData ($rcDraw, 4, DllStructGetData ($rcClient, 4))
_WinAPI_FillRect ($hdc, $rcDraw, $hbr)
DllStructSetData ($rcDraw, 1, 0)
DllStructSetData ($rcDraw, 2, DllStructGetData ($rcClient, 4) - 3)
_WinAPI_FillRect ($hdc, $rcDraw, $hbr)
_WinAPI_ReleaseDC ($hwnd, $hdc)
[/autoit] [autoit][/autoit] [autoit]Return
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func DeleteFrame ($idCtrl)
[/autoit] [autoit][/autoit] [autoit]_WinAPI_InvalidateRect (GUICtrlGetHandle ($idCtrl))
Return
EndFunc
[/autoit]Gruß
Greenhorn
Füge noch die Standard-Flags hinzu:
[autoit]GUICtrlSetStyle($player1, BitOr($SS_BLACKFRAME, $GUI_SS_DEFAULT_PIC))
[/autoit]Hi,
z.B. so:
[autoit]GUICtrlSetStyle($player1, $SS_BLACKFRAME)
[/autoit]Gruß
Greenhorn
Hi,
am sinnvollsten ist es, wenn Du Dich ein wenig in die Thematik einliest.
Anschliessend solltest Du Dir das Beispiel aus der Hilfe zu der Funktion ansehen.
Gruß
Greenhorn
Hi,
Du musst der Schaltfläche den Stil $BS_BITMAP mitgeben.
Gruß
Greenhorn