RASHAD wrote:
StringGadget() is the requested not the TextGadget()
There is a big difference you know
Yes, after realizing to have posted an example for the wrong Gadget, I found the following Windows examples for the StringGadget in my example collection (one posted by you):
-
Sparkie (2005)-
TerryHough (2006)-
Fluid Byte (2007)-
IdeasVacuum (2007)-
RASHAD (2008)The examples from FluidByte, TerryHough and you seem to be derived from Sparkie's because they use the same variable name eRect.RECT...
RASHAD wrote:
I have posted directly in your linked thread.
Shardik wrote:
Tomorrow I will try to find a cross-platform solution to vertically align text in a StringGadget...
I had to find out that on Linux PureBasic utilizes the GtkEntry which is only for single line text input and which doesn't allow vertical alignment at all. So on Linux the text in a StringGadget is always vertically centered by default.
Nevertheless, this is my cross-platform solution for toggling the vertical position of text in the StringGadget (on Linux only an information is displayed) :
Code:
EnableExplicit
Define CenterVertically.I
Procedure AlignTextVertically(StringGadgetID, CenterVertically.I)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
MessageRequester("Info",
"On Linux the text in a StringGadget (GtkEntry) is always " +
"vertically centered by default and this cannot be changed!")
CompilerCase #PB_OS_MacOS
CocoaMessage(0, CocoaMessage(0, GadgetID(StringGadgetID), "cell"),
"_setVerticallyCentered:", CenterVertically)
CocoaMessage(0, GadgetID(StringGadgetID), "setNeedsDisplay:", #True)
CompilerCase #PB_OS_Windows
Protected ClientRect.RECT
Protected DCHandle.I
Protected Text.S = GetGadgetText(StringGadgetID)
Protected TextXY.SIZE
DCHandle = GetDC_(GadgetID(StringGadgetID))
SelectObject_(DCHandle, GetGadgetFont(StringGadgetID))
GetTextExtentPoint32_(DCHandle, Text, Len(Text), @TextXY)
ReleaseDC_(GadgetID(StringGadgetID), DCHandle)
GetClientRect_(GadgetID(StringGadgetID), ClientRect)
If CenterVertically
ClientRect\top = (ClientRect\bottom - TextXY\cy) / 2 - 1
EndIf
SendMessage_(GadgetID(StringGadgetID), #EM_SETRECT, 0, ClientRect)
InvalidateRect_(GadgetID(0), 0, #True)
CompilerEndSelect
EndProcedure
OpenWindow(0, 270, 100, 330, 100, "Center text vertically")
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
StringGadget(0, 10, 10, 310, 40,
"The quick brown fox jumps over the lazy dog.", #ES_MULTILINE)
CompilerElse
StringGadget(0, 10, 10, 310, 40,
"The quick brown fox jumps over the lazy dog.")
CompilerEndIf
ButtonGadget(1, 70, 60, 180, 25, "Toggle vertical centering")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 1
CenterVertically ! 1
AlignTextVertically(0, CenterVertically)
EndIf
EndSelect
ForEver
Edit 1: In Windows the StringGadget is now created with #ES_MULTILINE.
Edit 2: I have added the following line in the Windows-specific code to correctly handle different font sizes:
Code:
SelectObject_(DCHandle, GetGadgetFont(StringGadgetID))