
Diskussion zu: FAQ SciTE Editor
- Professor Bernd
- Unerledigt
-
-
Eine weitere Strg+Shift+Q Kuriosität.
Wohl eher eine nicht vorhandene Fehlerprüfung. Richtigerweise sollte in diesem Fall der Anwender informiert werden, dass er zu schusselig ist und keine Markierung vorgenommen hat.
-
Richtigerweise sollte in diesem Fall der Anwender informiert werden, dass er zu schusselig ist und keine Markierung vorgenommen hat.
Hi hi.
-
Der Anfang des blockComments befindet sich an einem beliebigen Leerzeichen vor dem ausgewählten Text und endet am ersten gefundenen Leerzeichen nach dem ausgewählten Text. Vermutlich funktioniert es wie geplant.
-
Hallo Jos, willkommen im Forum!
Für mich ist das Setzen von BlockComments per Shortcut nicht so wichtig. Ich denke, #cs und #ce lassen sich auch von Hand schnell setzen. Andere User benutzen das häufiger und können den Tipp bestimmt gut gebrauchen.
Vielen Dank für den Tipp!
-
Hallo,
ich habe da mal eine Frage zum SciTE-Editor.
Zuerst ich verwende die Version 4.4.6 vom 16.3.2021
Meine Frage ist:
Wenn ich mehrere au3-Dateien in SciTE öffne, so erscheint für jede Datei ein Tab in SciTE, wovon der Tab ganz rechts den Fokus hat.
Aber leider wird diese Tab nicht besonders gut hervorgehoben.
Wenn ich den Tab wechsele, so kann man den aktuellen Tab fast nicht von den anderen Tabs unterscheiden.
Daher suche ich nach einer Möglichkeit, den aktuellen Tab besser hervorzuheben z.B. den Text (der Dateiname) fett oder in einer anderen Farbe schreiben o.ä.
Eventuell gibt es ja eine Möglichkeit dies in SciTE so einzustellen, oder mit LUA etwas in dieser Art "nachzuhelfen".
MfG:
BigRox
-
Wenn ich den Tab wechsele, so kann man den aktuellen Tab fast nicht von den anderen Tabs unterscheiden.
Fast nicht zu unterscheiden?! Da solltest du dich an den Optiker deines Vertrauens wenden.
Daher suche ich nach einer Möglichkeit, den aktuellen Tab besser hervorzuheben z.B. den Text (der Dateiname) fett oder in einer anderen Farbe schreiben o.ä.
Eventuell gibt es ja eine Möglichkeit dies in SciTE so einzustellen, oder mit LUA etwas in dieser Art "nachzuhelfen".Dergleichen ist so nicht umsetzbar.
Einzige vorstellbare Möglichkeit:
- Tab-Handle abfragen
- Style auf $TCS_OWNERDRAWFIXED setzen
- Globalen Hook verwenden um WM_DRAWITEM abzufangen
Ich hatte mal getestet, ein eigenes Tab-Ctrl benutzerdefiniert zu zeichnen:
AutoIt
Alles anzeigen#include <FontConstants.au3> #include <TabConstants.au3> #include <WinAPI.au3> #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiTab.au3> Global Const $ODT_TAB = 101 Global Const $ODS_SELECTED = 0x0001 Global Const $ODA_DRAWENTIRE = 0x1 Global Const $ODS_FOCUS = 0x0010 Global $aColTabItem[3][2] = [['Item1',0x11AADD],["Item2",0xEEBB99],["Item3",0x4763FF]] ; [[TabItem-Bezeichnung,TabItem-Color]] Global $hFont, $iBrush $hGUI = GUICreate("Draw Tab", 300, 200) $hTab = GUICtrlCreateTab(10, 10, 280, 180, $TCS_OWNERDRAWFIXED) $TabItem_1 = GUICtrlCreateTabItem("Item1") GUICtrlCreateLabel("L1", 10, 33, 277, 155) $TabItem_2 = GUICtrlCreateTabItem("Item2") GUICtrlCreateLabel("L2", 10, 33, 277, 155) $TabItem_2 = GUICtrlCreateTabItem("Item3") GUICtrlCreateLabel("L3", 10, 33, 277, 155) GUICtrlCreateTabItem("") GUISetState() GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM") _GUICtrlTab_SetCurSel($hTab, 2) _GUICtrlTab_SetCurSel($hTab, 1) _GUICtrlTab_SetCurSel($hTab, 0) _GUICtrlTab_SetCurFocus($hTab, 1) Do Until GUIGetMsg() = -3 _WinAPI_DeleteObject($hFont) _WinAPI_DeleteObject($iBrush) Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam) Local $DRAWITEMSTRUCT = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;" & _ "hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam) If DllStructGetData($DRAWITEMSTRUCT, "cType") <> $ODT_TAB Then Return $GUI_RUNDEFMSG If DllStructGetData($DRAWITEMSTRUCT, "itmAction") <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG Local $itmID = DllStructGetData($DRAWITEMSTRUCT, "itmID") Local $hDC = DllStructGetData($DRAWITEMSTRUCT, "hDC") Local $hItm = DllStructGetData($DRAWITEMSTRUCT, "hItm") Local $itmText = $aColTabItem[$itmID][0], $iBrushColor = $aColTabItem[$itmID][1] DLLCall("gdi32.dll","int","SetBkMode", "hwnd", $hDC, "int", 1) Local $iBrush = DLLCall("gdi32.dll","hwnd","CreateSolidBrush", "int", $iBrushColor) $iBrush = $iBrush[0] Local $iBrushOld = _WinAPI_SelectObject($hDC, $iBrush) DLLCall("user32.dll","int","FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "hwnd", $iBrush) Local $tBuffer = DllStructCreate("char[256]") DllStructSetData($tBuffer, 1, $itmText) $itmText = DllStructGetData($tBuffer, 1) DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 1) + 10, 1) DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 2) + 5, 2) DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "str", $itmText, "int", StringLen($itmText), _ "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "int", $DT_LEFT) Return $GUI_RUNDEFMSG EndFunc
Das müsste dann angepasst in der Hook-Prozedur ausgeführt werden.
Einfacher ist vielleicht ein farbiges Rect um das Tab-Item zu zeichnen. Es muss aber auf jedes Neuzeichnen des Tab durch das Programm reagiert werden, da die Größe und Position der Tab-Item sich ja ändern.
Was ich dir noch anbieten kann, ist eine Funktion zum Abfragen der Tab-Infos:
EDIT:
Nochmal etwas geändert.
AutoIt
Alles anzeigen#include <WinAPISys.au3> #include <GuiTab.au3> HotKeySet("!{F7}", _getInfoCurrTab) ; <Alt><F7> Info aktiver Tab in Konsole ausgeben HotKeySet("!{F8}", _End) ; <Alt><F8> Beenden While True Sleep(10) WEnd Func _End() Exit EndFunc Func _getInfoCurrTab() Local $mInfo = _SciTE_GetTabInfo() If Not @error Then ConsoleWrite("hwnd SciTE: " & $mInfo.hSciTE & @CRLF) ConsoleWrite("Titel SciTE: " & $mInfo.Title & @CRLF) ConsoleWrite("hwnd Tab: " & $mInfo.hTab & @CRLF) ConsoleWrite("Rect Tab: " & $mInfo.RectTab.Left & ', ' & $mInfo.RectTab.Top & ', ' & _ $mInfo.RectTab.Right & ', ' & $mInfo.RectTab.Bottom & @CRLF) ConsoleWrite("Style Tab: " & $mInfo.Style & @CRLF) ConsoleWrite("StyleEx Tab: " & $mInfo.StyleEx & @CRLF) ConsoleWrite("Index TabItem: " & $mInfo.Index & @CRLF) ConsoleWrite("Text TabItem: " & $mInfo.Item & @CRLF) ; Rect Tab-Item ist relativ zum Tab-Ctrl ConsoleWrite("Rect TabItem: " & $mInfo.RectItem.Left & ', ' & $mInfo.RectItem.Top & ', ' & _ $mInfo.RectItem.Right & ', ' & $mInfo.RectItem.Bottom & @CRLF & @CRLF) EndIf EndFunc Func _SciTE_GetTabInfo() Local $hScite, $aResult, $aChild, $hWndTab = Null Local $mResult[] $hScite = WinGetHandle('[ACTIVE]') $aResult = DllCall("user32.dll", "int", "GetClassNameW", "hwnd", $hScite, "wstr", "", "int", 4096) If Not @error And $aResult[2] = 'SciTEWindow' Then $aChild = _WinAPI_EnumChildWindows($hScite) ; only visible If Not @error Then For $i = 1 To $aChild[0][0] If $aChild[$i][1] = "SciTeTabCtrl" Then $hWndTab = $aChild[$i][0] ExitLoop EndIf Next EndIf If $hWndTab <> Null Then $mResult.hSciTE = $hScite $mResult.Title = WinGetTitle($hScite) $mResult.hTab = $hWndTab $mResult.RectTab = _WinAPI_GetWindowRect($hWndTab) $mResult.Style = _WinAPI_GetWindowLong ($hWndTab, $GWL_STYLE) $mResult.StyleEx = _WinAPI_GetWindowLong ($hWndTab, $GWL_EXSTYLE) $mResult.Index = _GUICtrlTab_GetCurFocus($hWndTab) $mResult.Item = _GUICtrlTab_GetItemText($hWndTab, $mResult.Index) $mResult.RectItem = _GUICtrlTab_GetItemRectEx($hWndTab, $mResult.Index) Return $mResult EndIf EndIf Return SetError(1) EndFunc
Ausgabe:
-
Hallo BugFix,
Fast nicht zu unterscheiden?! Da solltest du dich an den Optiker deines Vertrauens wenden.
Wie hast du das den gemacht????
Bei mir sieht das nämlich so aus:
Das ist wohl ein Einstellungssache oder ein Installationsfehler und da hilft wohl auch kein Optiker
.
Gibt es da eventuell so etwas wie Skins für SciTE?
Wenn ich das mit den Tabs nämlich auch so hinbekommen würde wie in deinem Screenshot, dann währe ich sehr zufrieden.
MfG:
BigRox
-
Das ist wohl ein Einstellungssache oder ein Installationsfehler
Oder - was ich jetzt mal vermute: ein Systemfehler (Windows 10/11 ? ) .
Ich habe Windows 7, da sahen die Fenster noch ordentlich aus und nicht so platt gequetscht. Vielleicht liegt es daran.
-
Hallo BugFix,
Oder - was ich jetzt mal vermute: ein Systemfehler (Windows 10/11 ? ) .
Also, ein Installationsfehler scheidet schonmal aus, da ich nun SciTE neu heruntergeladen und installiert habe.
Danach sehen die Tabs auch noch so bes... aus.
Was mich aber an einem Windows-Systemfehler wundert ist, dass nur die Tabs von SciTE so aussehen.
Die anderen Programme sind z.B PsPad, SpeedCommander Vivaldi-Browser, Thunderbird usw.
Mich würde daher mal interessieren, wie die Tabs bei anderen im Forum, die auch Windows 11 benutzen, aussehen.
MfG:
BigRox
-
-
-
Hallo,
ich habe eben Windows 11 Pro 22H2 22621.525 mal ganz neu installiert.
(Das Bild in Post #67 stammt aber von der Windows 11 Pro 22H2 22621.1265 Version).
Dazu habe ich die Version verwendet, die mir das MediaCrationTool auf eine USB-Stick schreibt.
Diese Version habe ich keinerlei Tweaks o.ä. hinzugefügt und auch keine anderen Einstellungen geändert.
Auf diese Version habe AutoIt 3.3.16.1 und SciTE4AutoIT3 vom16.3.2021 installiert und die Tabs sehen da auch so platt gebügelt aus:
autoit.de/wcf/attachment/90521/
Damit ist wohl klar, dass dies ein Problem von/mit Windows 11 ist.
auf allen bei mir genutzten Rechnern mit Win7 bzw. Win10 sehen die Tabs in Scite so aus wie bei BugFix . Scheint also ein Win11 "Problem" zu sein, ggf einstellbar, wie "damals" AERO?!
Das mit AERO ist ein guter Hinweis, eventuell kommt SciTE mit einer anderen Einstellung für die Desktopeffekte von Windows 11 nicht zurecht.
Mit der Scaliererei von Windows 11, haben ja auch so einige Programme ihre Probleme.
Eben habe ich mir auch noch die neuste Version von SciTE 5.3.5 vom 13.3.2023 (die Version ohne AutoIt3) heruntergeladen und installiert/kopiert und da sehen die Tabs so aus:
Die neuste Version von SciTE hat also auch dieses Problem.
Da muss es doch schon ein Lösung geben, ich kann mir nämlich nicht vorstellen, dass ich der erste bin, dem das auffällt.
MfG:
BigRox
-
Ich habe mal ein Skript erstellt, zum Zeichnen des Tab-Item.
Sieht dann so aus:
AutoIt: SciTE_DrawTabItem.au3
Alles anzeigen;-- TIME_STAMP 2023-03-14 13:53:32 #include <FontConstants.au3> #include <GuiTab.au3> #include <WinAPIGdi.au3> #include <WinAPISys.au3> #include <WindowsConstants.au3> HotKeySet("!{F7}", _DrawTabItem) ; <Alt><F7> Markiert aktives TabItem HotKeySet("!{F8}", _End) ; <Alt><F8> Beenden While True Sleep(10) WEnd Func _End() Exit EndFunc Func _DrawTabItem() Local $mTab = _SciTE_GetTabInfo() Local $hDC = _WinAPI_GetDC($mTab.hTab) Local $hFont = _WinAPI_CreateFont(15, 0, 0, 0, 500, True, False, False, $DEFAULT_CHARSET, _ $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial') Local $hOldFont = _WinAPI_SelectObject($hDC, $hFont) Local $tRect = $mTab.RectItem ; in Variable extrahieren - sonst kein ByRef-Zugriff mit _DrawText möglich _WinAPI_SetTextColor($hDC, 0xAA0020) _WinAPI_SetBkColor($hDC, 0xFFFFFF) _WinAPI_DrawText($hDC, $mTab.Item, $tRect, BitOR($DT_BOTTOM,$DT_CENTER)) _WinAPI_SelectObject($hDC, $hOldFont) _WinAPI_DeleteObject($hFont) _WinAPI_ReleaseDC(0, $hDC) EndFunc Func _SciTE_GetTabInfo() Local $hScite, $aResult, $aChild, $hWndTab = Null Local $mResult[] $hScite = WinGetHandle('[ACTIVE]') $aResult = DllCall("user32.dll", "int", "GetClassNameW", "hwnd", $hScite, "wstr", "", "int", 4096) If Not @error And $aResult[2] = 'SciTEWindow' Then $aChild = _WinAPI_EnumChildWindows($hScite) ; only visible If Not @error Then For $i = 1 To $aChild[0][0] If $aChild[$i][1] = "SciTeTabCtrl" Then $hWndTab = $aChild[$i][0] ExitLoop EndIf Next EndIf If $hWndTab <> Null Then $mResult.hSciTE = $hScite $mResult.Title = WinGetTitle($hScite) $mResult.hTab = $hWndTab $mResult.RectTab = _WinAPI_GetWindowRect($hWndTab) $mResult.Style = _WinAPI_GetWindowLong ($hWndTab, $GWL_STYLE) $mResult.StyleEx = _WinAPI_GetWindowLong ($hWndTab, $GWL_EXSTYLE) $mResult.Index = _GUICtrlTab_GetCurFocus($hWndTab) $mResult.Item = _GUICtrlTab_GetItemText($hWndTab, $mResult.Index) $mResult.RectItem = _GUICtrlTab_GetItemRectEx($hWndTab, $mResult.Index) Return $mResult EndIf EndIf Return SetError(1) EndFunc
Nun kannst du dir Gedanken machen:
- Wie du das aufrufst (Überwachung aktives Tab-Item - mit der Funktion _SciTE_GetTabInfo findest du die nötigen Informationen.)
- Wie du dafür sorgst, dass beim Überfahren des TabItem mit der Maus entweder nicht neu gezeichnet wird, oder wieder die modifizierten Daten gezeichnet werden.
Da der modifizierte Text sofort verschwindet (und die alte Version erscheint), wenn der Mauszeiger in das Rect gerät, würde ich beim Verlassen das Item neu Zeichnen. (Prüfen z.B. mit .._PtInRect() - aber beachten: Die Itemkoordinaten sind relativ zum TabCtrl!) Ist dann auch ein interessanter optischer Effekt.
Bekommst du mit AutoIt alles gebacken. Probier dich mal aus.
Wenn es gar nicht geht, sind wir ja auch noch da.
-
Da muss es doch schon ein Lösung geben
Jetzt ja.
Ich habe das vorab Geschriebene mal umgesetzt. Der Hotkey zum Beenden ist kein Muss, kann man anders lösen.
AutoIt: SciTE_DrawTabItem.au3
Alles anzeigen;-- TIME_STAMP 2023-03-14 18:17:59 #include <FontConstants.au3> #include <GuiTab.au3> #include <WinAPIGdi.au3> #include <WinAPISys.au3> #include <WinAPIMisc.au3> #include <WindowsConstants.au3> HotKeySet("!{F8}", _End) ; <Alt><F8> Beenden AdlibRegister(_CheckSciTE) Global $gm_SciTE[] $gm_SciTE.ExistsLast = 0 $gm_SciTE.ExistsCurr = 0 While True Sleep(50) WEnd Func _End() AdlibUnRegister(_CheckSciTE) MsgBox(0, 'SciTE TabItem', 'Beendet!') Exit EndFunc Func _CheckSciTE() If ProcessExists("SciTE.exe") Then $gm_SciTE.ExistsCurr = 1 If $gm_SciTE.ExistsLast = 0 Then $gm_SciTE.ExistsLast = 1 _DrawTabItem() AdlibRegister(_MouseHoversTab, 150) EndIf Else $gm_SciTE.ExistsCurr = 0 If $gm_SciTE.ExistsLast = 1 Then $gm_SciTE.ExistsLast = 0 AdlibUnRegister(_MouseHoversTab) EndIf EndIf EndFunc Func _MouseHoversTab() Local Static $iHoverLast = 0 Local $mTab = _SciTE_GetTabInfo() If @error Then Return Local $tPoint = _WinAPI_GetMousePos(True, $mTab.hTab) Local $tRect = $mTab.RectItem Local $isHover = _WinAPI_PtInRect($tRect, $tPoint) If $isHover = 1 And $iHoverLast = 0 Then $iHoverLast = 1 ElseIf $isHover = 0 And $iHoverLast = 1 Then $iHoverLast = 1 Return _DrawTabItem() EndIf EndFunc Func _DrawTabItem() Local $mTab = _SciTE_GetTabInfo() If @error Then Return Local $hDC = _WinAPI_GetDC($mTab.hTab) Local $hFont = _WinAPI_CreateFont(15, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _ $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial') Local $hOldFont = _WinAPI_SelectObject($hDC, $hFont) Local $tRect = $mTab.RectItem ; in Variable extrahieren - sonst kein ByRef-Zugriff mit _DrawText möglich _WinAPI_SetTextColor($hDC, 0xAA0020) _WinAPI_SetBkColor($hDC, 0xFFFFFF) _WinAPI_DrawText($hDC, $mTab.Item, $tRect, BitOR($DT_BOTTOM,$DT_CENTER)) _WinAPI_SelectObject($hDC, $hOldFont) _WinAPI_DeleteObject($hFont) _WinAPI_ReleaseDC(0, $hDC) EndFunc Func _SciTE_GetTabInfo() Local $hScite, $aResult, $aChild, $hWndTab = Null Local $mResult[] $hScite = WinGetHandle('[ACTIVE]') $aResult = DllCall("user32.dll", "int", "GetClassNameW", "hwnd", $hScite, "wstr", "", "int", 4096) If Not @error And $aResult[2] = 'SciTEWindow' Then $aChild = _WinAPI_EnumChildWindows($hScite) ; only visible If Not @error Then For $i = 1 To $aChild[0][0] If $aChild[$i][1] = "SciTeTabCtrl" Then $hWndTab = $aChild[$i][0] ExitLoop EndIf Next EndIf If $hWndTab <> Null Then $mResult.hSciTE = $hScite $mResult.Title = WinGetTitle($hScite) $mResult.hTab = $hWndTab $mResult.RectTab = _WinAPI_GetWindowRect($hWndTab) $mResult.Style = _WinAPI_GetWindowLong ($hWndTab, $GWL_STYLE) $mResult.StyleEx = _WinAPI_GetWindowLong ($hWndTab, $GWL_EXSTYLE) $mResult.Index = _GUICtrlTab_GetCurFocus($hWndTab) $mResult.Item = _GUICtrlTab_GetItemText($hWndTab, $mResult.Index) $mResult.RectItem = _GUICtrlTab_GetItemRectEx($hWndTab, $mResult.Index) Return $mResult EndIf EndIf Return SetError(1) EndFunc
-
BugFix : Wäre es nicht besser, anstatt es in autostart zu packen, man eine art "starting exe" für autoit baut, die...
- Das Script von Bugfix startet
- Autoit startet
...und in das Script von dir ggf. einbaut, das wenn die pid nicht mehr existiert, auch dessen Skript beendet wird?
Dann würde das alles auch nur laufen, wenn benötigt und würde auch ggf. den Hotkey nicht benötigen.
Aber ansonsten schöne Lösung, für die, die es brauchen
-
Wäre es nicht besser, anstatt es in autostart zu packen, man eine art "starting exe" für autoit baut
Das kann und soll ja jeder so handhaben, wie er möchte.
Bei mir dümpeln etliche Skripts im Hintergrund und überprüfen, ob etwas gestartet, weggeklickt etc. pp. werden muss. Das frisst kaum Ressourcen (dieses Skript erreicht max. 1% CPU Last bei mir).
Letztlich ist das ja keine Anweisung, sondern eine Empfehlung.