User Passwort
 Passwort speichern Passwort vergessen?
 
 
 
 Alle Foren
 PDA-Dev :: Windows Mobile
 Windows Mobile - Allgemeines
 Anzahl sichtbarer Zeichen einer Textbox ermitteln?
Autor Vorheriges Thema Thema Nächstes Thema  

UweK

PDA-Programmierer


24 Beiträge

Erstellt am: 22.07.2010 :  13:07:05 Uhr  Profil anzeigen  Autor eine Email senden  Besuche UweK's Homepage  Antwort mit Zitat
Hallo Leute,

ich stehe mal wieder vor einem Problem...
Hat jemand ein Beispiel wie man mittels CompactFramework die Anzahl sichtbarer Zeichen
einer normalen Textbox ohne Multiline ermitteln kann?

Ich benötige die Anzahl um eine Laufschrift zu erzeugen wenn der gesamte Text der TextBox
länger ist als der sichtbare Text.

Beim suchen bin ich auf ein Beispiel der API-Funktion GetTextExtentExPoint() gestoßen,
welches sich aber auf die normale Windows API bezog. Die Funktion steht auch in der
coredll im CompactFramework zur Verfügung, jedoch ist der Rückgabewert immer 0 :-/

Hier Codeausschnitte wie ich es mit VB versucht habe zu implementieren:

 
 
<DllImport("coredll.dll")> _
Public Function GetTextExtentExPoint(ByVal DC As IntPtr, ByVal Str As String, ByVal Len As Integer, ByVal nMaxExtent As Integer, ByVal lpnFit As Integer(), ByVal alpDx As Integer(), ByVal size As stSize) As Integer
End Function
 
<StructLayout(LayoutKind.Sequential)> _
Public Structure stSize
Public lx As Integer
Public ly As Integer
End Structure
 
Private Function AnzahlNichtSichtbarerZeichen(ByVal TextBox As Microsoft.Dynamics.Mobile.Framework.Controls.TextBox) As Integer
Dim lpnFit As Integer()
Dim alpDx As Integer()
Dim mySize As WinMobileApi.stSize
mySize.lx = 0
mySize.ly = 0
 
TextBox.Text &= "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
Dim g As Graphics = TextBox.CreateGraphics()
Dim DC As New IntPtr()
DC = g.GetHdc()
 
Dim nResult As Integer = WinMobileApi.GetTextExtentExPoint(DC, TextBox.Text, TextBox.TextLength, 80, lpnFit, alpDx, mySize)
 
Return nResult
End Function
 
 


Hat jemand diese Funktion schonmal eingesetzt oder einen anderen Lösungsweg für mein
Problem?

Vielen Dank im Voraus für Eure Hilfe!

LG,
Uwe.
   

UweK

PDA-Programmierer


24 Beiträge

Erstellt  am: 28.07.2010 :  10:40:25 Uhr  Profil anzeigen  Autor eine Email senden  Besuche UweK's Homepage  Antwort mit Zitat
Hallo an Alle,

kann mir denn wirklich keiner ein Beispiel oder nen Lösungsansatz für das Problem
geben?

Vielen Dank im Voraus!

Gruß,
Uwe.
Zum Anfang der Seite

Useless user

PDA-Spezialist


439 Beiträge

Erstellt  am: 29.07.2010 :  08:26:41 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Eine solche Funktion ist mir nicht bekannt. Ein Workaround wäre die Berechnung der Breite eines Textes. Das Graphics-Objekt hast du ja bereits in deinem Beispiel.
Einem Aufruf der Funktion MeasureString kannst du einen String und die aktuelle Schriftart deiner Textbox übergeben und bekommst die Breite des Textes raus.
Da kannst du dann die Textboxbreite und die beiden Randbereiche abziehen und was übrigbleibt ist der Anteil der nicht mehr reinpasst.
Zum Anfang der Seite

UweK

PDA-Programmierer


24 Beiträge

Erstellt  am: 29.07.2010 :  17:23:20 Uhr  Profil anzeigen  Autor eine Email senden  Besuche UweK's Homepage  Antwort mit Zitat
Hallo Useless User,

vielen Dank für den Tipp, funktioniert prima!!!
Aber schon steht das nächste Problem an...

Ich prüfe nun also via MeasureString ob der Text > als der anzeigbare Text ist.
Falls dem so ist, lasse ich den Text in Laufschriftmanier gesteuert über ein Timerobjekt
"laufen". Das funktioniert auch soweit, nur "lahmt" die weitere Verarbeitung bzw.
wenn ich z.B. auf ein listboxelement klicke wird die Verarbeitung nur sehr träge
durchgeführt. Also dachte ich mir, lasse ich den Timer und somit auch die Laufschrift in
einem separaten Thread laufen... Leider bekomme ich es nicht hin :-/

Kannst Du (oder sonst jemand hier) mir bitte in einem kurzen Beispiel zeigen wie das
genau funktioniert?
Nachfolgend der Code wie er derzeit im HauptThread funktioniert.

 
With tlbTmpTextBox
.Width = TouchListBox.Width
.Height = UeberschriftElement.Height
.Text = tlbUeberschrift
.Font = UeberschriftElement.TextFont
Grafik = .CreateGraphics
GrafikGroesse = Grafik.MeasureString(.Text, .Font)
If GrafikGroesse.Width > TouchListBox.Width Then
AddHandler Timer.Tick, AddressOf Aktualisieren 'in Aktualisieren wird die Laufschrift gehandelt
Timer.Interval = 300
Timer.Enabled = True
Else
Timer.Enabled = False
End If
End With
 


Vielen Dank!!!

Gruß,
Uwe.
Zum Anfang der Seite

Useless user

PDA-Spezialist


439 Beiträge

Erstellt  am: 29.07.2010 :  19:10:14 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Ruft deine "Aktualisieren" Funktion am Ende die Refresh-Funktion der Textbox auf? Das ist notwendig um die Textbox sofort neu zu zeichnen und nicht erst wenn es sonst nix zu tun gibt.
Es könnte auch sein das sich das überhaupt nicht zufriedenstellend umsetzen lässt.
Außerdem musst du aufpassen das du dir mit solchen Spielereien nicht eine Performancebremse einbaust. Nichts ist schlimmer als eine Anwendung die nur träge reagiert...
Zum Anfang der Seite

UweK

PDA-Programmierer


24 Beiträge

Erstellt  am: 30.07.2010 :  09:58:29 Uhr  Profil anzeigen  Autor eine Email senden  Besuche UweK's Homepage  Antwort mit Zitat
Hi,

das Problem ist nicht, dass die Laufschrift nicht refresht wird. Das funktioniert alles
super. Die Performance ist das Problem, weil der HauptThread eben dann mit dem Timer-
Objekt beschäftigt ist. Deshalb möchte ich den Timer ja in einem separaten Thread (einem Arbeitsthread) starten, der Timer wiederum ruft die Aktualisierung der Laufschrift auf.

Im HauptThread kann dann ganz normal flüssig weitergearbeitet werden während die
Laufschrift läuft.

Mein Problem ist, dass ich es nicht hinbekomme den Timer in einen Arbeitsthread
auszulagern. :-/

Gruß,
Uwe.
Zum Anfang der Seite

Useless user

PDA-Spezialist


439 Beiträge

Erstellt  am: 30.07.2010 :  10:48:51 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Das würde dir nichts bringen den Timer in einen anderen Thread auszulagern, nur der Hauptthread kann deine Controls aktualisieren! Du müsstest dafür sorgen das kein Vorgang den Hauptthread länger als 300 ms (Timer-Interval) belegt, nur so kann das funktionieren. Also eher andere Aktionen in Hintergrundthreads verlagern, aber dadurch wird eine Anwendung dermaßen aufgeblasen - das wäre mir persönlich so ein bisschen Laufschrift nicht wert. Besser du findest dich damit ab das deine Laufschrift ab und zu ruckelt. Wenn möglich kannst du versuchen deine "anderen Vorgänge" zu optimieren um die Blockierung des Hauptthread zu verringern, dann läuft auch deine Laufschrift besser.
Zum Anfang der Seite
  Vorheriges Thema Thema Nächstes Thema  
Springe nach:
 
  Bookmark & Share  
 
 
 
  Tags  
 
Keine Tags gefunden
 
 

 



pda-dev.de

Quicklinks: Foren-Übersicht | Developer-News | Suche | Impressum

© just-works! Software

Zum Anfang der Seite

Snitz Forums 2000