Da steck ich mich lieber mit Rona an!
Beiträge von Professor Bernd
-
-
Boah, ich sagte doch, das ist zu komplex für mich. Kannst du mir dabei helfen?
Es gibt soviele verschiedene Einstellungen für die Tab-Weite. Die Tab-Weite kann ich aus der PSPad.ini auslesen. Aber wie dann weiter? Da stehen ja nicht nur Leerzeichen, sondern jedes beliebige Zeichen kann die Entfernung bis zum nächsten Tab-Stop (heißt das so?) beeinflussen. Da steht z. B. mitten im String nach 400 Zeichen ein "(2*4)", wie findet man dann raus, welches Zeichen auf der Tab-Stop-Grenze steht? Vielleicht sind vorher schon Tabs im Text, für die müssten alle die Berechnungen gemacht werden.
So und jetzt habe ich auch noch Angst bekommen. Vermutlich wird als nächstes jemand mein Lieblingsthema in die Runde werfen und sagen, "Das ist doch alles ganz easy mit RegEx zu lösen!" Nein, bitte nicht.
Bernd.
-
Oscar Genialer Code!
Um den Labels ständig neuen Text zuweisen zu können, habe ich die $sString Variable in die Funktionsdeklaration aufgenommen. Dadurch kann ich deine Funktion aufrufen und ihr einen neuen Text mitgeben. Kannst du dir das Demo angucken und mir sagen, ob ich das in meinem Programm so verwenden kann? Oder müssen da Dinge hinzugefügt, freigegeben, oder sonstwas rein?
Am Ende deines Code werden viele Sachen freigegeben. Wenn ich das in meinem Programm übernehme, muss ich dann am Ende des Programms noch etwas freigeben, oder ist schon alles freigegeben?
AutoIt
Alles anzeigen#include <AutoItConstants.au3> #include <GDIPlus.au3> #include <SendMessage.au3> #include <StaticConstants.au3> #include <WinAPIHObj.au3> #include <WinAPIInternals.au3> #include <WinAPISysInternals.au3> #include <GUIConstantsEx.au3> ; Für $GUI_EVENT_CLOSE. Example1() Func Example1() Local $hGui = GUICreate("My GUI", 400, 800) Local $iTop = 0 ; Labels mit verschiedener Schriftgöße erstellen. For $i = 4 To 27 $iTop += 15 + $i GUICtrlCreateLabel("fontsize " & $i, 10, $iTop, 0, 0, $SS_BITMAP) ; Wichtig! $SS_BITMAP als Style _GUICtrlSetFont(-1, "fontsize" & $i, $i, 0, "Courier New", 0xFF00007F) GUICtrlSetBkColor(-1, 0xCCCCFF) ; <== Um zu erkennen, wenn sich die Größe des Labels ändert. Next GUISetState(@SW_SHOW) Local $idBtn_1 = GUICtrlCreateButton("Change Label 7 Text", 200, 130, 120) Local $sNewText = " This is a sample text to fill the label." While 1 Switch GUIGetMsg() Case $idBtn_1 ; GUICtrlSetData(7, $sNewText) ; <== Brauche ich das, oder kann ich das weglassen? _GUICtrlSetFont(7, $sNewText, 8, 0, "Courier New", 0xFF00007F) GUICtrlSetBkColor(7, 0xCCCCAA) ; <== Nur um zu sehen, ob das hier einen Einfluss hat. Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd EndFunc ;==>Example ; <== $sString in Funktions-Deklaration aufgenommen. Func _GUICtrlSetFont($idCtrl, $sString, $iSize, $iStyle, $sFontname, $iColor = 0xFF000000) Local $hWnd, $hBitmap, $hGfxCtx, $hBrush, $hFormat, $hFamily, $hFont, $tLayout, $aInfo Local $hBMP, $hPrevImage _GDIPlus_Startup() If $idCtrl = Default Or $idCtrl <= 0 Then $idCtrl = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($idCtrl)) If $iStyle = Default Or $iStyle <= 0 Then $iStyle = 0 $hWnd = GUICtrlGetHandle($idCtrl) If Not IsHWnd($hWnd) Then Return SetError(1) ; $sString = GUICtrlRead($idCtrl) ; <== Local $iW = 1000, $iH = 100 $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $hGfxCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap) _GDIPlus_GraphicsSetTextRenderingHint($hGfxCtx, 4) $hBrush = _GDIPlus_BrushCreateSolid($iColor) $hFormat = _GDIPlus_StringFormatCreate() $hFamily = _GDIPlus_FontFamilyCreate($sFontname) $hFont = _GDIPlus_FontCreate($hFamily, $iSize, $iStyle) $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH) $aInfo = _GDIPlus_GraphicsMeasureString($hGfxCtx, $sString, $hFont, $tLayout, $hFormat) _GDIPlus_GraphicsDispose($hGfxCtx) _GDIPlus_BitmapDispose($hBitmap) $iW = Ceiling($aInfo[0].Width) $iH = Ceiling($aInfo[0].Height) ;~ ConsoleWrite(StringFormat('Width x Height = %i x %i\r\n', $iW, $iH)) $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $hGfxCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap) _GDIPlus_GraphicsSetTextRenderingHint($hGfxCtx, 4) $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH) $aInfo = _GDIPlus_GraphicsMeasureString($hGfxCtx, $sString, $hFont, $tLayout, $hFormat) _GDIPlus_GraphicsDrawStringEx($hGfxCtx, $sString, $hFont, $aInfo[0], $hFormat, $hBrush) $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap) _WinAPI_SetWindowPos($hWnd, $HWND_NOTOPMOST, 0, 0, $iW, $iH, BitOR($SWP_FRAMECHANGED, $SWP_NOMOVE)) $hPrevImage = _SendMessage($hWnd, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP) If $hPrevImage Then _WinAPI_DeleteObject($hPrevImage) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hGfxCtx) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_Shutdown() EndFunc
Wie kann man mit dem Code Tabs im Label schreiben?
Bernd.
-
Wie schon geschrieben, funktioniert das leider nicht. Wenn ein Tab auf Weite 4 eingestellt ist, und an einer virtuellen Markierung gesetzt wird, z. B. am Zeilenanfang, dann umfasst er 4 (ich nenne das mal) Einheiten für die Dartstellung im Editor. Wenn aber vor dem Tab z. B. 2 Leerzeichen stehen, wird der Tab quasi gekürzt und umfasst nur die 2 Einheiten bis zu seiner nächsten virtuellen Position. Siehe Screenshot. (schwer zu erklären)
Deshalb kann ich keine korrekte Berechnung oder ein Replace durchführen. Das ist zu komplex (für mich).
Bernd.
-
Naja nicht unbedingt oder.
Stehe gerade auf dem Schlauch, kannst du das mal übersetzen?
Wann wird das Calltiperzeugt? Wenn du den Namen der Funktion getippt hast und dann die Klammer öffnest
Derzeit ist keine Automatik implementiert, den CallTip gibts nur beim Drücken des Shortcuts.
Da JEDER Programmierer, der kein absoluter Sozipath ist, monospace Schriftarten verwendet,
Das scheint kein Problem zu sein, PSPad unterstütz scheinbar nun monospace Schriftarten (Stichproben gemacht).
brauchst du doch nur die Breite eines Zeichens zu ermitteln und einfach die Länge des Funktionsnamens * BreiteZeichen zurückzurechnen. Das Caret steht ja am (
Genau so mache ich es, und genau da tauchen die Probleme mit Tabs auf. Im Text ist 1 Tab = 1 Zeichen, aber der Editor interpretiert jenach Einstellung entsprechend viele virtuelle Leerzeichen. Aber die virtuellen Leerzeichen sind in der Tat nicht echt, der Editor zieht die Darstellung für 1 Tab auf die eingestellte Länge, aber es ist und bleibt 1 Zeichen. Deshalb funktioniert die genannte Zurückrechnung nicht.
Kleine Ergänzung: Wenn jemand ein Script erstellt hat und hat eine Tabweite von 4, stellt das Script hier im Forum ein und du hast eine Tabweite von 2 wird dein Editor das bei dir entsprechend anders darstellen, als bei dem Script-Ersteller. Und trotzdem ist 1 Tab jedesmal = 1 Zeichen. Alles klar?
Ich versuche mal ein Bildchen anzuhängen.Hier der Screenshot.Bernd.
-
In PSPad kann ich mir die Pixel / Screen-Koordinaten ausgeben lassen, an der das Caret steht. So erhalte ich z. B. die X-Position vom "a" in "Hallo" (siehe Postint #1). Nun könnte ich im Au3 die Pos vom ersten FuncName-Char ermitteln, das Caret in PSPad verschieben, die gewünschte X-Pos auslesen und das Caret zurücksetzen.
Leider ist die Komunikation mit der VBScript-Schnittstelle mehr als bescheiden. Mir ist leider noch kein Weg eingefallen, wie ich dem VBScript mitteilen kann, dass es das oben beschriebene tun soll. Zudem müsste es eine Möglichkeit sein, die für diesen Zeitraum alle anderen CallTip-Meschanismen außer Kraft setzt, denn sonst wird der CallTip ausgeschaltet, sobald das Caret nicht mehr zwischen den Klammern der Funktion steht.
Aber eine interessante Idee ist das schon. Wenn ich jetzt noch die oben beschriebenen Probleme lösen könnte, wäre das eine Möglichkeit.
Hast du noch eine Idee?
Ich denke jetzt mal "laut": Im VBScript läuft zur Kommunikation eine Schleife, sobald der CallTip gestartet wird. Im Au3 wird ein gültiger FuncName ermittelt und auch die Pos vom FuncNameFirstChar. Wenn es mir gelänge, dem VBScript mitzuteilen, dass es dem Au3 die ScreenPosX dazu senden soll, ohne dass das Au3 denkt, es soll mit den neuen Koordinaten vom Caret wieder von vorne anfangen, dann ... Interessant, interessant! Da geh ich mal dran.
Bernd.
-
Es geht um das Positionieren des CallTips unter dem Funktionsnamen.
Um Leerzeichen und Tabs gut erkennen zu können, habe ich im Screenshot die Anzeige für Formatierungszeichen eingeschaltet.
In der oberen Bildhälfte ist der CallTip richtig positioniert und direkt unterhalb des Funktionsnamens ausgerichtet. So soll es sein.
In der unteren Bildhälfte enthält der Text im Editor Tabs, weshalb ich den CallTip nicht richtig positionieren kann.
Ich suche eine Möglichkeit, die X-Position des ersten Zeichens vom Funkttionsnamen korrekt zu ermitteln (als Screen-Koordinate).
Bernd.
-
Hmm, schön, ... chinesisch! Werde mich mal durchwurschteln.
...
Oscar Kurz angesehen, sieht gut aus. Da werde ich wohl eine Weile brauchen, um durchzusteigen. Ich arbeite daran!
-
Ich benutze den StringSize Code von Melba 23. Wie gesagt, das Messen der Stringbreite funktioniert soweit, solange keine Tabs darin sind. Mit GDI+ kenne ich mich zu wenig aus, um das mal auf die Schnelle zu testen. Hast du einen Code Schnipsel für mich? Ich kriege noch nicht einmal das Beispiel aus der Hilfe dazu, mit "Courier New" zu laufen, geschweige denn Measurements.
Bernd.
-
Hallo.
Ich suche nach einer Möglichkeit, die horizontale Screen-Position X zu ermitteln, von einem bestimmten Zeichen in einem Text.
Beispiel: Die Schrift ist "Courier New", also eine Monospace Schrift. Im Text
ist die X-Position vom "a" in "Hallo" bekannt, und es soll die X-Position vom "M" in "MsgBox" ermittelt werden.
Das funktioniert bis hierhin: Ich berechne die Breite in Pixeln vom Teilstring MsgBox(0, "", "H und ziehe sie von der bekannten Position "a" in "Hallo" ab = X-Postition vom "M" in "MsgBox".
Das Problem: Das funktioniert nur, solange keine Tabs (Tabulatoren) im Text sind.
Ich habe schon daran gedacht, die Tabs in Leerzeichen zu wandeln, aber das geht leider nicht, weil Tabs unberechenbar sind. Der Tab springt dann auf eine festgelegte Position, abhängig davon, ob schon andere Zeichen im Text stehen. Z. B. wenn ein Tab mit einer Länge von 4 angezeigt wird, so hat er nur eine Länge von 1, wenn davor 3 andere Zeichen stehen.
Wie kann man die X-Pos vom "M" in "MsgBox ermitteln, wenn Tabs im Text sind?
Bernd.
-
Kann es an der Maßeinheit für die Schriftgröße liegen? (Punkt, Pixel, Inch, ...) Kann man die Maßeinheit für die GUI oder die Labels einstellen? Opt(?)
-
Oscar Wow, doppeltes Danke! Erstens für die GDI+ "Kurzeinführung"! Zweitens für die Beweisführung, dass etwas in AutoIt schief läuft.
Hier ein Screenshot mit Musashis Script und halben Schritten für die Schriftgröße auf meinem System. Wie man sehen kann, entspricht die Schriftgröße 8.5 bei mir in etwa der Schriftgröße 8 bei Musashi. Das zeigt, AutoIt kann die Größe richtig skalieren, macht es aber nicht.
Hier scheint AutoIt beim erstellen der Label die Schriftarten "falsch" zu skalieren.
Aber wo liegt der Fehler? Bzw. wie kann man Abhilfe schaffen? Wenn ich mich in GDI+ einarbeite und meinen Code auf GDI+ umstelle, verzögert sich die Veröffentlichung des CallTipViewers nicht um 4 bis 8 Wochen, sondern eher um Monate.
Bei Musashi wird die Schriftgröße der Labels in AutoIt richtig skaliert. (Wie sieht das übrigens bei dir aus?) Bei mir nicht, obwohl ich für die gleichen Voraussetzungen gesorgt habe: Ich habe das gleiche Script benutzt, das Musashi in Posting #11 zur Verfügung stellt. Ich habe getestet auf Win 7 und Win 10, mit AutoIt 3.3.1.0 und 3.3.14.5. Ich habe mit dem Script getestet und mit der von Musashi kompilierten Exe. Und dennoch wird von AutoIt auf meinen Systemen falsch skaliert, und bei Musashi wird richtig skaliert.
Ich kann gerade nicht erkennen, wo der Unterschied liegt. Und es muss einen geben, sonst wären die Skalierungen nicht unterschiedlich.
Bernd.
-
Könnte ggf. an den installierten Schriften liegen.
Interessante Idee. Leider nicht zutreffend. Wie schon eingangs geschrieben, werden in anderen Anwendungen die Schriftgrößen so dargestellt, wie von deinem Test-Script.
-
Danke Musashi!
Hier nun der Vergleich zwischen der Darstellung auf deinem System mit Win 7, auf meinem System mit Win 7, und auf meinem System mit Win 10. Ich habe jedesmal deine Fonttest.exe aus Posting #9 gestartet und einen Screenshot erstellt. Der Screenshot von deinem System ist von dir aus Posting #2.
Hat jemand eine Idee, wovon die Abweichungen in der Darstellung kommen?
Bernd.
-
Ich habe nun AutoIt 3.3.14.0 auf einem Test-PC mit Win 7 installiert (ohne SciTE4AutoIt3), und dann mein Test-Script gestartet. Leider ist das Ergebnis nicht so wie bei Musashi.
---- Zwischezeitlich ist Posting #9 von Musashi erstellt worden. ----
Du meinst sicher eine von mir mit 3.3.14.0 kompilierte EXE
Vielen Dank dafür, aber ich brauche tatsächlich dein Au3-Script. Vielleicht ist irgendwo ein Komma, oder sonstwas anderes, das man übersehen kann. Deshalb möchte ich mit genau deinem Script testen, weil das (bei dir) die richtigen Schriftgrößen anzeigt.
-
Musashi Wärst du so nett, deinen Test-Code zu posten? Dann kann ich den Libre-, Open-, usw. -Vergleich entfernen und deinen Screenshot zum Vergleichen nutzen. (Denn es geht hier nicht um den Vergleich, sondern die Darstellung der Schriftgröße im AutoIt Label.)
Bernd.
-
Ich habe es gerade auf Win 7 getestet, als kompilierte Exe. Das Ergebnis ist wie auf meinem Screenshot! Also mit falscher Schriftgröße bei Einstellung 8. Das legt den Verdacht nahe, dass es mit der AutoIt-Version zu tun haben kann.
Musashi Meine AutoIt-Version ist 3.3.14.5. Mit welcher AutoIt-Version hast du getestet?
@Alle Hat jemand eine Idee, woran es liegen kann, dass die Schriftgröße in AutoIt-Labels bei Einstellung 8 oder weniger nicht richtig erscheint?
Bernd.
-
Ich hab deinen Post gelesen, aber ich sehe nirgends ein Fragezeichen. Was ist denn deine Frage?
Die (unausgesprochene) Frage ist: Was denkt ihr darüber?
LibreOffice mit AutoIt zu vergleichen ist etwas unpraktisch,
Ok, dann machs mal besser und zeig einen besseren Vergleich.
Wenn du genau hinsiehst, kannst du erkennen, dass der Vergleich mit Libre Office nicht notwendig ist. Er ist nur zur Illustration für diejenigen (wie ich), die gerne sehen, wovon gesprochen wird. Wenn du dir den Screenshot genau ansiehst, genügt die AutoIt Darstellung, dort ist der Unterschied von Größe 10 zu 8 deutlich zu groß. Oder sieh dir den Screenshot von Musashi an, dort ist der Größenunterschied adäquat. Das macht sich in meinem CallTipViewer bemerkbar, weil der CallTip nicht an die richtige Stelle positioniert wird.
Musashi So wie in deinem Screenshot sollte es eigentlich aussehen. Hast du unter Win 7 getestet? Ist das wieder ein Win 10 Problem?
Kann das jemand unter Win 10 testen?
Bernd.
-
Hallo Leute. Diesmal habe ich mal NICHT vorher recherchiert, sondern frage erstmal hier.
Mir ist aufgefallen, dass die Schriftgröße in Labels nicht mit der "normalen" übereinstimmt, die man in Editoren findet (SciTE, PSPad, Libre Office, ...), wenn man Größen von 8 oder weniger benutzt. Dann sind die Schriften im Label irgendwie kleiner, als üblich. Scheinbar entspricht im AutoIt-Label die 8.5 der normalen Größe 8, aber dazu konnte ich nur optische Vergleiche vornehmen.
Im Screenshot habe ich Libre Office und AutoIt Labels gegenüber gestellt.
Wer sich das Ganze live ansehen will, hier ein Code-Schnipsel.
AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> Opt("MustDeclareVars", 1) Example() Func Example() ; GUI Local $hGui = GUICreate("My GUI", 400, 300, 510, 440) ; GUISetFont(10, Default, Default, "Courier New") Local $iTop = 0 ; Labels mit verschiedener Schriftgöße erstellen. For $i = 4 To 14 $iTop += 20 GUICtrlCreateLabel("This is a label with font size " & $i, 10, $iTop, 380) GUICtrlSetFont(-1, $i, Default, Default, "Courier New") Next GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd GUIDelete() EndFunc ;==>Example
Bernd.
-
Schon dabei.