Skitty Posted July 6, 2012 Share Posted July 6, 2012 (edited) I'm having a little trouble with a GDI arrow i'm using in a script I'm playing with. It worked fine before~ expandcollapse popup#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Constants.au3> #Include <WinAPIEx.au3> #include <Array.au3> #include <gdiplus.au3> #include <GuiTab.au3> Global Const $tagSCNotification = "hwnd hWndFrom;" & _; You might wan't to use another structure, because this ones has things not used for this but I don't feel like adding the right one atm "int IDFrom;" & _ "int Code;" & _ "int position;" & _ "int ch;" & _ "int modifiers;" & _ "int modificationType;" & _ "ptr text;" & _ "int length;" & _ "int linesAdded;" & _ "int message;" & _ "dword wParam;" & _ "dword lParam;" & _ "int line;" & _ "int foldLevelNow;" & _ "int foldLevelPrev;" & _ "int margin;" & _ "int listType;" & _ "int x;" & _ "int y;" Global $Editor_UI Global $Editor_UI_Style = BitOR($WS_CAPTION, $WS_SYSMENU, $WS_THICKFRAME, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_CLIPCHILDREN); Take note about $WS_CLIPCHILDREN, we will remove it when needed because this style interferes with normal operation Global $Editor_UI_StyleEx = -1 Global $UI_WIDTH = 600 Global $UI_HIGHT = 350 #region - Tabs Global $Tabs[55][5]; Sci control, tabs and file info array #cs $Tabs[n][0] = hTab; Note to self, this is not even needed $Tabs[n][1] = hSci; scintilla handle $Tabs[n][2] = sFile; loaded file path $Tabs[n][3] = Sci modification indicator for saving status true/fale $Tabs[n][4] = Tab name, file name #ce Global $DragCtrl Global $CatchIt = 0;Used as a switch for capturing tab relocations Global $Dropped, $Clicked, $Current; tab identifiers for relocation process Global $TimeUp, $TimeDown; used to prevent unwanted tab relocations Global $Rec_Old[4]; indicator to detect tab navigation Global $hGraphic; the red arrow Global $hPen; the red arrow Global $hEndCap; the red arrow Global $TabMarker = 0xB055; Action identifier used in the mouse tracker code _UI_TrackMouse Global $Last; unused Global $Timer = TimerInit() Global $OldTime = TimerDiff($Timer); Timing stuff for incresed action speeds to avoid doing unecessary things #endregion - Tabs AutoItSetOption("MouseCoordMode", 2) AutoItSetOption("GUIOnEventMode", 1) AutoItSetOption("GUIEventOptions", 1) $Editor_UI = GUICreate("(Untitled) - ASciTE", 300, 300, -1, -1, $Editor_UI_Style, $Editor_UI_StyleEx) Global $htab = _GUICtrlTab_Create($Editor_UI, 0, 0, $UI_HIGHT, $UI_WIDTH, BitOR($WS_CHILD, $WS_VISIBLE, $TCS_HOTTRACK, $TCS_MULTILINE)) _GDIPlus_Startup() $hPen = _GDIPlus_PenCreate(0xFFFF0000, 2); create the red pen $hEndCap = _GDIPlus_ArrowCapCreate(3, 6); little arrow marker _GDIPlus_PenSetCustomEndCap($hPen, $hEndCap);boom! Global $Tab = _GUICtrlTab_GetDisplayRect($htab); get client size of tabs Global $Lable = GUICtrlCreateLabel("",$Tab[0], $Tab[1], $Tab[2] - $Tab[0], $Tab[3] - $Tab[1]); fit inside the tabs For $I = 0 To 54 $Tabs[$I][0] = _GUICtrlTab_InsertItem($htab, $I, $I & " Test");useless random data, this is where you will hold things relevent to the current tab $Tabs[$I][1] = $I; fill with whatever $Tabs[$I][2] = 0 $Tabs[$I][3] = 0 $Tabs[$I][4] = $I & " Test" Next Global $tRegion = DllStructCreate("struct;long Left;long Top;long Right;long Bottom;endstruct"); structure used to indicate what tab will be repainted so we don't leave little red arrows everywhere GUISetOnEvent($GUI_EVENT_PRIMARYUP, "_UI_PrimaryUp") GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_UI_PrimaryDown") GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "_UI_TrackMouse") GUISetOnEvent($GUI_EVENT_CLOSE, "_UI_Terminate") GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUIRegisterMsg($WM_SIZE, "WM_SIZE") GUISetState() Sleep(700000) Func _UI_TrackMouse() Switch $DragCtrl Case $TabMarker _UI_MouseDetails($Current) Local $aRect = _GUICtrlTab_GetItemRect($htab, $Current) If $Rec_Old[0] <> $aRect[0] Or $Rec_Old[1] <> $aRect[1] Or $Rec_Old[2] <> $aRect[2] Or $Rec_Old[3] <> $aRect[3] And $CatchIt Then;Only enter if the $CatchIt var was set to something positive by _UI_PrimaryDown function Local $iTopMargin = $aRect[1] + 10; adjust position so it looks pretty $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Editor_UI);I'm tempted to find an alternate method to clear the red arrow but my GDIP exp is limited Local $Margin; = left/right position of tab move indicator DllStructSetData($tRegion, 1, $Rec_Old[0]) DllStructSetData($tRegion, 2, $Rec_Old[1]) DllStructSetData($tRegion, 3, $Rec_Old[0] + $Rec_Old[2]) DllStructSetData($tRegion, 4, $Rec_Old[1] + $Rec_Old[3]) DllCall("user32.dll", "int", "RedrawWindow", "hwnd", $htab, "struct*", $tRegion, "int", 0, "int", $RDW_INVALIDATE) Select ;Create left or right red arrow marker ;Take note of how we create the left/right marker ;do this by adding +1 to the left or right side Case $Clicked > $Current $Margin = $aRect[0] + 3 _GDIPlus_GraphicsDrawLine($hGraphic, $aRect[0] + 1, $iTopMargin, $aRect[0], $iTopMargin, $hPen) Case $Clicked < $Current $Margin = $aRect[2] - 3 _GDIPlus_GraphicsDrawLine($hGraphic, $Margin, $iTopMargin, $Margin + 1, $iTopMargin, $hPen) EndSelect _GDIPlus_GraphicsDispose($hGraphic) $Rec_Old[0] = $aRect[0];Save old positions so we know when they change $Rec_Old[1] = $aRect[1] $Rec_Old[2] = $aRect[2] $Rec_Old[3] = $aRect[3] EndIf EndSwitch Return EndFunc ;==>_UI_TrackMouse Func _UI_PrimaryDown() _UI_MouseDetails($Clicked) If Not @error Then GUISetStyle(BitAND($Editor_UI_Style, BitNOT($WS_CLIPCHILDREN)), -1, $Editor_UI);remove clip children style or things wont work $DragCtrl = $TabMarker $TimeDown = TimerDiff($Timer) $CatchIt = 1 EndIf EndFunc ;==>_UI_PrimaryDown Func _UI_PrimaryUp() GUISetStyle($Editor_UI_Style, -1, $Editor_UI); Restore normal styles $CatchIt = 0 EndFunc ;==>_UI_PrimaryUp Func _UI_MouseDetails(ByRef $State) Local $tPOINT = _WinAPI_GetMousePos(True, $Editor_UI) Local $iX = DllStructGetData($tPOINT, "X") Local $iY = DllStructGetData($tPOINT, "Y") Local $aPos = ControlGetPos($Editor_UI, "", $htab) Local $aHit = _GUICtrlTab_HitTest($htab, $iX - $aPos[0], $iY - $aPos[1]) If Not ($aHit[0] > -1) Then Return SetError(1, 0, 0) $State = $aHit[0] EndFunc ;==>_UI_MouseDetails Func WM_NOTIFY($hWndGUI, $MsgID, $WPARAM, $LPARAM) #forceref $hWndGUI, $MsgID, $WPARAM Local $structNMHDR = DllStructCreate($tagSCNotification, $LPARAM) Local $hWndFrom = DllStructGetData($structNMHDR, 1) Local $iCode = DllStructGetData($structNMHDR, 3) ;Local $position = DllStructGetData($structNMHDR, 4) Switch $hWndFrom Case $htab Switch $iCode Case $NM_CLICK Switch $CatchIt Case 1 Local $Selected = _GUICtrlTab_GetCurFocus($htab) _UI_MouseDetails($Dropped) If @error Then $Clicked = '' $Dropped = '' Return $GUI_RUNDEFMSG EndIf $TimeUp = TimerDiff($Timer) Local $Time = Int($TimeUp - $TimeDown) If $Time > 1000 And $Selected == $Clicked And $Selected <> $Dropped Then Local $temp[UBound($Tabs, 2)] ;This handles the tab switching If $Dropped < $Clicked Then For $I = 0 To UBound($temp) - 1 $temp[$I] = $Tabs[$Clicked][$I] Next For $I = $Clicked To $Dropped + 1 Step -1 If $I < 0 Then ExitLoop $Tabs[$I][1] = $Tabs[$I - 1][1] $Tabs[$I][2] = $Tabs[$I - 1][2] $Tabs[$I][3] = $Tabs[$I - 1][3] $Tabs[$I][4] = $Tabs[$I - 1][4] Next For $I = 0 To UBound($temp) - 1 $Tabs[$Dropped][$I] = $temp[$I] Next Else For $I = 0 To UBound($temp) - 1 $temp[$I] = $Tabs[$Clicked][$I] Next For $I = $Clicked To $Dropped - 1 If $I < 0 Then ExitLoop $Tabs[$I][1] = $Tabs[$I + 1][1] $Tabs[$I][2] = $Tabs[$I + 1][2] $Tabs[$I][3] = $Tabs[$I + 1][3] $Tabs[$I][4] = $Tabs[$I + 1][4] Next For $I = 0 To UBound($temp) - 1 $Tabs[$Dropped][$I] = $temp[$I] Next EndIf For $I = 0 To UBound($Tabs, 1) - 1 _GUICtrlTab_SetItemText($htab, $I, $Tabs[$I][4]) Next $Selected = $Dropped Else _GUICtrlTab_SetCurSel($hWndFrom, _GUICtrlTab_GetCurSel($hWndFrom)) EndIf $Clicked = 0 $DragCtrl = 0 $Dropped = 0 Case 0 $Selected = _GUICtrlTab_GetCurSel($hWndFrom) _GUICtrlTab_SetCurSel($hWndFrom, $Selected) EndSwitch $Tab = _GUICtrlTab_GetDisplayRect($htab) _GUICtrlTab_SetCurSel($hWndFrom, $Selected) GUICtrlSetData($Lable, $Tabs[$Selected][1]) GUICtrlSetPos($Lable, $Tab[0], $Tab[1], $Tab[2] - $Tab[0], $Tab[3] - $Tab[1]); here's where Return 'GUI_RUNDEFMSG' EndSwitch EndSwitch EndFunc ;==>WM_NOTIFY Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iWParam, $ilParam _UI_SavePosition(); save UI size, getting it this way seems more reliable _UI_AdjustPositions() Return $GUI_RUNDEFMSG EndFunc ;==>WM_SIZE Func _UI_SavePosition() Local $Size = WinGetClientSize($Editor_UI) If @error Then Return $UI_WIDTH = $Size[0] $UI_HIGHT = $Size[1] EndFunc ;==>_UI_SavePosition Func _UI_AdjustPositions(); reposition controls here Local $tabpos = ControlGetPos($Editor_UI, "", $htab) _WinAPI_SetWindowPos($htab, $HWND_BOTTOM, $tabpos[0], $tabpos[1], $UI_WIDTH, $UI_HIGHT, $SWP_SHOWWINDOW); tab goes in low z order Local $Tab = _GUICtrlTab_GetDisplayRect($htab) GUICtrlSetData($Lable, _GUICtrlTab_GetCurFocus($htab)) GUICtrlSetPos($Lable, $Tab[0], $Tab[1], $Tab[2] - $Tab[0], $Tab[3] - $Tab[1]) EndFunc Func _UI_Terminate() Exit EndFunc But ever since I decided to track the mouse using a mouse hook, the arrow is randomly painted. Meaning that it will only appear if you move the mouse around in a certain way.. expandcollapse popup#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Constants.au3> #include <WinAPIEx.au3> #include <Array.au3> #include <gdiplus.au3> #include <GuiTab.au3> Global Const $hUSER32 = DllOpen("user32.dll") #region - Hooks - Global $hMouseHook = -1; We will register mouse movment dllcallback Global $hMouseProc = -1; = DllCallbackRegister("WM_MOUSEMOVE", "int", "int;ptr;ptr"); this way our UI stays lightning fast... ; used to detect window focus, enabling us to disable/enable the mouse capture, which is a little CPU intemsive :P Global $hWinEventProc = -1; = DllCallbackRegister("_WinEventProc", "none", "hwnd;int;hwnd;long;long;int;int") Global $hWindowsHook = -1 #endregion - Hooks - Global Const $tagSCNotification = "hwnd hWndFrom;" & _; You might wan't to use another structure, because this ones has things not used for this but I don't feel like adding the right one atm "int IDFrom;" & _ "int Code;" & _ "int position;" & _ "int ch;" & _ "int modifiers;" & _ "int modificationType;" & _ "ptr text;" & _ "int length;" & _ "int linesAdded;" & _ "int message;" & _ "dword wParam;" & _ "dword lParam;" & _ "int line;" & _ "int foldLevelNow;" & _ "int foldLevelPrev;" & _ "int margin;" & _ "int listType;" & _ "int x;" & _ "int y;" Global $Editor_UI Global $Editor_UI_Style = BitOR($WS_CAPTION, $WS_SYSMENU, $WS_THICKFRAME, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_CLIPCHILDREN); Take note about $WS_CLIPCHILDREN, we will remove it when needed because this style interferes with normal operation Global $Editor_UI_StyleEx = -1 Global $UI_WIDTH = 600 Global $UI_HIGHT = 350 #region - Tabs Global $Tabs[55][5]; Sci control, tabs and file info array #cs $Tabs[n][0] = hTab; Note to self, this is not even needed $Tabs[n][1] = hSci; scintilla handle $Tabs[n][2] = sFile; loaded file path $Tabs[n][3] = Sci modification indicator for saving status true/fale $Tabs[n][4] = Tab name, file name #ce Global $DragCtrl Global $CatchIt = 0;Used as a switch for capturing tab relocations Global $Dropped, $Clicked, $Current; tab identifiers for relocation process Global $TimeUp, $TimeDown; used to prevent unwanted tab relocations Global $Rec_Old[4]; indicator to detect tab navigation Global $hGraphic; the red arrow Global $hPen; the red arrow Global $hEndCap; the red arrow Global $TabMarker = 0xB055; Action identifier used in the mouse tracker code _UI_TrackMouse Global $Last; unused Global $Timer = TimerInit() Global $OldTime = TimerDiff($Timer); Timing stuff for incresed action speeds to avoid doing unecessary things #endregion - Tabs AutoItSetOption("MouseCoordMode", 2) $Editor_UI = GUICreate("(Untitled) - ASciTE", 300, 300, -1, -1, $Editor_UI_Style, $Editor_UI_StyleEx) Global $htab = _GUICtrlTab_Create($Editor_UI, 0, 0, $UI_HIGHT, $UI_WIDTH, BitOR($WS_CHILD, $WS_VISIBLE, $TCS_HOTTRACK, $TCS_MULTILINE)) _GDIPlus_Startup() $hPen = _GDIPlus_PenCreate(0xFFFF0000, 2); create the red pen $hEndCap = _GDIPlus_ArrowCapCreate(3, 6); little arrow marker _GDIPlus_PenSetCustomEndCap($hPen, $hEndCap);boom! Global $Tab = _GUICtrlTab_GetDisplayRect($htab); get client size of tabs Global $Lable = GUICtrlCreateLabel("", $Tab[0], $Tab[1], $Tab[2] - $Tab[0], $Tab[3] - $Tab[1]); fit inside the tabs For $I = 0 To 54 $Tabs[$I][0] = _GUICtrlTab_InsertItem($htab, $I, $I & " Test");useless random data, this is where you will hold things relevent to the current tab $Tabs[$I][1] = $I; fill with whatever $Tabs[$I][2] = 0 $Tabs[$I][3] = 0 $Tabs[$I][4] = " Test" Next Global $tRegion = DllStructCreate("struct;long Left;long Top;long Right;long Bottom;endstruct"); structure used to indicate what tab will be repainted so we don't leave little red arrows everywhere GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND") GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUIRegisterMsg($WM_SIZE, "WM_SIZE") GUISetState() _UI_SetMouseHook(1) _UI_SetWindowHook(1) Sleep(700000) Func _UI_SetMouseHook($DoWhat = 0) If Not IsDeclared("DoWhat") Then $DoWhat = 1 AdlibUnRegister("_UI_SetMouseHook") Switch $DoWhat Case 1 If $hMouseProc = -1 Then $hMouseProc = DllCallbackRegister("WM_MOUSEMOVE", "int", "uint;wparam;lparam") EndIf If $hMouseHook = -1 Then Local $hM_Module = _WinAPI_GetModuleHandle(0) $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), $hM_Module, 0) EndIf Case 0 If $hMouseHook <> -1 Then _WinAPI_UnhookWindowsHookEx($hMouseHook) $hMouseHook = -1 EndIf If $hMouseProc <> -1 Then DllCallbackFree($hMouseProc) $hMouseProc = -1 EndIf EndSwitch EndFunc ;==>_UI_SetMouseHook Func _UI_SetWindowHook($DoWhat = 0); Thanks to rasim for this If Not IsDeclared("DoWhat") Then $DoWhat = 1 Switch $DoWhat Case 1 If $hWinEventProc = -1 Then $hWinEventProc = DllCallbackRegister("_WinEventProc", "none", "hwnd;int;hwnd;long;long;int;int") EndIf If $hWindowsHook = -1 Then Local Const $EVENT_SYSTEM_FOREGROUND = 0x0003 ;An MSAA event indicating that the foreground window changed. Local Const $WINEVENT_OUTOFCONTEXT = 0x0 $hWindowsHook = DllCall($hUSER32, "hwnd", "SetWinEventHook", _ "uint", $EVENT_SYSTEM_FOREGROUND, _; Event Min "uint", $EVENT_SYSTEM_FOREGROUND, _; Event Max "hwnd", 0, _ "ptr", DllCallbackGetPtr($hWinEventProc), _ "int", 0, _ "int", 0, _ "uint", $WINEVENT_OUTOFCONTEXT) If @error Then Return SetError(@error, 0, 0) $hWindowsHook = $hWindowsHook[0] EndIf Case 0 If $hWindowsHook <> -1 Then DllCall($hUSER32, "int", "UnhookWinEvent", "hwnd", $hWindowsHook) EndIf If $hWinEventProc <> -1 Then DllCallbackFree($hWinEventProc) EndIf EndSwitch EndFunc ;==>_UI_SetWindowHook Func _WinEventProc($hHook, $iEvent, $hWnd, $idObject, $idChild, $iEventThread, $iEventTime) #forceref $hHook, $iEvent, $idObject, $idChild, $iEventThread, $iEventTime Switch $hWnd Case $Editor_UI _UI_SetMouseHook(1) ;ConsoleWrite(">Hooked mouse.") Case Else _UI_SetMouseHook() ;ConsoleWrite(">Unhooked mouse.") EndSwitch Return EndFunc ;==>_WinEventProc Func WM_MOUSEMOVE($nCode, $wParam, $lParam) #forceref $nCode, $wParam, $lParam If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndIf ;If $nCode <> 0 Then ConsoleWrite($nCode & @CR) ;If $BlockMessages Then Return 'GUI_RUNDEFMSG' Switch BitAND($wParam, 0xFFFF) Case 513; mouse down, mouse down event of drag bar is caught in the WM_COMMAND function an not here due to complications _UI_MouseDetails($Clicked) If Not @error Then; Tab was clicked, $clicked has tab index that was clicked GUISetStyle(BitAND($Editor_UI_Style, BitNOT($WS_CLIPCHILDREN)), -1, $Editor_UI);remove clip children style or things wont work $DragCtrl = $TabMarker $TimeDown = TimerDiff($Timer) $CatchIt = 1 EndIf Case 514; mouse up _UI_SavePosition() Switch $DragCtrl; the tab repositions are handled in WM_NOTIFY Case $TabMarker Local $Selected = _GUICtrlTab_GetCurFocus($htab) If $CatchIt Then GUISetStyle($Editor_UI_Style, -1, $Editor_UI) _UI_MouseDetails($Dropped) If @error Then $Clicked = '' $Dropped = '' Return $GUI_RUNDEFMSG EndIf $TimeUp = TimerDiff($Timer) Local $Time = Int($TimeUp - $TimeDown) If $Time > 1000 And $Selected == $Clicked And $Selected <> $Dropped Then Local $temp[UBound($Tabs, 2)] ;This handles the tab switching If $Dropped < $Clicked Then For $I = 0 To UBound($temp) - 1 $temp[$I] = $Tabs[$Clicked][$I] Next For $I = $Clicked To $Dropped + 1 Step -1 ;ConsoleWrite($I & @CR) If $I < 0 Then ExitLoop $Tabs[$I][1] = $Tabs[$I - 1][1] $Tabs[$I][2] = $Tabs[$I - 1][2] $Tabs[$I][3] = $Tabs[$I - 1][3] $Tabs[$I][4] = $Tabs[$I - 1][4] Next For $I = 0 To UBound($temp) - 1 $Tabs[$Dropped][$I] = $temp[$I] Next Else For $I = 0 To UBound($temp) - 1 $temp[$I] = $Tabs[$Clicked][$I] Next For $I = $Clicked To $Dropped - 1 If $I < 0 Then ExitLoop $Tabs[$I][1] = $Tabs[$I + 1][1] $Tabs[$I][2] = $Tabs[$I + 1][2] $Tabs[$I][3] = $Tabs[$I + 1][3] $Tabs[$I][4] = $Tabs[$I + 1][4] Next For $I = 0 To UBound($temp) - 1 $Tabs[$Dropped][$I] = $temp[$I] Next EndIf For $I = 0 To UBound($Tabs, 1) - 1 _GUICtrlTab_SetItemText($htab, $I, $I & " " & $Tabs[$I][4]) Next $Selected = $Dropped Else _GUICtrlTab_SetCurSel($htab, _GUICtrlTab_GetCurSel($htab)) EndIf $Clicked = 0 $DragCtrl = 0 $Dropped = 0 _GUICtrlTab_SetCurSel($htab, $Selected) EndIf EndSwitch $Tab = _GUICtrlTab_GetDisplayRect($htab) GUICtrlSetData($Lable, $Tabs[$Selected][1]) GUICtrlSetPos($Lable, $Tab[0], $Tab[1], $Tab[2] - $Tab[0], $Tab[3] - $Tab[1]); here's where #Region - PROBLEM AREA - Case 512; mouse moving Switch $DragCtrl Case $TabMarker; something seems to be happening here that causes the arrow to be removed _UI_MouseDetails($Current) If Not @error Then Local $aRect = _GUICtrlTab_GetItemRect($htab, $Current) If $Rec_Old[0] <> $aRect[0] Or $Rec_Old[1] <> $aRect[1] Or $Rec_Old[2] <> $aRect[2] Or $Rec_Old[3] <> $aRect[3] And $CatchIt Then;Only enter if the $CatchIt var was set to something positive by _UI_PrimaryDown function ;Repaint the previously hovered button to remove any leftover arrows DllCall _ ( _ "user32.dll", _ "int", "RedrawWindow", _ "hwnd", $htab, _ "struct*", _WinAPI_CreateRectRgn($Rec_Old[0], $Rec_Old[1], $Rec_Old[0] + $Rec_Old[2], $Rec_Old[1] + $Rec_Old[3]), _ "int", 0, _ "int", $RDW_INVALIDATE _ ) Local $iTopMargin = $aRect[1] + 10 $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Editor_UI);I'm tempted to find an alternate method to clear the red arrow but my GDIP exp is limited Local $Margin; = left/right position of tab move indicator Select ;Create left or right red arrow marker ;Take note of how we create the left/right marker ;do this by adding +1 to the left or right side Case $Clicked > $Current $Margin = $aRect[0] + 3 _GDIPlus_GraphicsDrawLine($hGraphic, $aRect[0] + 1, $iTopMargin, $aRect[0], $iTopMargin, $hPen) Case $Clicked < $Current $Margin = $aRect[2] - 3 _GDIPlus_GraphicsDrawLine($hGraphic, $Margin, $iTopMargin, $Margin + 1, $iTopMargin, $hPen) EndSelect _GDIPlus_GraphicsDispose($hGraphic) $Rec_Old[0] = $aRect[0];Save old positions so we know when they change $Rec_Old[1] = $aRect[1] $Rec_Old[2] = $aRect[2] $Rec_Old[3] = $aRect[3] EndIf EndIf EndSwitch #EndRegion - PROBLEM AREA - EndSwitch Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing EndFunc ;==>WM_MOUSEMOVE Func _UI_MouseDetails(ByRef $State) Local $tPOINT = _WinAPI_GetMousePos(True, $Editor_UI) Local $iX = DllStructGetData($tPOINT, "X") Local $iY = DllStructGetData($tPOINT, "Y") Local $aPos = ControlGetPos($Editor_UI, "", $htab) Local $aHit = _GUICtrlTab_HitTest($htab, $iX - $aPos[0], $iY - $aPos[1]) If Not ($aHit[0] > -1) Then Return SetError(1, 0, 0) $State = $aHit[0] EndFunc ;==>_UI_MouseDetails Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam) #forceref $hWndGUI, $MsgID, $WPARAM Local $structNMHDR = DllStructCreate($tagSCNotification, $lParam) Local $hWndFrom = DllStructGetData($structNMHDR, 1) Local $iCode = DllStructGetData($structNMHDR, 3) ;Local $position = DllStructGetData($structNMHDR, 4) Switch $hWndFrom Case $htab Switch $iCode Case $NM_CLICK Switch $CatchIt Case 0 _GUICtrlTab_SetCurSel($htab, _GUICtrlTab_GetCurSel($htab)) ;Case 1 EndSwitch EndSwitch EndSwitch EndFunc ;==>WM_NOTIFY Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iWParam, $ilParam _UI_SavePosition(); save UI size, getting it this way seems more reliable _UI_AdjustPositions() Return $GUI_RUNDEFMSG EndFunc ;==>WM_SIZE Func _UI_SavePosition() Local $Size = WinGetClientSize($Editor_UI) If @error Then Return $UI_WIDTH = $Size[0] $UI_HIGHT = $Size[1] EndFunc ;==>_UI_SavePosition Func _UI_AdjustPositions(); reposition controls here Local $tabpos = ControlGetPos($Editor_UI, "", $htab) _WinAPI_SetWindowPos($htab, $HWND_BOTTOM, $tabpos[0], $tabpos[1], $UI_WIDTH, $UI_HIGHT, $SWP_SHOWWINDOW); tab goes in low z order Local $Tab = _GUICtrlTab_GetDisplayRect($htab) GUICtrlSetData($Lable, _GUICtrlTab_GetCurFocus($htab)) GUICtrlSetPos($Lable, $Tab[0], $Tab[1], $Tab[2] - $Tab[0], $Tab[3] - $Tab[1]) EndFunc ;==>_UI_AdjustPositions Func WM_SYSCOMMAND($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $iwParam, $ilParam Switch $hWnd Case $Editor_UI Switch BitAND($iwParam, 0xFFF0) Case 0xF060 _UI_SetMouseHook() _UI_SetWindowHook() Exit EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_SYSCOMMAND What could it be? P.S. You need to click a tab and drag it around. Edited July 7, 2012 by THAT1ANONYMOUSDUDE Link to comment Share on other sites More sharing options...
Skitty Posted July 7, 2012 Author Share Posted July 7, 2012 Anyone?As you can see, the image shows my problem, the arrow only appears when it feels like it as it seems, I still can't figure it out Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now