Seite 1 von 1

TextLength(WindowTitel$) ?

Verfasst: 16.01.2008 14:10
von sibru
Hallo,

hat jemand ´ne Ahnung, wie ich die aktuelle Länge [Pixel] des
aktuellen Fenster-Textes rauskriege ?
(such ´ne API, nicht PB4.x...)

Gruss Siggi

Re: TextLength(WindowTitel$) ?

Verfasst: 16.01.2008 14:44
von Kiffi
API kann ich nicht anbieten, aber vielleicht funktioniert ja folgendes bei
Deiner antiquierten PB-Version:

Code: Alles auswählen

#myWindow = 0

If OpenWindow(#myWindow, #PB_Ignore, #PB_Ignore, 100, 100, "123123123")
  
  StartDrawing(WindowOutput(#myWindow))
  myWidth  = TextWidth(GetWindowTitle(#myWindow))
  myHeight = TextHeight(GetWindowTitle(#myWindow))
  StopDrawing() 
  
  Debug myWidth
  Debug myHeight
  
  Repeat
  Until Event = #PB_Event_CloseWindow
  
EndIf

Grüße ... Kiffi

Verfasst: 16.01.2008 15:31
von Fluid Byte
So einfach ist es leider nicht Kiffi. Die Größenangaben die da rauskommen beziehen auf den Standardfont "System". Du musst den verwendeten Systemfont und Schriftgröße erst ermitteln und dann mit DrawingFont() setzen. Ich schraub grad mal was zusammen...

PS: Ein WaitWindowEvent() wäre echt dufte. Bild

Verfasst: 16.01.2008 15:37
von Kiffi
Fluid Byte hat geschrieben:PS: Ein WaitWindowEvent() wäre echt dufte. Bild
und das mir! :oops: :lol:

Grüße ... Kiffi

Verfasst: 16.01.2008 16:10
von #NULL
gab's schonmal was zu (mehr oder weniger ungelöst): http://www.purebasic.fr/german/viewtopic.php?t=14366
der richtige font blieb das problem

Verfasst: 16.01.2008 17:44
von Fluid Byte
So gehts:

Code: Alles auswählen

Enumeration
	#SF_CAPTION
	#SF_ICON
	#SF_MENU
	#SF_MESSAGE
	#SF_SMCAPTION
	#SF_STATUS
EndEnumeration

Procedure GetSystemFont(nIndex)
	Protected phkResult, lpValueName.s, lpcbData, *lplf.LOGFONT, hLibGDI, Result
	
	Select nIndex
		Case #SF_CAPTION : lpValueName = "CaptionFont"
		Case #SF_ICON : lpValueName = "IconFont"
		Case #SF_MENU : lpValueName = "MenuFont"
		Case #SF_MESSAGE : lpValueName = "MessageFont"
		Case #SF_SMCAPTION : lpValueName = "SmCaptionFont"
		Case #SF_STATUS : lpValueName = "StatusFont"
	EndSelect
	
	RegOpenKeyEx_(#HKEY_CURRENT_USER,"Control Panel\Desktop\WindowMetrics",0,#KEY_READ,@phkResult)		
	RegQueryValueEx_(phkResult,lpValueName,0,0,0,@lpcbData)
 	*lplf = AllocateMemory(lpcbData)
	RegQueryValueEx_(phkResult,lpValueName,0,0,*lplf,@lpcbData)
	RegCloseKey_(phkResult)
	
	hLibGDI = OpenLibrary(#PB_Any,"Gdi32.dll")
	Result = CallFunction(hLibGDI,"CreateFontIndirectW",*lplf)
	CloseLibrary(hLibGDI)
	
	FreeMemory(*lplf)

	ProcedureReturn Result
EndProcedure

OpenWindow(0,0,0,320,240,"untitled window",#WS_CAPTION | #WS_SYSMENU | 1)
 
hFntCaption = GetSystemFont(#SF_CAPTION)

Caption$ = GetWindowTitle(0)

StartDrawing(WindowOutput(0))
DrawingFont(hFntCaption)
Box(10,10,200,100,#Red)
DrawText(20,20,Caption$)
Debug TextWidth(Caption$)
Debug TextHeight(Caption$)
StopDrawing()

DeleteObject_(hFntCaption)

While WaitWindowEvent() ! 16 : Wend

Verfasst: 16.01.2008 17:55
von #NULL
saubär :)

Verfasst: 16.01.2008 18:05
von Kiffi
#NULL hat geschrieben:saubär :)
njaa, nicht so ganz... Schon mal unter Start -> Einstellungen ->
Systemsteuerung -> Anzeige -> Darstellung
den Schriftgrad auf 'Extragroß'
gestellt? Da weicht die ermittelte Breite ziemlich von der tatsächlichen ab.

Grüße ... Kiffi

Verfasst: 16.01.2008 18:42
von Fluid Byte
Kann ich nicht bestätigen. Wie hast du es denn nachgemessen?

[edit]
Unicode war aktiviert beim kompilieren. Das scheint die Ursache zu sein.

[edit2]
Der Font muss immer mit der Unicode-Varinate von CreateFontIndirect_() erstellt werden. Hab den Code entsprechend aktualisiert.

Verfasst: 17.01.2008 14:03
von sibru
wouw...
sieht ja toll aus!
Und so nebenbei steckt da auch noch das Handling anderer
SystemElemente-Font´s mit drin !!! :allright:

Danke...