Hallo Leute,
ich denke schon seit langem über ein Problem nach, komme aber nicht auf die Lösung.
Ich habe ein 10x10 Raster und will darin erkennen, welche Linien angeklickt wurden, dabei
sollte das Programm jedoch nicht allzu penibel sein, d.h. ein bischen Toleranz beim Linienanklicken muss drin sein,
sonst ist es nicht sonderlich benutzerfreundlich.
Ich habe mir für das Raster eine Nummerierung ausgedacht:
Die Kästchen sind von 0 beginnend durchnummeriert:
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
etc,
Damit man unterscheiden kann, welche Linie gedrückt wurde gibt es sogenannte "Orientierungszahlen". Diese sind im Uhrzeigersinn nummeriert dh. 0 = obere Linie im Kästchen 1 = rechte Linie im Kästchen 2 = untere Linie im Kästchen und 3 = linke Linie im Kästchen. Das Problem bei dieser Variante ist jedoch, dass die Felder doppelt belegt sind zb. Kästchen 0 Orientierung 1 ist das selbe wie Kästchen 1 Orientierung 2.
Das lässt sich jedoch mit ein bischen rechnen ausgleichen.
Mein Problem ist jetzt jedoch, das ich erkennen will welche Linie geklickt wurde, ich habe schon einmal so angefangen:
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <Array.au3>
#include <Misc.au3>
$iButtonMainMenuFontSize = 20
$iButtonTransparency = 250
$hEditGameMainGui = GUICreate("Käsekästchen",420,510,-1,-1,$WS_POPUP)
;$hEditGameBackground = GUICtrlCreatePic($oBackgroundImage,0,0,420,510)
$hEditGameTransparentBackgroundGuiSaveuAbortButtonGUI = GUICreate("",420,99,0,415,$WS_POPUP,$WS_EX_MDICHILD,$hEditGameMainGui)
WinSetTrans($hEditGameTransparentBackgroundGuiSaveuAbortButtonGUI,"",$iButtonTransparency)
$hEditGameSaveButton = GUICtrlCreateButton("Speichern",0,0,420,49)
GUICtrlSetFont(-1,$iButtonMainMenuFontSize,400,2)
$hEditGameAbortButton = GUICtrlCreateButton("Abbrechen",0,50,420,49)
GUICtrlSetFont(-1,$iButtonMainMenuFontSize,400,2)
Global $pi_ziel = @TempDir & '\picasso.ini'
_GDIPlus_Startup()
Global $pi_iWidth = 401, $pi_iHeight = 401
$pi_hGUI = GUICreate("",$pi_iWidth, $pi_iHeight,10,5,$WS_POPUP,$WS_EX_MDICHILD,$hEditGameMainGui)
$pi_hGraphic = _GDIPlus_GraphicsCreateFromHWND($pi_hGUI)
Global $pi_hBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000)
WinSetTrans($pi_hGUI,"",200)
GUISetState(@SW_SHOW,$hEditGameMainGui)
GUISetState(@SW_SHOW,$hEditGameTransparentBackgroundGuiSaveuAbortButtonGUI)
GUISetState(@SW_SHOW,$pi_hGUI)
pi_Plan($pi_hGraphic)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_PRIMARYDOWN
$aEditGameCoursorInfo = GUIGetCursorInfo($pi_hGUI)
ConsoleWrite($aEditGameCoursorInfo[0] & @CRLF & $aEditGameCoursorInfo[1] & @CRLF)
Local $iLinieNummer = ''
Local $iSpalteNummer = ''
Local $iKaestchenNummer = ''
Select
Case $aEditGameCoursorInfo[1] > 1 and $aEditGameCoursorInfo[1] < 10
$iLinieNummer = '0'
Case $aEditGameCoursorInfo[1] > 36 and $aEditGameCoursorInfo[1] < 44
$iLinieNummer = 1
Case $aEditGameCoursorInfo[1] > 73 and $aEditGameCoursorInfo[1] < 85
$iLinieNummer = 2
Case $aEditGameCoursorInfo[1] > 113 and $aEditGameCoursorInfo[1] < 125
$iLinieNummer = 3
Case $aEditGameCoursorInfo[1] > 151 and $aEditGameCoursorInfo[1] < 163
$iLinieNummer = 4
Case $aEditGameCoursorInfo[1] > 193 and $aEditGameCoursorInfo[1] < 205
$iLinieNummer = 5
Case $aEditGameCoursorInfo[1] > 232 and $aEditGameCoursorInfo[1] < 244
$iLinieNummer = 6
Case $aEditGameCoursorInfo[1] > 274 and $aEditGameCoursorInfo[1] < 285
$iLinieNummer = 7
Case $aEditGameCoursorInfo[1] > 313 and $aEditGameCoursorInfo[1] < 326
$iLinieNummer = 8
Case $aEditGameCoursorInfo[1] > 353 and $aEditGameCoursorInfo[1] < 362
$iLinieNummer = 9
Case $aEditGameCoursorInfo[1] > 393 and $aEditGameCoursorInfo[1] < 401
$iLinieNummer = 10
EndSelect
ConsoleWrite($iLinieNummer & @CRLF)
Select
Case $aEditGameCoursorInfo[0] > 1 and $aEditGameCoursorInfo[0] < 7
$iSpalteNummer = '0'
Case $aEditGameCoursorInfo[0] > 37 and $aEditGameCoursorInfo[0] < 44
$iSpalteNummer = 1
Case $aEditGameCoursorInfo[0] > 76 and $aEditGameCoursorInfo[0] < 85
$iSpalteNummer = 2
Case $aEditGameCoursorInfo[0] > 118 and $aEditGameCoursorInfo[0] < 125
$iSpalteNummer = 3
Case $aEditGameCoursorInfo[0] > 158 and $aEditGameCoursorInfo[0] < 165
$iSpalteNummer = 4
Case $aEditGameCoursorInfo[0] > 198 and $aEditGameCoursorInfo[0] < 205
$iSpalteNummer = 5
Case $aEditGameCoursorInfo[0] > 235 and $aEditGameCoursorInfo[0] < 244
$iSpalteNummer = 6
Case $aEditGameCoursorInfo[0] > 277 and $aEditGameCoursorInfo[0] < 284
$iSpalteNummer = 7
Case $aEditGameCoursorInfo[0] > 313 and $aEditGameCoursorInfo[0] < 328
$iSpalteNummer = 8
Case $aEditGameCoursorInfo[0] > 355 and $aEditGameCoursorInfo[0] < 367
$iSpalteNummer = 9
Case $aEditGameCoursorInfo[0] > 391 and $aEditGameCoursorInfo[0] < 401
$iSpalteNummer = 10
EndSelect
ConsoleWrite($iSpalteNummer & @CRLF)
Case $GUI_EVENT_ClOSE
Close()
Case $hEditGameAbortButton
Exit
EndSwitch
WEnd
Func pi_Plan($pi_hWindowHandle)
For $pi_u = 0 To 390 Step 40
_GDIPlus_GraphicsdrawRect($pi_hWindowHandle,$pi_u,0,40,400)
Next
For $pi_a = 0 To 390 Step 40
_GDIPlus_GraphicsdrawRect($pi_hWindowHandle,0,$pi_a,400,40)
Next
EndFunc
Func pi_DrawLine($pi_iField,$pi_iDirection,$pi_hWindowHandle)
Local $pi_y2cord = 0
Local $pi_ycord = 0
Local $pi_x2cord = 0
Local $pi_xcord = 0
Local $pi_xcord = 40 * StringRight($pi_iField,1)
If StringLen($pi_iField) = 1 Then
$pi_ycord = 0
Else
$pi_ycord = 40 * StringLeft($pi_iField,1)
EndIf
If $pi_iDirection = 0 Then
$pi_x2cord = 40
$pi_ycord = $pi_ycord - 3
$pi_y2cord = 6
ElseIf $pi_iDirection = 1 Then
$pi_xcord = $pi_xcord + 37
$pi_x2cord = 6
$pi_y2cord = 40
ElseIf $pi_iDirection = 2 Then
$pi_ycord = $pi_ycord + 37
$pi_x2cord = 40
$pi_y2cord = 6
Else
$pi_xcord = $pi_xcord - 3
$pi_x2cord = 6
$pi_y2cord = 40
EndIf
_GDIPlus_GraphicsFillRect($pi_hWindowHandle,$pi_xcord,$pi_ycord,$pi_x2cord,$pi_y2cord,$pi_hBrush)
EndFunc
FUnc Close()
Exit
EndFunc
Ich kann schon einmal erkennen welche Linie und welche Spalte geklickt wurde, jedoch müsste ich jetzt noch das Kästchen ermitteln, wie mache ich dies jedoch,
ohne 100 Selects schreiben zu müssen?
Oder gibt es eine andere, simplere Lösung das zu erkennen?
Fliwatt