Mattias Gaertner wrote:

On Tue, 14 Mar 2006 18:21:32 +0100
darekm <[EMAIL PROTECTED]> wrote:

tLabel should care about WordWrap property

attached patch repair it

Thanks. Applied.

Mattias



Thanks

but I find new item:


Index: include/customlabel.inc
===================================================================
--- include/customlabel.inc    (wersja 8956)
+++ include/customlabel.inc    (kopia robocza)
@@ -39,7 +39,8 @@
    R := Rect(0,0, Width, Height);
    OldFont:=SelectObject(DC, Font.Handle);
    Flags:=DT_CalcRect;
-    if WordWrap then inc(Flags,DT_WordBreak);
+    if WordWrap then inc(Flags,DT_WordBreak)
+                else inc(Flags,DT_SingleLine);
    DrawText(DC, PChar(Caption), Length(Caption), R, Flags);
    SelectObject(DC, OldFont);
    // add one to be able to display disabled label



Darek
PS. What's about my previously patch (tComboBox)
 now I have much more investigation:
1. for tSpeedButton: caption is paint in improper place (row for caption 'zoom' and 'insert' is not the same for fonts other than defaults
2. added some improvements for debugging
3. repaired    function FindLineEnd(LineStart: integer) for text in  UTF8
4. for tComboBox select signal is fired only one time per click

Can can somebody test it.

I have one more patch (tComboBox grab capture and not release them, but I must stopping without finish this changes)








Index: interfaces/gtk/gtkproc.inc
===================================================================
--- interfaces/gtk/gtkproc.inc  (wersja 8956)
+++ interfaces/gtk/gtkproc.inc  (kopia robocza)
@@ -1042,6 +1042,7 @@
 var
   PS : PPaintStruct;
 begin
+  writeln('gtkpaintmessagetoPaint');
   Result.Msg:=LM_PAINT;
   New(PS);
   PS^.hDC:=0;
@@ -3443,11 +3444,12 @@
 function DeliverMessage(const Target: Pointer; var AMessage): Integer;
 begin
   if Target=nil then DebugLn('[DeliverMessage] Target = nil');
-  {$IFDEF VerboseDeliverMessage}
-  DebugLn('DeliverMessage ',DbgS(Target),
+  {.$IFDEF VerboseDeliverMessage}
+  if TLMessage(AMessage).Msg<>LM_MOUSEMOVE then
+    DebugLn('DeliverMessage ',DbgS(Target),
     ' ',TComponent(Target).Name,':',TObject(Target).ClassName,
     ' Message=',GetMessageName(TLMessage(AMessage).Msg));
-  {$ENDIF}
+  {.$ENDIF}
   if (TLMessage(AMessage).Msg=LM_PAINT)
   or (TLMessage(AMessage).Msg=LM_INTERNALPAINT)
   or (TLMessage(AMessage).Msg=LM_GtkPaint) then
@@ -4415,15 +4417,16 @@
   if OldMouseCaptureWidget<>CurMouseCaptureWidget then begin
     // the mouse grab changed
     // -> this means the gtk itself has changed the mouse grab
-    {$IFDEF VerboseMouseCapture}
+    {.$IFDEF VerboseMouseCapture}
     DebugLn('UpdateMouseCaptureControl Capture changed from ',
       '[',GetWidgetDebugReport(OldMouseCaptureWidget),']',
       ' to [',GetWidgetDebugReport(CurMouseCaptureWidget),']');
-    {$ENDIF}
+    {.$ENDIF}
 
     // notify the new capture control
     MouseCaptureWidget:=CurMouseCaptureWidget;
     MouseCaptureType:=mctGTK;
+    exit;
     if MouseCaptureWidget<>nil then begin
       // the MouseCaptureWidget is probably not a main widget
       SendMessage(HWnd(MouseCaptureWidget), LM_CAPTURECHANGED, 0,
@@ -4445,9 +4448,9 @@
   CaptureWidget: PGtkWidget;
   NowIndex: Cardinal;
 begin
-  {$IFDEF VerboseMouseCapture}
+  {.$IFDEF VerboseMouseCapture}
   DebugLn('CaptureMouseForWidget START ',GetWidgetDebugReport(Widget));
-  {$ENDIF}
+  {.$ENDIF}
   if not (Owner in [mctGTKIntf,mctLCL]) then exit;
   // not every widget can capture the mouse
   CaptureWidget:=GetDefaultMouseCaptureWidget(Widget);
Index: interfaces/gtk/gtklistsl.inc
===================================================================
--- interfaces/gtk/gtklistsl.inc        (wersja 8956)
+++ interfaces/gtk/gtklistsl.inc        (kopia robocza)
@@ -19,6 +19,8 @@
  *****************************************************************************
 }
 
+{.$DEFINE EventTrace}
+
 const
   GtkListItemGtkListTag = 'GtkList';
   GtkListItemLCLListTag = 'LCLList';
@@ -209,6 +211,9 @@
   //ItemIndex: LongInt;
   Mess: TLMessage;
 begin
+  {$IFDEF EventTrace}
+  Debugln('gtkListItemSelectAfterCB');
+  {$ENDIF}
   // get context
   
GtkList:=PGtkList(gtk_object_get_data(PGtkObject(Data),GtkListItemGtkListTag));
   if GtkList=nil then
@@ -317,6 +322,9 @@
   ListItem: PGtkListItem;
 begin
   UpdateItemCache;
+  {$IFDEF EventTrace}
+  Debugln( 'connect ',strings[index]);
+  {$ENDIF}
   ListItem:=FCachedItems[Index];
   ConnectItemCallbacks(ListItem);
 end;
@@ -329,6 +337,9 @@
 var
   ChildWidget: Pointer;
 begin
+  {$IFDEF EventTrace}
+   Debugln('connect itemCallback');
+  {$ENDIF}
   gtk_object_set_data(PGtkObject(li),GtkListItemLCLListTag,Self);
   gtk_object_set_data(PGtkObject(li),GtkListItemGtkListTag,FGtkList);
   //DebugLn('TGtkListStringList.ConnectItemCallbacks Self=',DbgS(Self),
@@ -348,10 +359,6 @@
     g_signal_connect_after(G_OBJECT(ChildWidget), 'toggled',
                            G_CALLBACK(@gtkListItemToggledCB), li);
   end;
-  if FOwner is TCustomComboBox then begin
-    gtk_signal_connect_after(PGtkObject(li), 'select',
-                           TGTKSignalFunc(@gtkListItemSelectAfterCB),li);
-  end;
 end;
 
 {------------------------------------------------------------------------------
@@ -366,6 +373,9 @@
   i := FCachedCount - 1;
   while i >= 0 do
   begin
+    {$IFDEF EventTrace}
+    DebugLn('connect ',strings[i]);
+    {$ENDIF}
     ConnectItemCallbacks(FCachedItems[i]);
     Dec(i);
   end;
@@ -401,11 +411,6 @@
     gtk_signal_disconnect_by_func(
       PGtkObject(ChildWidget), TGTKSignalFunc(@gtkListItemToggledCB), AItem);
   end;
-  if FOwner is TCustomComboBox
-  then begin
-    gtk_signal_disconnect_by_func(
-      PGtkObject(AItem), TGTKSignalFunc(@gtkListItemSelectAfterCB), AItem);
-  end;
 end;
 
 {------------------------------------------------------------------------------
@@ -887,6 +892,9 @@
     {$IFDEF DebugLCLComponents}
     DebugGtkWidgets.MarkCreated(li,dbgsName(Owner)+' Index='+dbgs(Index)+' 
Count='+dbgs(Count));
     {$ENDIF}
+    {$IFDEF EventTrace}
+    Debugln('insertListItem',s);
+    {$ENDIF}
     ConnectItemCallbacks(PGtkListItem(li));
     // grow capacity
     UpdateItemCache;
Index: interfaces/gtk/gtkwinapi.inc
===================================================================
--- interfaces/gtk/gtkwinapi.inc        (wersja 8956)
+++ interfaces/gtk/gtkwinapi.inc        (kopia robocza)
@@ -2795,13 +2795,13 @@
       end;
       Self.WordWrap(DC, Str, MaxLength, Lines, NumLines);
 
-      LineWidth := 0;
-      If (Lines <> nil) then begin
+      If (Lines <> nil) and ((NumLines>1) or ((Flags and DT_WordBreak) 
=DT_WordBreak)) then begin
+        LineWidth := 0;
         For J := 0 to NumLines - 1 do begin
           GetTextExtentPoint(DC, Lines[J], StrLen(Lines[J]), AP);
           LineWidth := Max(LineWidth, AP.cX);
         end;
-      end;
+      end else lineWidth:=MaxLength;
       LineWidth := Min(MaxLength, LineWidth);
 
       theRect.Right := theRect.Left + LineWidth;
@@ -7982,6 +7982,7 @@
     {$ENDIF}
     if AMessage.Msg=LM_GtkPAINT then begin
       OldGtkPaintMsg:=TLMGtkPaint(AMessage);
+      
       GtkPaintData:=OldGtkPaintMsg.Data;
       // convert LM_GtkPAINT to LM_PAINT
       AMessage := TLMessage(GtkPaintMessageToPaintMessage(
Index: interfaces/gtk/gtkcallback.inc
===================================================================
--- interfaces/gtk/gtkcallback.inc      (wersja 8956)
+++ interfaces/gtk/gtkcallback.inc      (kopia robocza)
@@ -19,7 +19,13 @@
 //  {$DEFINE ASSERT_IS_ON}
 {$ENDIF}
 
+{$IFDEF RELEASE}
+
 {$DEFINE ASSERT_IS_ON}
+{$ELSE}
+{$DEFINE EventTrace}
+{.$DEFINE VerboseMouseBugfix}
+{$ENDIF}
 
 function DeliverPaintMessage(const Target: Pointer; var TheMessage): GBoolean;
 var
@@ -133,7 +139,9 @@
 begin
   Result := CallBackDefaultReturn;
 
+  {$IFDEF EventTrace}
   EventTrace('realize', nil);
+  {$ENDIF}
 
   if (Data<>nil) then begin
     if TObject(Data) is TCustomForm then begin
@@ -182,7 +190,9 @@
   Result := CallBackDefaultReturn;
 
   if Data=nil then ;
+  {$IFDEF EventTrace}
   EventTrace('realizeafter', nil);
+  {$ENDIF}
 
   HiddenLCLObject:=GetHiddenLCLObject(Widget);
   if HiddenLCLObject=nil then begin
@@ -255,7 +265,9 @@
 begin
   Result := True;
 
+  {$IFDEF EventTrace}
   EventTrace('show', data);
+  {$ENDIF}
   if Widget=nil then ;
   FillChar(Mess,SizeOf(Mess),0);
   Mess.Msg := LM_SHOWWINDOW;
@@ -270,7 +282,9 @@
 begin
   Result := True;
 
+  {$IFDEF EventTrace}
   EventTrace('hide', data);
+  {$ENDIF}
   if Widget=nil then ;
   FillChar(Mess,SizeOf(Mess),0);
   Mess.Msg := LM_SHOWWINDOW;
@@ -283,7 +297,9 @@
   Mess: TLMActivate;
 begin
   Result:= True;
+  {$IFDEF EventTrace}
   EventTrace('activate', data);
+  {$ENDIF}
 
   if LockOnChange(PgtkObject(Widget),0) > 0 then Exit;
 
@@ -307,8 +323,9 @@
   LCLMenuItem: TMenuItem;
 begin
   Result := CallBackDefaultReturn;
-
+  {$IFDEF EventTrace}
   EventTrace('toggled', AData);
+  {$ENDIF}
 
   LCLMenuItem := TMenuItem(AData);
   // some sanity checks
@@ -332,8 +349,9 @@
 begin
   if ComponentIsDestroyingHandle(TWinControl(Data))
   or (LockOnChange(PgtkObject(Widget),0)>0) then exit;
+  {$IFDEF EventTrace}
   EventTrace('changed', data);
-
+  {$ENDIF}
   Mess.Msg := LM_CHANGED;
   DeliverMessage(Data, Mess);
 
@@ -347,7 +365,9 @@
   Result := CallBackDefaultReturn;
 
   if LockOnChange(PgtkObject(Widget),0)>0 then exit;
+  {$IFDEF EventTrace}
   EventTrace('changed_editbox', data);
+  {$ENDIF}
 
   Mess.Msg := CM_TEXTCHANGED;
   DeliverMessage(Data, Mess);
@@ -375,7 +395,9 @@
 begin
   //DebugLn('gtktoggledCB ',DbgSName(TObject(Data)));
   Result := CallBackDefaultReturn;
+  {$IFDEF EventTrace}
   EventTrace('toggled', data);
+  {$ENDIF}
   if LockOnChange(PgtkObject(Widget),0) > 0 then Exit;
 
   if GtkWidgetIsA(Widget,gtk_toggle_button_get_type) then begin
@@ -395,7 +417,9 @@
   DesignOnlySignal: boolean;
 begin
   Result := CallBackDefaultReturn;
+  {$IFDEF EventTrace}
   EventTrace('DrawAfter', data);
+  {$ENDIF}
 
   if not (csDesigning in TComponent(Data).ComponentState) then begin
     DesignOnlySignal:=GetDesignOnlySignalFlag(Widget,dstDrawAfter);
@@ -420,7 +444,10 @@
   DesignOnlySignal: boolean;
 begin
   Result := CallBackDefaultReturn;
+  {$IFDEF EventTrace}
   EventTrace('ExposeAfter', data);
+  {$ENDIF}
+  exit;
   if (Event^.Count > 0) then exit;
 
   if not (csDesigning in TComponent(Data).ComponentState) then begin
@@ -431,7 +458,7 @@
     DebugLn('gtkExposeAfter',
       ' Widget=',DbgS(Widget),'=',GetWidgetClassName(Widget),
       ' ',TComponent(Data).Name,
-      ' 
',Event^.area.x,',',Event^.area.y,',',Event^.area.width,',',Event^.area.height,
+      ' 
',dbgs(Event^.area.x),',',dbgs(Event^.area.y),',',dbgs(Event^.area.width),',',dbgs(Event^.area.height),
       '');
     {$ENDIF}
   end;
@@ -450,7 +477,9 @@
   CurFocusWidget: PGtkWidget;
 {$ENDIF}
 begin
+  {$IFDEF EventTrace}
   EventTrace('activate after', data);
+  {$ENDIF}
   if (Widget=nil) or (Event=nil) then ;
   FillChar(Mess,SizeOf(Mess),#0);
   {$IFDEF VerboseFocus}
@@ -504,7 +533,9 @@
   LCLObject: TControl;
 {$ENDIF}
 begin
+  {$IFDEF EventTrace}
   EventTrace('deactivate after', data);
+  {$ENDIF}
   if (Widget=nil) or (Event=nil) then ;
   {$IFDEF VerboseFocus}
   write('gtkfrmdeactivate Widget=',DbgS(Widget),' ',Event^.theIn,
@@ -629,12 +660,10 @@
   {$ENDIF}
 
   UpdateMouseCaptureControl;
-
   //TODO: fill in old focus
   FillChar(Mess,SizeOf(Mess),0);
   Mess.msg := LM_SETFOCUS;
   DeliverMessage(Data,  Mess);
-
   Result:=true;
 end;
 
@@ -646,7 +675,7 @@
   CurFocusWidget: PGtkWidget;
 {$ENDIF}
 begin
-  EventTrace('killfocus', data);
+  EventTrace('killfocusCB', data);
   if (Widget=nil) or (Event=nil) then ;
   {$IFDEF VerboseFocus}
   write('GTKillFocusCB Widget=',DbgS(Widget),' Event^.theIn=',Event^.theIn);
@@ -691,7 +720,8 @@
 {$ENDIF}
 begin
   if (Widget=nil) or (Event=nil) then ;
-  EventTrace('killfocus', data);
+  EventTrace('killfocusCBAfter', data);
+
   {$IFDEF VerboseFocus}
   write('GTKillFocusCBAfter Widget=',DbgS(Widget),' 
Event^.theIn=',Event^.theIn);
   LCLObject:=TObject(data);
@@ -726,8 +756,10 @@
 
   FillChar(Mess,SizeOf(Mess),0);
   Mess.msg := LM_KILLFOCUS;
+
   //TODO: fill in new focus
   Assert(False, Format('Trace:TODO: [gtkkillfocusCB] %s  finish', 
[TObject(Data).ClassName]));
+  
   DeliverMessage(Data,  Mess);
 
   Result:=true;
@@ -757,7 +789,9 @@
     exit;
   end;
 
-  EventTrace('destroy', data);
+  {$IFDEF EventTrace}
+  EventTrace('destroyCB', data);
+  {$ENDIF}
   //DebugLn('gtkdestroyCB Data="',DbgSName(TObject(Data)),'" 
LCLObject="',DbgSName(Info^.LCLObject),'" ',GetWidgetDebugReport(Widget));
   FillChar(Mess,SizeOf(Mess),0);
   Mess.msg := LM_DESTROY;
@@ -786,7 +820,9 @@
 begin
   Result := CallBackDefaultReturn;
   if (Widget=nil) then ;
+  {$IFDEF EventTrace}
   EventTrace('resize', data);
+  {$ENDIF}
 //   Mess.msg := LM_RESIZE;
 //   TControl(data).WindowProc(TLMessage(Mess));
   Assert(False, 'Trace:TODO: [gtkresizeCB] fix (or remove) to new LM_SIZE');
@@ -799,7 +835,9 @@
 begin
   Result := CallBackDefaultReturn;
   if (Widget=nil) then ;
+  {$IFDEF EventTrace}
   EventTrace('month changed', data);
+  {$ENDIF}
   FillChar(Mess,SizeOf(Mess),0);
   Mess.Msg := LM_MONTHCHANGED;
   DeliverPostMessage(Data, Mess);
@@ -1281,7 +1319,9 @@
   //if GetFixedWidget(Widget)<>nil then
   //  DebugLn('DDD2 
ClientWindow=',DbgS(PGtkWidget(GetFixedWidget(Widget))^.Window));
 
+  {$IFDEF EventTrace}
   EventTrace('Mouse button Press', data);
+  {$ENDIF}
 
   UpdateMouseCaptureControl;
 
@@ -3049,7 +3089,9 @@
   Data: Pointer); cdecl;
 begin
   if (Widget=nil) or (Data=nil) or (previous_style=nil) then ;
+  {$IFDEF EventTrace}
   EventTrace('style-set', nil);
+  {$ENDIF}
   //ReleaseAllStyles;
 end;
 
@@ -3058,15 +3100,28 @@
 var
   Mess: TLMessage;
 begin
-  //debugln('gtkListBoxSelectionChangedAfter ',GetWidgetDebugReport(Widget));
   Result := CallBackDefaultReturn;
-
+  {$IFDEF EventTrace}
   EventTrace('gtkListBoxSelectionChangedAfter', data);
+  {$ENDIF}
   FillChar(Mess,SizeOf(Mess),0);
   Mess.msg := LM_SelChange;
   DeliverMessage(Data, Mess);
 end;
 
+function gtkListSelectChild(widget: PGtkWidget;child : PGtkWidget; data: 
gPointer
+  ): GBoolean; cdecl;
+var
+  Mess: TLMessage;
+begin
+  Result := CallBackDefaultReturn;
+  {$IFDEF EventTrace}
+  EventTrace('gtkListBoxSelectChild', data);
+  {$ENDIF}
+  FillChar(Mess,SizeOf(Mess),0);
+  Mess.msg := LM_SelChange;
+  DeliverMessage(Data, Mess);
+end;
 
 {$I gtkDragCallback.inc}
 {$I gtkListViewCallback.inc}
Index: interfaces/gtk/gtkobject.inc
===================================================================
--- interfaces/gtk/gtkobject.inc        (wersja 8956)
+++ interfaces/gtk/gtkobject.inc        (kopia robocza)
@@ -23,6 +23,7 @@
 //  {$C+}
 //  {$DEFINE ASSERT_IS_ON}
 {$ENDIF}
+{.$DEFINE VerboseSizeMsg}
 
 {------------------------------------------------------------------------------
   Procedure: GLogFunc
@@ -1298,7 +1299,6 @@
 begin
   Caption := ACaption;
   LabelFromAmpersands(Caption, Pattern, AccelKey);
-
   gtk_label_set_text(ALabel, PChar(Caption));
 
   {$ifdef gtk1}
@@ -3985,7 +3985,10 @@
       if ALCLObject is TCustomListBox then begin
         ConnectSenderSignalAfter(PgtkObject(gCore),
           'selection_changed', @gtkListBoxSelectionChangedAfter);
-      end;
+      end else   if ALCLObject is TCustomCombobox then
+         ConnectSenderSignal (PGtkObject(
+                   PGtkCombo(gObject)^.list), 'unselect_child', 
@gtkListSelectChild)
+       else
     end;
 
 (*
@@ -4228,6 +4231,7 @@
       Begin
         SetCallback(LM_CHANGED, AGTKObject, ALCLObject);
         SetCallback(LM_COMMAND, AGTKObject, ALCLObject);
+        SetCallback(LM_SELCHANGE, AGTKObject, ALCLObject);
       End;
 
       csListBox:
@@ -6962,12 +6966,14 @@
 
   function FindLineEnd(LineStart: integer): integer;
   var
+    LineStop,
     LineWidth, WordWidth, WordEnd, CharWidth: integer;
   begin
     // first search line break or text break
     Result:=LineStart;
     while not (AText[Result] in [#0,#10,#13]) do inc(Result);
     if Result<=LineStart+1 then exit;
+    lineStop:=Result;
 
     // get current line width in pixel
     LineWidth:=GetLineWidthInPixel(LineStart,Result-LineStart);
@@ -6996,6 +7002,7 @@
           CharWidth:=GetLineWidthInPixel(Result,1);
           inc(LineWidth,CharWidth);
           if LineWidth>MaxWidthInPixel then break;
+          if result=lineStop then break;
           inc(Result);
         until false;
         // at least one char
Index: interfaces/gtk/gtkproc.pp
===================================================================
--- interfaces/gtk/gtkproc.pp   (wersja 8956)
+++ interfaces/gtk/gtkproc.pp   (kopia robocza)
@@ -280,6 +280,8 @@
 function gtkListBoxSelectionChangedAfter(widget: PGtkWidget;
                                       data: gPointer): GBoolean; cdecl;
 
+function gtkListSelectChild(widget: PGtkWidget;child : PGtkWidget;
+                                      data: gPointer): GBoolean; cdecl;
 
 // gtkDragCallback.inc headers
 Function edit_drag_data_received(widget: pgtkWidget;
Index: lmessages.pp
===================================================================
--- lmessages.pp        (wersja 8956)
+++ lmessages.pp        (kopia robocza)
@@ -773,6 +773,22 @@
   // RECEIVED from the interface, here are no defines
   // of messages send to the interface
   //-------------
+  
+  LM_ACTIVATE        : Result:='LM_ACTIVATE';
+  LM_SETFOCUS        : Result:='LM_SETFOCUS';
+  LM_KILLFOCUS       : Result:='LM_KILLFOCUS';
+  LM_SHOWWINDOW      : Result:='LM_SHOWWINDOW';
+  LM_SIZE            : Result:='LM_SIZE';
+  LM_MOVE            : Result:='LM_MOVE';
+
+//  LM_MOUSEFIRST      : Result:='LM_MOUSEFIRST';
+  LM_MOUSEMOVE       : Result:='LM_MOUSEMOVE';
+  LM_LBUTTONDOWN     : Result:='LM_LBUTTONDOWN';
+  LM_LBUTTONUP       : Result:='LM_LBUTTONUP';
+  LM_CAPTURECHANGED  : Result:='LM_CAPTURECHANGED';
+  LM_SELCHANGE       : Result:='LM_SELCHANGE';
+
+
   LM_USER           :Result:='LM_USER';
   //WM_USER           :Result:='';
   LM_DESTROY        :Result:='LM_DESTROY';
Index: include/speedbutton.inc
===================================================================
--- include/speedbutton.inc     (wersja 8956)
+++ include/speedbutton.inc     (kopia robocza)
@@ -365,6 +365,7 @@
  
------------------------------------------------------------------------------}
 procedure TCustomSpeedButton.Paint;
 var
+  fRect,
   PaintRect: TRect;
   GlyphWidth, GlyphHeight: Integer;
   Offset, OffsetCap: TPoint;
@@ -372,6 +373,7 @@
   //BrushStyle : TBrushStyle;
   M, S : integer;
   TXTStyle : TTextStyle;
+  Flags,
   SIndex : Longint;
   TMP : String;
   //xBevel :  tBevelCut;
@@ -424,8 +426,22 @@
 
   if Caption <> '' then begin
     TMP := Caption;
+    TXTStyle := Canvas.TextStyle;
+    TXTStyle.Opaque := False;
+    TXTStyle.Clipping := True;
+    TXTStyle.ShowPrefix := True;
+    TXTStyle.Alignment := taLeftJustify;
+    TXTStyle.Layout := tlTop;
+    TXTStyle.SystemFont := Canvas.Font.IsDefault;//Match System Default Style
     SIndex := DeleteAmpersands(TMP);
-    TextSize:= Canvas.TextExtent(TMP);
+    fRect:=PaintRect;
+    Flags:=DT_CalcRect;
+    if not TXTStyle.SingleLine then inc(Flags,DT_WordBreak)
+                else inc(Flags,DT_SingleLine);
+
+    DrawText(canvas.Handle,pChar(TMP),Length(TMP),fRect,flags);
+    TextSize.cy:=fRect.bottom-fRect.top;
+    TextSize.cx:=fRect.right-fRect.left;
     If SIndex > 0 then
       If SIndex <= Length(TMP) then begin
         FShortcut := Ord(TMP[SIndex]);
@@ -485,31 +501,25 @@
       Offset.X:= ClientSize.cx - M - GlyphWidth;
       Offset.Y:= (ClientSize.cy - GlyphHeight + 1) div 2;
       OffsetCap.X:= Offset.X - S - TextSize.cx;
-      OffsetCap.Y:= (ClientSize.cy - TextSize.cy) div 2;
+      OffsetCap.Y:= (ClientSize.cy -TextSize.cy) div 2;
     end;
     blGlyphTop : begin
       Offset.X:= (ClientSize.cx - GlyphWidth + 1) div 2;
       Offset.Y:= M;
-      OffsetCap.X:= (ClientSize.cx - TextSize.cx + 1) div 2;
+      OffsetCap.X:= (ClientSize.cx  + 1) div 2;
       OffsetCap.Y:= Offset.Y + GlyphHeight + S;
     end;
     blGlyphBottom : begin
       Offset.X:= (ClientSize.cx - GlyphWidth + 1) div 2;
       Offset.Y:= ClientSize.cy - M - GlyphHeight;
-      OffsetCap.X:= (ClientSize.cx - TextSize.cx + 1) div 2;
-      OffsetCap.Y:= Offset.Y - S - TextSize.cy;
+      OffsetCap.X:= (ClientSize.cx + 1) div 2;
+      OffsetCap.Y:= Offset.Y - S ;
     end;
   end;
 
   FGlyph.Draw(Canvas, PaintRect, Offset, FState, Transparent, 0);
   if Caption <> '' then begin
-    TXTStyle := Canvas.TextStyle;
-    TXTStyle.Opaque := False;
-    TXTStyle.Clipping := True;
-    TXTStyle.ShowPrefix := True;
-    TXTStyle.Alignment := taLeftJustify;
-    TXTStyle.Layout := tlTop;
-    TXTStyle.SystemFont := Canvas.Font.IsDefault;//Match System Default Style
+
     With PaintRect, OffsetCap do begin
       Left := Left + X;
       Top := Top + Y;

Reply via email to