Just needed this and took me a while to find it as it seems like a rather rare request. While I tested this I noticed some flaws. First off, the code doesn't take the currently selected font into account wich makes the lines get splitted into 2 or more blocks. Second, if you made this fix you also need to add the 2 x 2 pixel border when calculating 'eRect\bottom' or it causes the same problem.
Here's my fixed version for future searches:
Code: Select all
Procedure StringGadgetVCenter(GadgetID)
hwndEdit = GadgetID(GadgetID)
LineCount = SendMessage_(hwndEdit,#EM_GETLINECOUNT, 0, 0)
hdc = GetDC_(hwndEdit)
SelectObject_(hdc,GetGadgetFont(0))
GetTextExtentPoint32_(hdc,"ABC",3,fsz.SIZE)
ReleaseDC_(hwndEdit,hdc)
GetClientRect_(hwndEdit,eRect.RECT)
eRect\top = (GadgetHeight(GadgetID) - fsz\cy * LineCount) / 2
eRect\bottom = eRect\top + (fsz\cy * LineCount) + 4
If eRect\bottom < GadgetHeight(GadgetID)
SendMessage_(hwndEdit,#EM_SETRECT,0,eRect)
EndIf
EndProcedure
Text$ = "Vertical and Horizontal" + #CRLF$ + "Centered Text in" + #CRLF$ + "Multiline StringGadget"
OpenWindow(0,0,0,300,200,"Edit Control VCenter",#WS_SYSMENU | #WS_CAPTION | 1)
CreateGadgetList(WindowID(0))
StringGadget(0,10,10,280,180,Text$,#ES_MULTILINE | #ES_CENTER )
SetGadgetFont(0,LoadFont(0,"Arial",12))
StringGadgetVCenter(0)
LinesNum = SendMessage_(GadgetID(0), #EM_GETLINECOUNT,0,0)
Repeat
EventID = WaitWindowEvent()
Select EventGadget()
Case 0
If EventType() = #PB_EventType_Change And LinesNum <> SendMessage_(GadgetID(0),#EM_GETLINECOUNT,0,0)
LinesNum = SendMessage_(GadgetID(0),#EM_GETLINECOUNT,0,0)
StringGadgetVCenter(0)
EndIf
EndSelect
Until EventID = #PB_Event_CloseWindow