1
{%MainUnit customdrawnint.pp}
2
{******************************************************************************
3
All CustomDrawn Android specific Winapi implementations.
5
!! Keep alphabetical !!
8
******************************************************************************
10
******************************************************************************
12
*****************************************************************************
14
* This file is part of the Lazarus Component Library (LCL) *
16
* See the file COPYING.modifiedLGPL.txt, included in this distribution, *
17
* for details about the copyright. *
19
* This program is distributed in the hope that it will be useful, *
20
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
21
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
23
*****************************************************************************
26
//##apiwiz##sps## // Do not remove, no wizard declaration before this line
28
{------------------------------------------------------------------------------
30
Params: DC: HDC; Left,Top,Right,Bottom,angle1,angle2 : Integer
32
------------------------------------------------------------------------------}
33
function TQtWidgetSet.Arc(DC: HDC; Left,Top,Right,Bottom,angle1,angle2 : Integer): Boolean;
37
{$ifdef VerboseQtWinAPI}
38
WriteLn('[WinAPI Arc] DC: ', dbghex(DC));
40
Result := IsValidDC(DC);
44
R := Rect(Left, Top, Right, Bottom);
45
QPainter_drawArc(TQtDeviceContext(DC).Widget, @R, Angle1, Angle2);
49
{------------------------------------------------------------------------------
51
Params: DC: HDC; x1, y1, x2, y2, angle1, angle2: Integer
53
------------------------------------------------------------------------------}
54
function TQtWidgetSet.AngleChord(DC: HDC; x1, y1, x2, y2, angle1, angle2: Integer): Boolean;
56
{$ifdef VerboseQtWinAPI}
57
WriteLn('[WinAPI AngleChord] DC: ', dbghex(DC));
59
Result := IsValidDC(DC);
61
QPainter_drawChord(TQtDeviceContext(DC).Widget, x1, y1, x2, y2, Angle1, Angle2);
64
{------------------------------------------------------------------------------
69
This function is Called:
70
- Once on every OnPaint event
71
------------------------------------------------------------------------------}
72
function TCDWidgetSet.BeginPaint(Handle: hWnd; Var PS : TPaintStruct): hdc;
74
{$ifdef VerboseWinAPI}
75
DebugLn('Trace:> [WinAPI BeginPaint] Handle=', dbghex(Handle));
79
if Handle = 0 then Exit;
81
(* Widget := TQtWidget(Handle);
83
DC := TQtDeviceContext.Create(Widget.PaintData.PaintWidget, True)
85
DC := TQtDeviceContext.Create(nil, True);
91
// if current handle has paintdata information,
93
//DC.DebugClipRect('BeginPaint: Before');
94
if Widget.PaintData.ClipRegion <> nil then
96
//Write('>>> Setting Paint ClipRegion: ');
97
//DebugRegion('PaintData.ClipRegion: ', Widget.PaintData.ClipRegion);
98
DC.setClipRegion(Widget.PaintData.ClipRegion);
101
if Widget.PaintData.ClipRect <> nil then
104
DC.vClipRect^ := Widget.PaintData.ClipRect^;
110
{$ifdef VerboseQtWinAPI}
111
WriteLn('Trace:< [WinAPI BeginPaint] Result=', dbghex(Result));
115
function TQtWidgetSet.BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Rop: DWORD): Boolean;
117
{$ifdef VerboseQtWinAPI}
118
WriteLn('Trace:> [TQtWidgetSet.BitBlt]');
121
Result := StretchBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, Width,
124
{$ifdef VerboseQtWinAPI}
125
WriteLn('Trace:< [TQtWidgetSet.BitBlt]');
129
function TQtWidgetSet.CallNextHookEx(hHk: HHOOK; ncode : Integer; wParam: WParam; lParam : LParam) : Integer;
131
{$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION}
132
WriteLn('***** [WinAPI TQtWidgetSet.CallNextHookEx] missing implementation ');
137
function TQtWidgetSet.CallWindowProc(lpPrevWndFunc : TFarProc; Handle : HWND; Msg : UINT; wParam: WParam; lParam : lParam) : Integer;
139
{$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION}
140
WriteLn('***** [WinAPI TQtWidgetSet.CallWindowProc] missing implementation ');
145
{------------------------------------------------------------------------------
146
Method: ClientToScreen
149
------------------------------------------------------------------------------}
150
function TQtWidgetSet.ClientToScreen(Handle: HWND; var P: TPoint) : Boolean;
155
Result := IsValidHandle(Handle);
158
APoint := QtPoint(P.X, P.Y);
160
QWidget_mapToGlobal(TQtWidget(Handle).GetContainerWidget, @APoint, @APoint);
161
if TQtWidget(Handle).ChildOfComplexWidget = ccwScrollingWinControl then
163
Pt := TQtCustomControl(Handle).viewport.ScrolledOffset;
167
P := Point(APoint.x, APoint.y);
172
function TQtWidgetSet.ClipboardFormatToMimeType(FormatID: TClipboardFormat): string;
174
Result := Clipboard.FormatToMimeType(FormatID);
177
function TQtWidgetSet.ClipboardGetData(ClipboardType: TClipboardType;
178
FormatID: TClipboardFormat; Stream: TStream): boolean;
180
Result := Clipboard.Getdata(ClipboardType, FormatID, Stream);
183
function TQtWidgetSet.ClipboardGetFormats(ClipboardType: TClipboardType;
184
var Count: integer; var List: PClipboardFormat): boolean;
186
Result := Clipboard.GetFormats(ClipboardType, Count, List);
189
function TQtWidgetSet.ClipboardGetOwnerShip(ClipboardType: TClipboardType;
190
OnRequestProc: TClipboardRequestEvent; FormatCount: integer;
191
Formats: PClipboardFormat): boolean;
193
Result := Clipboard.GetOwnerShip(ClipboardType, OnRequestProc, FormatCount, Formats);
196
function TQtWidgetSet.ClipboardRegisterFormat(const AMimeType: string): TClipboardFormat;
198
Result := Clipboard.RegisterFormat(AMimeType);
202
{------------------------------------------------------------------------------
204
Params: Dest, Src1, Src2, fnCombineMode
207
Combine the 2 Source Regions into the Destination Region using the specified
208
Combine Mode. The Destination must already be initialized. The Return value
209
is the Destination's Region type, or ERROR.
211
The Combine Mode can be one of the following:
212
RGN_AND : Gets a region of all points which are in both source regions
214
RGN_COPY : Gets an exact copy of the first source region
216
RGN_DIFF : Gets a region of all points which are in the first source
217
region but not in the second.(Source1 - Source2)
219
RGN_OR : Gets a region of all points which are in either the first
220
source region or in the second.(Source1 + Source2)
222
RGN_XOR : Gets all points which are in either the first Source Region
223
or in the second, but not in both.
225
The result can be one of the following constants
231
------------------------------------------------------------------------------}
232
function TQtWidgetSet.CombineRgn(Dest, Src1, Src2: HRGN; fnCombineMode: Longint): Longint;
234
RDest,RSrc1,RSrc2: QRegionH;
238
if not IsValidGDIObject(Dest) or not IsValidGDIObject(Src1) then
242
RDest := TQtRegion(Dest).FHandle;
243
RSrc1 := TQtRegion(Src1).FHandle;
246
if (fnCombineMode<>RGN_COPY) and not IsValidGDIObject(Src2) then
249
RSrc2 := TQtRegion(Src2).FHandle;
251
case fnCombineMode of
253
QRegion_intersected(RSrc1, RDest, RSrc2);
256
// union of Src1 with a null region
257
RSrc2 := QRegion_create;
258
QRegion_united(RSrc1, RDest, RSrc2);
259
QRegion_destroy(RSrc2);
262
QRegion_subtracted(RSrc1, RDest, RSrc2);
264
QRegion_united(RSrc1, RDest, RSrc2);
266
QRegion_xored(RSrc1, RDest, RSrc2);
269
if QRegion_isEmpty(RDest) then
273
if TQtRegion(Dest).IsPolyRegion or (TQtRegion(Dest).numRects > 0) then
274
Result := COMPLEXREGION
276
Result := SIMPLEREGION;
280
{------------------------------------------------------------------------------
281
Method: TQtWidgetSet.CreateCompatibleBitmap
282
Params: HDC, Width & Height
285
------------------------------------------------------------------------------}
286
function TQtWidgetSet.CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBITMAP;
288
QtDC: TQtDeviceContext;
289
Format: QImageFormat = QImageFormat_ARGB32;
290
ADevice: QPaintDeviceH = nil;
291
ADesktop: QDesktopWidgetH = nil;
293
{$ifdef VerboseQtWinAPI}
294
WriteLn('Trace:> [WinAPI CreateCompatibleBitmap]',
296
' Width:', dbgs(Width),
297
' Height:', dbgs(Height));
300
if IsValidDC(DC) then
302
QtDC := TQtDeviceContext(DC);
303
case QtDC.getDepth of
304
1: Format := QImageFormat_Mono;
305
15, 16: Format := QImageFormat_RGB16;
306
24: Format := QImageFormat_RGB32;
307
32: Format := QImageFormat_ARGB32;
311
ADesktop := QApplication_desktop();
312
if ADesktop <> nil then
313
ADevice := QWidget_to_QPaintDevice(ADesktop);
314
if ADevice <> nil then
316
case QPaintDevice_depth(ADevice) of
317
1: Format := QImageFormat_Mono;
318
15, 16: Format := QImageFormat_RGB16;
319
24: Format := QImageFormat_RGB32;
320
32: Format := QImageFormat_ARGB32;
324
Result := HBitmap(TQtImage.Create(nil, Width, Height, Format));
325
{$ifdef VerboseQtWinAPI}
326
WriteLn('Trace:< [WinAPI CreateCompatibleBitmap] Bitmap:', dbghex(Result));
330
{------------------------------------------------------------------------------
331
Method: TQtWidgetSet.CreateBitmap
335
This functions is for TBitmap support.
336
Specifically it´s utilized on when a handle for a bitmap is needed
337
------------------------------------------------------------------------------}
338
function TQtWidgetSet.CreateBitmap(Width, Height: Integer;
339
Planes, BitCount: Longint; BitmapBits: Pointer): HBITMAP;
341
Format: QImageFormat;
343
NewBitsSize: PtrUInt;
344
ARowStride, RSS: Integer;
346
{$ifdef VerboseQtWinAPI}
347
WriteLn('Trace:> [WinAPI CreateBitmap]',
348
' Width:', dbgs(Width),
349
' Height:', dbgs(Height),
350
' Planes:', dbgs(Planes),
351
' BitCount:', dbgs(BitCount),
352
' BitmapBits: ', dbgs(BitmapBits));
355
// for win32 data is aligned to WORD
356
// for qt we must realign data to DWORD
359
1: Format := QImageFormat_Mono;
360
15, 16: Format := QImageFormat_RGB16;
361
24: Format := QImageFormat_RGB32;
362
32: Format := QImageFormat_ARGB32;
364
Format := QImageFormat_ARGB32;
367
RSS := GetBytesPerLine(Width, BitCount, rileWordBoundary);
368
if BitmapBits <> nil then
370
ARowStride := GetBytesPerLine(Width, BitCount, rileDWordBoundary);
371
if not CopyImageData(Width, Height, RSS, BitCount, BitmapBits, Rect(0, 0, Width, Height),
372
riloBottomToTop, riloBottomToTop, rileDWordBoundary, NewBits, NewBitsSize) then
374
// this was never tested
376
NewBits := AllocMem(RSS * Height);
377
Move(BitmapBits^, NewBits^, RSS * Height);
379
Result := HBitmap(TQtImage.Create(NewBits, Width, Height, ARowStride, Format, True));
382
Result := HBitmap(TQtImage.Create(nil, Width, Height, Format));
384
{$ifdef VerboseQtWinAPI}
385
WriteLn('Trace:< [WinAPI CreateBitmap] Bitmap:', dbghex(Result));
390
{------------------------------------------------------------------------------
391
Function: CreateBrushIndirect
394
------------------------------------------------------------------------------}
395
function TQtWidgetSet.CreateBrushIndirect(const LogBrush: TLogBrush): HBRUSH;
400
{$ifdef VerboseQtWinAPI}
401
WriteLn(Format('Trace:> [WinAPI CreateBrushIndirect] Style: %d, Color: %8x (%s)',
402
[LogBrush.lbStyle, LogBrush.lbColor, ColorToString(LogBrush.lbColor)]));
407
QtBrush := TQtBrush.Create(True);
410
case LogBrush.lbStyle of
411
BS_NULL: QtBrush.Style := QtNoBrush; // Same as BS_HOLLOW.
412
BS_SOLID: QtBrush.Style := QtSolidPattern;
414
BS_HATCHED: // Hatched brushes.
416
case LogBrush.lbHatch of
417
HS_BDIAGONAL: QtBrush.Style := QtBDiagPattern;
418
HS_CROSS: QtBrush.Style := QtCrossPattern;
419
HS_DIAGCROSS: QtBrush.Style := QtDiagCrossPattern;
420
HS_FDIAGONAL: QtBrush.Style := QtFDiagPattern;
421
HS_HORIZONTAL: QtBrush.Style := QtHorPattern;
422
HS_VERTICAL: QtBrush.Style := QtVerPattern;
424
QtBrush.Style := QtSolidPattern;
428
BS_DIBPATTERN, // A pattern brush defined by a device-independent
429
// bitmap (DIB) specification. If lbStyle is BS_DIBPATTERN, the
430
// lbHatch member contains a handle to a packed DIB.Windows 95:
431
// Creating brushes from bitmaps or DIBs larger than 8x8 pixels
432
// is not supported. If a larger bitmap is given, only a portion
433
// of the bitmap is used.
434
BS_DIBPATTERN8X8, // Same as BS_DIBPATTERN.
435
BS_DIBPATTERNPT, // A pattern brush defined by a device-independent
436
// bitmap (DIB) specification. If lbStyle is BS_DIBPATTERNPT, the
437
// lbHatch member contains a pointer to a packed DIB.
438
BS_PATTERN, // Pattern brush defined by a memory bitmap.
439
BS_PATTERN8X8: // Same as BS_PATTERN.
441
QtBrush.setTextureImage(TQtImage(LogBrush.lbHatch).FHandle);
442
QtBrush.Style := QtTexturePattern;
445
DebugLn(Format('Unsupported Style %d',[LogBrush.lbStyle]));
449
Other non-utilized Qt brushes:
457
QtLinearGradientPattern,
458
QtRadialGradientPattern,
459
QtConicalGradientPattern
463
Color := QBrush_Color(QtBrush.FHandle)^;
464
ColorRefToTQColor(ColorToRGB(TColor(logBrush.lbColor)), Color);
465
QtBrush.setColor(@Color);
466
Result := HBRUSH(QtBrush);
469
DebugLn('TQtWidgetSet.CreateBrushIndirect: Failed');
472
{$ifdef VerboseQtWinAPI}
473
WriteLn('Trace:< [WinAPI CreateBrushIndirect] Result: ', dbghex(Result));
477
function TQtWidgetSet.CreateCaret(Handle: HWND; Bitmap: hBitmap; Width, Height: Integer): Boolean;
479
Result := (Handle <> 0) and
480
QtCaret.CreateCaret(TQtWidget(Handle), Bitmap, Width, Height);
483
{------------------------------------------------------------------------------
484
Function: CreateCompatibleDC
485
Params: DC - handle to memory device context
486
Returns: handle to a memory device context
488
Creates a memory device context (DC) compatible with the specified device.
489
------------------------------------------------------------------------------}
490
function TCDWidgetSet.CreateCompatibleDC(DC: HDC): HDC;
492
{$ifdef VerboseWinAPI}
493
WriteLn('[WinAPI CreateCompatibleDC] DC: ', dbghex(DC));
495
Result := 0;//HDC(TQtDeviceContext.Create(nil, True));
498
{------------------------------------------------------------------------------
499
Function: CreateEllipticRgn
500
Params: p1 - X position of the top-left corner
501
p2 - Y position of the top-left corner
502
p3 - X position of the bottom-right corner
503
p4 - Y position of the bottom-right corner
505
------------------------------------------------------------------------------}
506
function TQtWidgetSet.CreateEllipticRgn(p1, p2, p3, p4: Integer): HRGN;
510
{$ifdef VerboseQtWinAPI}
511
WriteLn('[WinAPI CreateEllipticRgn] ');
513
QtRegion := TQtRegion.Create(True, p1, p2, p3, p4, QRegionEllipse);
514
Result := HRGN(QtRegion);
517
{------------------------------------------------------------------------------
518
Function: CreateFontIndirect
519
Params: const LogFont: TLogFont
522
Creates a font GDIObject.
523
------------------------------------------------------------------------------}
524
function TQtWidgetSet.CreateFontIndirect(const LogFont: TLogFont): HFONT;
526
Result := CreateFontIndirectEx(LogFont, '');
529
{------------------------------------------------------------------------------
530
Function: CreateFontIndirectEx
531
Params: const LogFont: TLogFont
534
Creates a font GDIObject.
535
------------------------------------------------------------------------------}
536
function TQtWidgetSet.CreateFontIndirectEx(const LogFont: TLogFont; const LongFontName: string): HFONT;
541
QStyleStategy: array [DEFAULT_QUALITY..CLEARTYPE_NATURAL_QUALITY] of QFontStyleStrategy = (
542
{ DEFAULT_QUALITY } QFontPreferDefault,
543
{ DRAFT_QUALITY } QFontPreferMatch,
544
{ PROOF_QUALITY } QFontPreferQuality,
545
{ NONANTIALIASED_QUALITY } QFontNoAntialias,
546
{ ANTIALIASED_QUALITY } QFontPreferAntialias,
547
{ CLEARTYPE_QUALITY } QFontPreferAntialias,
548
{ CLEARTYPE_NATURAL_QUALITY } QFontPreferAntialias
551
{$ifdef VerboseQtWinAPI}
552
WriteLn('[WinAPI CreateFontIndirectEx] FontName: ' + LongFontName);
557
QtFont := TQtFont.Create(True);
559
// -1 has different meaning - it means that font height was set using setPointSize
560
if LogFont.lfHeight <> -1 then
561
QtFont.setPixelSize(Abs(LogFont.lfHeight));
563
// Some values at available on Qt documentation at a table
564
// Others are guesses. The best would be to test different values for those
565
// See: http://doc.trolltech.com/4.1/qfont.html#Weight-enum
566
case LogFont.lfWeight of
567
FW_THIN : QtFont.setWeight(10);
568
FW_EXTRALIGHT : QtFont.setWeight(15);
569
FW_LIGHT : QtFont.setWeight(25);
570
FW_NORMAL : QtFont.setWeight(50);
571
FW_MEDIUM : QtFont.setWeight(55);
572
FW_SEMIBOLD : QtFont.setWeight(63);
573
FW_BOLD : QtFont.setWeight(75);
574
FW_EXTRABOLD : QtFont.setWeight(80);
575
FW_HEAVY : QtFont.setWeight(87);
578
QtFont.Angle := LogFont.lfEscapement;
580
//LogFont.lfOrientation;
582
QtFont.setItalic(LogFont.lfItalic = High(Byte));
583
QtFont.setUnderline(LogFont.lfUnderline = High(Byte));
584
QtFont.setStrikeOut(LogFont.lfStrikeOut = High(Byte));
586
FamilyName := StrPas(LogFont.lfFaceName);
588
if (CompareText(FamilyName, 'default') <> 0) then
589
QtFont.setFamily(FamilyName)
591
QtFont.setFamily(UTF16ToUTF8(GetDefaultAppFontName));
593
if (LogFont.lfQuality >= Low(QStyleStategy)) and (LogFont.lfQuality <= High(QStyleStategy)) then
594
QtFont.setStyleStrategy(QStyleStategy[LogFont.lfQuality]);
595
Result := HFONT(QtFont);
598
DebugLn('TQtWidgetSet.CreateFontIndirectEx: Failed');
602
function TQtWidgetSet.CreateIconIndirect(IconInfo: PIconInfo): HICON;
605
APixmap, ATemp: QPixmapH;
609
if IsValidGDIObject(IconInfo^.hbmColor) then
611
APixmap := QPixmap_create();
612
QPixmap_fromImage(APixmap, TQtImage(IconInfo^.hbmColor).FHandle);
613
if IconInfo^.hbmMask <> 0 then
615
ATemp := QPixmap_create();
616
QPixmap_fromImage(ATemp, TQtImage(IconInfo^.hbmMask).FHandle);
617
AMask := QBitmap_create(ATemp);
618
QPixmap_setMask(APixmap, AMask);
619
QPixmap_destroy(ATemp);
620
QBitmap_destroy(AMask);
622
if IconInfo^.fIcon then
624
AIcon := TQtIcon.Create;
625
AIcon.addPixmap(APixmap);
626
Result := HICON(AIcon);
628
Result := HCURSOR(TQtCursor.Create(APixmap, IconInfo^.xHotspot, IconInfo^.yHotspot));
629
QPixmap_destroy(APixmap);
633
{------------------------------------------------------------------------------
634
Function: CreatePatternBrush
637
------------------------------------------------------------------------------}
639
function TQtWidgetSet.CreatePatternBrush(ABitmap: HBITMAP): HBRUSH;
644
{$ifdef VerboseQtWinAPI}
645
WriteLn('[WinAPI CreatePatternBrush]',' Bitmap=', dbghex(ABitmap));
650
QtBrush := TQtBrush.Create(True);
651
Image := QImage_create(TQtImage(ABitmap).FHandle);
653
QtBrush.setTextureImage(Image);
655
QImage_destroy(Image);
658
Result := HBRUSH(QtBrush);
661
{------------------------------------------------------------------------------
662
Function: CreatePenIndirect
665
------------------------------------------------------------------------------}
667
function TQtWidgetSet.CreatePenIndirect(const LogPen: TLogPen): HPEN;
673
QtPen := TQtPen.Create(True);
676
case lopnStyle and PS_STYLE_MASK of
677
PS_SOLID: QtPen.setStyle(QtSolidLine);
678
PS_DASH: QtPen.setStyle(QtDashLine);
679
PS_DOT: QtPen.setStyle(QtDotLine);
680
PS_DASHDOT: QtPen.setStyle(QtDashDotLine);
681
PS_DASHDOTDOT: QtPen.setStyle(QtDashDotDotLine);
682
PS_NULL: QtPen.setStyle(QtNoPen);
684
QtPen.setStyle(QtSolidLine);
687
if lopnWidth.X <= 0 then
688
QtPen.setCosmetic(True)
691
QtPen.setCosmetic(False);
692
QtPen.setWidth(lopnWidth.X);
695
QPen_Color(QtPen.FHandle, @Color);
696
ColorRefToTQColor(ColorToRGB(TColor(lopnColor)), Color);
697
QPen_setColor(QtPen.FHandle, @Color);
700
Result := HPEN(QtPen);
703
{------------------------------------------------------------------------------
704
Function: CreatePolygonRgn
708
------------------------------------------------------------------------------}
709
function TQtWidgetSet.CreatePolygonRgn(Points: PPoint; NumPts: Integer; FillMode: integer): HRGN;
716
{$ifdef VerboseQtWinAPI}
717
WriteLn('Trace: [WinAPI CreatePolygonRgn] ');
719
GetMem(QtPoints, NumPts * SizeOf(TQtPoint));
720
for i := 0 to NumPts - 1 do
721
QtPoints[i] := QtPoint(Points[i].x, Points[i].y);
722
Poly := QPolygon_create(NumPts, PInteger(QtPoints));
725
{fillmode can be ALTERNATE or WINDING as msdn says}
726
if FillMode = ALTERNATE then
727
QtRegion := TQtRegion.Create(True, Poly, QtOddEvenFill)
729
QtRegion := TQtRegion.Create(True, Poly, QtWindingFill);
730
Result := HRGN(QtRegion);
732
QPolygon_destroy(Poly);
736
{------------------------------------------------------------------------------
737
Function: CreateRectRgn
742
------------------------------------------------------------------------------}
743
function TQtWidgetSet.CreateRectRgn(X1,Y1,X2,Y2 : Integer): HRGN;
747
QtRegion := TQtRegion.Create(True, X1, Y1, X2, Y2);
748
Result := HRGN(QtRegion);
749
{$ifdef VerboseQtWinAPI}
750
WriteLn('Trace: [WinAPI CreateRectRgn] Result: ', dbghex(Result),
751
' QRegionH: ', dbghex(PtrInt(QtRegion.Widget)));
755
{------------------------------------------------------------------------------
756
Procedure: DeleteCriticalSection
757
Params: var CritSection: TCriticalSection
759
------------------------------------------------------------------------------}
760
procedure TQtWidgetSet.DeleteCriticalSection(var CritSection: TCriticalSection);
762
ACritSec: System.PRTLCriticalSection;
764
ACritSec:=System.PRTLCriticalSection(CritSection);
765
System.DoneCriticalsection(ACritSec^);
770
{------------------------------------------------------------------------------
775
------------------------------------------------------------------------------}
776
function TQtWidgetSet.DeleteDC(hDC: HDC): Boolean;
778
{$ifdef VerboseQtWinAPI}
779
WriteLn('[WinAPI DeleteDC] Handle: ', dbghex(hDC));
783
if not IsValidDC(hDC) then exit;
785
TQtDeviceContext(hDC).Free;
788
{------------------------------------------------------------------------------
789
Function: DeleteObject
793
------------------------------------------------------------------------------}
794
function TQtWidgetSet.DeleteObject(GDIObject: HGDIOBJ): Boolean;
797
APaintEngine: QPaintEngineH;
799
{$ifdef VerboseQtWinAPI}
803
{$ifdef VerboseQtWinAPI}
804
WriteLn('Trace:> [WinAPI DeleteObject] GDIObject: ', dbghex(GDIObject));
805
ObjType := 'Unidentifyed';
810
if GDIObject = 0 then
813
if not IsValidGDIObject(GDIObject) then
816
aObject := TObject(GDIObject);
818
if (aObject is TQtResource) and TQtResource(aObject).FShared then
821
{------------------------------------------------------------------------------
823
------------------------------------------------------------------------------}
824
if aObject is TQtFont then
826
{$ifdef VerboseQtWinAPI}
830
{------------------------------------------------------------------------------
832
------------------------------------------------------------------------------}
833
else if aObject is TQtBrush then
835
{$ifdef VerboseQtWinAPI}
839
{------------------------------------------------------------------------------
841
------------------------------------------------------------------------------}
842
else if aObject is TQtImage then
844
{$ifdef VerboseQtWinAPI}
848
// we must stop paintdevice before destroying
850
APaintEngine := QImage_paintEngine(TQtImage(AObject).FHandle);
852
if (APaintEngine <> nil) and QPaintEngine_isActive(APaintEngine) then
854
APainter := QPaintEngine_painter(APaintEngine);
855
if APainter <> nil then
856
QPainter_end(APainter);
859
{------------------------------------------------------------------------------
861
------------------------------------------------------------------------------}
862
else if aObject is TQtRegion then
864
{$ifdef VerboseQtWinAPI}
869
{------------------------------------------------------------------------------
871
------------------------------------------------------------------------------}
872
else if aObject is TQtPen then
874
{$ifdef VerboseQtWinAPI}
879
if AObject is TQtResource then
880
if TQtResource(AObject).Owner <> nil then
882
// this is an owned (default) resource, let owner free it
883
DebugLn('WARNING: Trying to Free a default resource');
887
if AObject <> nil then
889
//WriteLn('Delete object: ', PtrUInt(AObject));
890
FreeThenNil(AObject);
895
{$ifdef VerboseQtWinAPI}
896
WriteLn('Trace:< [WinAPI DeleteObject] Result=', dbgs(Result), ' ObjectType=', ObjType);
900
function TQtWidgetSet.DestroyCaret(Handle: HWND): Boolean;
902
Result := (Handle <> 0) and QtCaret.DestroyCaret;
905
{------------------------------------------------------------------------------
908
Returns: Result of destroying
909
------------------------------------------------------------------------------}
911
function TQtWidgetSet.DestroyIcon(Handle: HICON): Boolean;
913
Result := (Handle <> 0) and
915
(TObject(Handle) is TQtIcon) or
916
(TObject(Handle) is TQtCursor)
919
TObject(Handle).Free;
922
{------------------------------------------------------------------------------
924
Params: DC: HDC; var Points; Count: Integer
926
------------------------------------------------------------------------------}
927
function TQtWidgetSet.DPtoLP(DC: HDC; var Points; Count: Integer): BOOL;
932
MatrixInv: QTransformH;
933
QtDC: TQtDeviceContext;
936
{$ifdef VerboseQtWinAPI}
937
WriteLn('[WinAPI DPtoLP] ');
942
if not IsValidDC(DC) then
945
QtDC := TQtDeviceContext(DC);
947
Matrix := QTransform_create;
948
MatrixInv := QTransform_create;
949
QPainter_combinedTransform(QtDC.Widget, Matrix);
955
Inverted := QTransform_isInvertible(Matrix);
956
QTransform_inverted(Matrix, MatrixInv, @Inverted);
959
QTransform_map(MatrixInv, PQtPoint(@QtPoint), PQtPoint(@QtPoint));
967
QTransform_destroy(MatrixInv);
968
QTransform_destroy(Matrix);
972
{------------------------------------------------------------------------------
974
Params: DC: HDC; var Rect: TRect; edge: Cardinal; grfFlags: Cardinal
976
------------------------------------------------------------------------------}
977
function TQtWidgetSet.DrawEdge(DC: HDC; var Rect: TRect; edge: Cardinal; grfFlags: Cardinal): Boolean;
980
ColorDark, ColorLight: TColorRef;
982
QtDC: TQtDeviceContext;
984
procedure InternalDrawEdge(Outer: Boolean; const R: TRect);
986
X1, Y1, X2, Y2: Integer;
987
ColorLeftTop, ColorRightBottom: TColor;
988
EdgeQtColor: TQColor;
989
APen, OldPen: TQtPen;
996
ColorLeftTop := clNone;
997
ColorRightBottom := clNone;
1001
if Edge and BDR_RAISEDOUTER <> 0 then
1003
ColorLeftTop := ColorLight;
1004
ColorRightBottom := ColorDark;
1006
else if Edge and BDR_SUNKENOUTER <> 0 then
1008
ColorLeftTop := ColorDark;
1009
ColorRightBottom := ColorLight;
1014
if Edge and BDR_RAISEDINNER <> 0 then
1016
ColorLeftTop := ColorLight;
1017
ColorRightBottom := ColorDark;
1019
else if Edge and BDR_SUNKENINNER <> 0 then
1021
ColorLeftTop := ColorDark;
1022
ColorRightBottom := ColorLight;
1026
if grfFlags and BF_DIAGONAL = 0 then
1029
APen := TQtPen.Create(True);
1030
ColorRefToTQColor(TColorRef(ColorLeftTop), EdgeQtColor);
1031
APen.setColor(EdgeQtColor);
1032
OldPen := QtDC.setPen(APen);
1034
if grfFlags and BF_LEFT <> 0 then
1035
QtDC.DrawLine(X1, Y1, X1, Y2);
1036
if grfFlags and BF_TOP <> 0 then
1037
QtDC.DrawLine(X1, Y1, X2, Y1);
1039
QtDC.setPen(OldPen);
1041
APen := TQtPen.Create(True);
1043
ColorRefToTQColor(TColorRef(ColorRightBottom), EdgeQtColor);
1044
APen.setColor(EdgeQtColor);
1045
OldPen := QtDC.SetPen(APen);
1047
if grfFlags and BF_RIGHT <> 0 then
1048
QtDC.DrawLine(X2, Y1, X2, Y2);
1049
if grfFlags and BF_BOTTOM <> 0 then
1050
QtDC.DrawLine(X1, Y2, X2, Y2);
1051
QtDC.SetPen(OldPen);
1057
APen := TQtPen.Create(True);
1058
ColorRefToTQColor(TColorRef(ColorLeftTop), EdgeQtColor);
1059
APen.setColor(EdgeQtColor);
1060
OldPen := QtDC.setPen(APen);
1062
if (grfFlags and BF_DIAGONAL_ENDTOPLEFT = BF_DIAGONAL_ENDTOPLEFT) or
1063
(grfFlags and BF_DIAGONAL_ENDBOTTOMRIGHT = BF_DIAGONAL_ENDBOTTOMRIGHT) then
1064
QtDC.DrawLine(X1, Y1, X2, Y2)
1066
QtDC.DrawLine(X1, Y2, X2, Y1);
1067
QtDC.setPen(OldPen);
1073
{$ifdef VerboseQtWinAPI}
1074
WriteLn('[WinAPI DrawEdge] ');
1078
if not IsValidDC(DC) or IsRectEmpty(Rect) then exit;
1080
QtDC := TQtDeviceContext(DC);
1083
Dec(ClientRect.Right, 1);
1084
Dec(ClientRect.Bottom, 1);
1087
ColorDark := ColorToRGB(cl3DDkShadow);
1088
ColorLight := ColorToRGB(cl3DLight);
1089
if grfFlags and BF_FLAT <> 0 then
1090
ColorLight := clSilver;
1091
if grfFlags and BF_MONO <> 0 then
1093
ColorDark := TColorRef(clBlack);
1094
ColorLight := TColorRef(clWhite);
1097
if Edge and (BDR_SUNKENOUTER or BDR_RAISEDOUTER) <> 0 then
1098
InternalDrawEdge(True, ClientRect);
1099
InflateRect(ClientRect, -1, -1);
1100
if grfFlags and BF_MONO = 0 then
1102
ColorLight := ColorToRGB(clBtnHiLight);
1103
ColorDark := ColorToRGB(clBtnShadow);
1105
if Edge and (BDR_SUNKENINNER or BDR_RAISEDINNER) <> 0 then
1107
InternalDrawEdge(False, ClientRect);
1108
InflateRect(ClientRect, -1, -1);
1113
inc(ClientRect.Right);
1114
inc(ClientRect.Bottom);
1116
if grfFlags and BF_MIDDLE <> 0 then
1118
Brush := CreateSolidBrush(TColorRef(clBtnFace));
1120
FillRect(DC, ClientRect, Brush);
1122
DeleteObject(Brush);
1126
if grfFlags and BF_ADJUST <> 0 then
1136
{------------------------------------------------------------------------------
1137
Method: DrawFocusRect
1138
Params: DC: HDC; const Rect: TRect
1140
------------------------------------------------------------------------------}
1141
function TQtWidgetSet.DrawFocusRect(DC: HDC; const Rect: TRect): boolean;
1143
StyleOption: QStyleOptionFocusRectH;
1144
QtDC: TQtDeviceContext;
1146
{$ifdef VerboseQtWinAPI}
1147
WriteLn('[TQtWidgetSet.DrawFocusRect] Handle: ', dbghex(DC));
1151
if not IsValidDC(DC) then exit;
1153
QtDC := TQtDeviceContext(DC);
1154
StyleOption := QStyleOptionFocusRect_create;
1157
QStyleOption_setRect(StyleOption, @Rect);
1158
if not QtDC.getClipping then
1159
QtDC.setClipRect(Rect);
1160
QStyle_drawPrimitive(QApplication_style, QStylePE_FrameFocusRect, StyleOption, QtDC.Widget, QtDC.Parent);
1163
QStyleOptionFocusRect_destroy(StyleOption);
1168
function TQtWidgetSet.DrawFrameControl(DC: HDC; const Rect: TRect; uType,
1169
uState: Cardinal): Boolean;
1171
QtDC: TQtDeviceContext;
1175
function uStatetoQStyleState: QStyleState;
1177
Result := QStyleState_None;
1178
if (uState and DFCS_INACTIVE = 0) then
1179
Result := Result or QStyleState_Enabled;
1181
if (uState and DFCS_PUSHED <> 0) then
1182
Result := Result or QStyleState_MouseOver or QStyleState_Sunken
1184
Result := Result or QStyleState_Raised;
1186
if (uState and DFCS_CHECKED <> 0) then
1187
Result := Result or QStyleState_On
1189
Result := Result or QStyleState_Off;
1191
if ((uState and DFCS_HOT <> 0) or (uState and DFCS_PUSHED <> 0)) then
1192
Result := Result or QStyleState_MouseOver or QStyleState_Active;
1194
if (uType <> DFC_BUTTON) and
1195
((uState and DFCS_FLAT <> 0) and not (uState and DFCS_PUSHED <> 0)) then
1196
Result := Result and not QStyleState_Raised;
1198
// DFCS_TRANSPARENT = 2048;
1199
//DFCS_ADJUSTRECT = 8192;
1200
//DFCS_FLAT = 16384;
1201
//DFCS_MONO = 32768;
1204
procedure DrawButton;
1206
Opt: QStyleOptionButtonH;
1207
Element: QStyleControlElement;
1209
Features: QStyleOptionButtonButtonFeatures;
1211
State := uStatetoQStyleState;
1212
if uState and DFCS_FLAT <> 0 then
1213
Features := QStyleOptionButtonFlat
1215
Features := QStyleOptionButtonNone;
1216
if (uState and $1F) in [DFCS_BUTTONCHECK, DFCS_BUTTON3STATE] then
1217
Element := QStyleCE_CheckBox
1219
if (DFCS_BUTTONRADIO and uState) <> 0 then
1220
Element := QStyleCE_RadioButton
1222
if (DFCS_BUTTONPUSH and uState) <> 0 then
1223
Element := QStyleCE_PushButton
1225
if (DFCS_BUTTONRADIOIMAGE and uState) <> 0 then
1226
Element := QStyleCE_RadioButton
1227
//TODO: what to implement here ?
1229
if (DFCS_BUTTONRADIOMASK and uState) <> 0 then
1230
Element := QStyleCE_RadioButton
1231
//TODO: what to implement here ?
1234
Opt := QStyleOptionButton_create();
1235
QStyleOptionButton_setFeatures(Opt, Features);
1236
QStyleOption_setRect(Opt, @Rect);
1237
QStyleOption_setState(Opt, State);
1238
QStyle_drawControl(QApplication_style(), Element, Opt, Painter, Widget);
1239
QStyleOptionButton_destroy(Opt);
1242
procedure DrawScrollBarArrows;
1245
Element: QStylePrimitiveElement;
1248
//TODO: DFCS_SCROLLCOMBOBOX and DFCS_SCROLLSIZEGRIP
1249
State := uStatetoQStyleState;
1250
Element := QStylePE_CustomBase;
1251
if (uState and $1F) in [DFCS_SCROLLUP] then
1252
Element := QStylePE_IndicatorArrowUp
1254
if (uState and $1F) in [DFCS_SCROLLDOWN] then
1255
Element := QStylePE_IndicatorArrowDown
1257
if (uState and $1F) in [DFCS_SCROLLLEFT] then
1258
Element := QStylePE_IndicatorArrowLeft
1260
if (uState and $1F) in [DFCS_SCROLLRIGHT] then
1261
Element := QStylePE_IndicatorArrowRight;
1263
if Element = QStylePE_CustomBase then
1265
Opt := QStyleOption_create(1, 0);
1266
QStyleOption_setRect(Opt, @Rect);
1267
QStyleOption_setState(Opt, State);
1268
QStyle_drawPrimitive(QApplication_style(), Element, Opt, Painter, Widget);
1269
QStyleOption_destroy(Opt);
1274
if not IsValidDC(DC) then
1276
QtDC := TQtDeviceContext(DC);
1277
Painter := QtDC.Widget;
1278
Widget := QtDC.Parent;
1280
DFC_BUTTON: DrawButton;
1281
DFC_CAPTION: ; // title bar captions
1283
DFC_SCROLL: DrawScrollBarArrows;
1287
{------------------------------------------------------------------------------
1289
Params: DC, Str, Count, Rect, Flags
1290
Returns: If the string was drawn, or CalcRect run
1292
if DT_CALCRECT is one of the Flags passed to this function, then:
1294
* DrawText should not draw the text, but determine the size that would be required to write it.
1295
* If there are multiple lines of text, this function will keep Rect.Width fixed and
1296
expand Rect.Height to fit the text.
1297
* If there is one line of text, Rect is reduced or expanded to fit it.
1298
* The result will the height of the text.
1299
------------------------------------------------------------------------------}
1300
function TQtWidgetSet.DrawText(DC: HDC; Str: PChar; Count: Integer;
1301
var ARect: TRect; Flags: Cardinal): Integer;
1303
WideStr: WideString;
1305
QtDC: TQtDeviceContext;
1313
procedure CalculateOffsetWithAngle(const AFontAngle: Integer;
1314
var TextLeft,TextTop: Integer);
1316
OffsX, OffsY: integer;
1320
OffsX := R.Right - R.Left;
1321
OffsY := R.Bottom - R.Top;
1324
Angle := AFontAngle div 10;
1326
Angle := 360 + Angle;
1331
OffsY := Trunc(Size.cx * sin(Angle * Pi / 180));
1333
if Angle <= 180 then
1335
OffsX := Trunc(Size.cx * -cos(Angle * Pi / 180));
1336
OffsY := Trunc(Size.cx * sin(Angle * Pi / 180) +
1337
Size.cy * cos((180 - Angle) * Pi / 180));
1339
if Angle <= 270 then
1341
OffsX := Trunc(Size.cx * -cos(Angle * Pi / 180) +
1342
Size.cy * sin((Angle - 180) * Pi / 180));
1343
OffsY := Trunc(Size.cy * sin((270 - Angle) * Pi / 180));
1345
if Angle <= 360 then
1347
OffsX := Trunc(Size.cy * sin((360 - Angle) * Pi / 180));
1355
{$ifdef VerboseQtWinAPI}
1356
WriteLn('[WinAPI DrawText] DC: ', dbghex(DC), ' Str: ', string(Str),
1357
' CalcRect: ', dbgs((Flags and DT_CALCRECT) = DT_CALCRECT),' ARect ',dbgs(ARect));
1362
if not IsValidDC(DC) then
1365
QtDC :=TQtDeviceContext(DC);
1368
WideStr := GetUtf8String(Copy(Str, 1, Count))
1370
WideStr := GetUtf8String(Str);
1373
B := QtDC.getClipping;
1375
(Flags and DT_NOCLIP = DT_NOCLIP) and
1376
(Flags and DT_WORDBREAK = DT_WORDBREAK) then
1378
ClipRect := QtDC.getClipRegion.getBoundingRect;
1379
//this is just to get same behaviour as gtk2 and win32
1380
//IMO, we should change ARect.Left and/or ARect.Top if smaller than
1381
//clip rect (map to clipRect). Then multiline text is drawn ok.
1382
//look at issue http://bugs.freepascal.org/view.php?id=17678 . zeljko.
1383
if (ARect.Left < ClipRect.Left) or (ARect.Top < ClipRect.Top) then
1385
{$note remove ifdef if I'm wrong about DT_WORDBREAK OBSERVATION}
1386
{$IFDEF QT_DRAWTEXT_MAP_TO_CLIPRECT}
1387
if ARect.Left < ClipRect.Left then
1388
ARect.Left := ClipRect.Left;
1389
if ARect.Top < ClipRect.Top then
1390
ARect.Top := ClipRect.Top;
1392
Flags := Flags and not DT_WORDBREAK;
1397
F := DTFlagsToQtFlags(Flags);
1399
QtDC.Metrics.BoundingRect(@R, @ARect, F, @WideStr);
1401
//TODO: result should be different when DT_VCENTER or DT_BOTTOM is set
1402
Result := R.Bottom - R.Top;
1404
if (Flags and DT_CALCRECT) = DT_CALCRECT then
1406
if (Flags and DT_WORDBREAK = DT_WORDBREAK) and
1407
((R.Bottom - R.Top) > (ARect.Bottom - ARect.Top)) then
1408
// MSDN says do not touch rect width when we have DT_WORDBREAK flag
1409
// and new text is multiline (if R height > ARect height).See #17329.
1411
ARect.Right := ARect.Left + R.Right - R.Left;
1412
ARect.Bottom := ARect.Top + R.Bottom - R.Top;
1413
{$ifdef VerboseQtWinAPI}
1414
WriteLn('[WinAPI DrawText] Rect=', dbgs(ARect));
1419
// if our Font.Orientation <> 0 we must recalculate X,Y offset
1420
// also it works only with DT_TOP DT_LEFT. Qt can handle multiline
1421
// text in this case too.
1423
if (QtDC.Font.Angle <> 0) and
1424
(Flags and DT_VCENTER = 0) and (Flags and DT_CENTER = 0) and
1425
(Flags and DT_RIGHT = 0) and (Flags and DT_BOTTOM = 0) then
1427
Pt := Point(ARect.Left, ARect.Top);
1428
CalculateOffsetWithAngle(QtDC.font.Angle, Pt.X, Pt.Y);
1431
// we cannot fit into rectangle, so use DT_SINGLELINE.See #17329.
1432
// http://msdn.microsoft.com/en-us/library/dd162498%28v=VS.85%29.aspx
1434
(Flags and DT_NOCLIP = DT_NOCLIP) and
1435
(Flags and DT_WORDBREAK = DT_WORDBREAK) and
1436
(Flags and DT_SINGLELINE = DT_SINGLELINE) and
1437
((R.Bottom - R.Top) >= (ARect.Bottom - ARect.Top)) then
1439
Flags := Flags and not DT_WORDBREAK;
1440
F := DTFlagsToQtFlags(Flags);
1443
{$warning HARDCODED WORKAROUND for qt-4.7.1 QPainter bug.}
1444
{ Bug triggers when we try to paint multiline text which contains 1
1445
space. eg "Save project\nCtrl+S". In this case QPainter draws
1447
project (in two lines, so Ctrl+S is invisible. See issue #18631.
1448
But does not trigger with qt-4.6.XX and maybe with 4.7.0.
1449
Opened nokia issue: http://bugreports.qt.nokia.com/browse/QTBUG-17020
1450
UPDATE: it's fixed in qt-4.7.4 git and qt-4.8}
1451
if (QtVersionMajor = 4) and (QtVersionMinor = 7) and (QtVersionMicro < 4) and
1452
(Flags and DT_WORDBREAK = DT_WORDBREAK) and
1453
((Flags and DT_VCENTER = DT_VCENTER) or (Flags and DT_CENTER = DT_CENTER))
1454
and not (Flags and DT_NOCLIP = DT_NOCLIP) and
1455
not (Flags and DT_MODIFYSTRING = DT_MODIFYSTRING) and
1456
not (Flags and DT_END_ELLIPSIS = DT_END_ELLIPSIS) then
1459
if length(S) > 0 then
1462
if (AnsiPos(LineEnding, S) > i) and
1463
(S[length(S)] <> LineEnding) then
1465
Flags := Flags and not DT_WORDBREAK;
1466
F := DTFlagsToQtFlags(Flags);
1471
if (Flags and DT_MODIFYSTRING = DT_MODIFYSTRING) and
1472
(Flags and DT_END_ELLIPSIS = DT_END_ELLIPSIS) and
1473
(Flags and DT_WORDBREAK = 0) then
1475
// windows are removing trailing spaces in this case
1476
// and we are doing same thing too.
1477
WideStr := TrimLeft(WideStr);
1479
WideStr := QtDC.Metrics.elidedText(WideStr, QtElideRight, Right - Left, 0);
1483
QtDC.DrawText(Left + Pt.X, Top + Pt.Y, Right-Left, Bottom-Top, F, @WideStr);
1486
{------------------------------------------------------------------------------
1488
Params: X1, Y1, X2, Y2
1491
Use Ellipse to draw a filled circle or ellipse.
1492
------------------------------------------------------------------------------}
1493
function TQtWidgetSet.Ellipse(DC: HDC; X1, Y1, X2, Y2: Integer): Boolean;
1497
if not IsValidDC(DC) then Exit(False);
1498
R := NormalizeRect(Rect(X1, Y1, X2, Y2));
1499
if IsRectEmpty(R) then Exit(True);
1501
TQtDeviceContext(DC).drawEllipse(R.Left, R.Top, R.Right - R.Left - 1, R.Bottom - R.Top - 1);
1505
function TQtWidgetSet.EnableScrollBar(Wnd: HWND; wSBflags, wArrows: Cardinal): Boolean;
1507
{maybe we can put creating of scrollbar here instead of SetScrollInfo() }
1509
{$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION}
1510
WriteLn('***** [WinAPI TQtWidgetSet.EnableScrollbar] missing implementation ');
1514
function TQtWidgetSet.EnableWindow(hWnd: HWND; bEnable: Boolean): Boolean;
1516
{$ifdef VerboseQtWinAPI}
1517
WriteLn('[WinAPI EnableWindow] ');
1522
Result := not TQtWidget(hwnd).getEnabled;
1523
TQtWidget(hWnd).setEnabled(bEnable);
1527
{------------------------------------------------------------------------------
1532
------------------------------------------------------------------------------}
1533
function TQtWidgetSet.EndPaint(Handle: hwnd; var PS: TPaintStruct): Integer;
1535
{$ifdef VerboseQtWinAPI}
1536
WriteLn('[WinAPI EndPaint] Handle: ', dbghex(Handle),
1537
' PS.HDC: ', dbghex(PS.HDC));
1542
if IsValidDC(PS.HDC) and (TObject(PS.HDC) is TQtDeviceContext) then
1544
{$ifdef VerboseQtWinAPI}
1545
WriteLn('Freeing resources');
1547
TQtDeviceContext(PS.HDC).Free;
1551
{------------------------------------------------------------------------------
1552
Procedure: EnterCriticalSection
1553
Params: var CritSection: TCriticalSection
1555
------------------------------------------------------------------------------}
1556
procedure TQtWidgetSet.EnterCriticalSection(var CritSection: TCriticalSection);
1558
ACritSec: System.PRTLCriticalSection;
1560
ACritSec:=System.PRTLCriticalSection(CritSection);
1561
System.EnterCriticalsection(ACritSec^);
1564
function TQtWidgetSet.EnumDisplayMonitors(hdc: HDC; lprcClip: PRect;
1565
lpfnEnum: MonitorEnumProc; dwData: LPARAM): LongBool;
1568
Desktop: QDesktopWidgetH;
1570
Desktop := QApplication_desktop();
1572
for i := 0 to QDesktopWidget_numScreens(Desktop) - 1 do
1574
Result := Result and lpfnEnum(i + 1, 0, nil, dwData);
1575
if not Result then break;
1580
function CharsetToQtCharSet(const ALCLCharset: Byte): QFontDatabaseWritingSystem;
1582
Result := QFontDatabaseAny;
1584
SYMBOL_CHARSET: Result := QFontDatabaseSymbol;
1585
FCS_ISO_8859_1 .. FCS_ISO_8859_4,
1586
FCS_ISO_8859_9,FCS_ISO_8859_10,
1588
EASTEUROPE_CHARSET: Result := QFontDatabaseLatin;
1590
RUSSIAN_CHARSET: Result := QFontDatabaseCyrillic;
1592
ARABIC_CHARSET: Result := QFontDatabaseArabic;
1594
GREEK_CHARSET: Result := QFontDatabaseGreek;
1596
HEBREW_CHARSET: Result := QFontDatabaseHebrew;
1597
SHIFTJIS_CHARSET: Result := QFontDatabaseJapanese;
1598
HANGEUL_CHARSET: Result := QFontDatabaseKorean;
1599
GB2312_CHARSET: Result := QFontDatabaseSimplifiedChinese;
1600
CHINESEBIG5_CHARSET: Result := QFontDatabaseTraditionalChinese;
1601
THAI_CHARSET: Result := QFontDatabaseThai;
1605
function QtCharsetToCharset(AWritingSystem: QFontDatabaseWritingSystem;
1606
AList: TFPList): Byte;
1608
Result := DEFAULT_CHARSET;
1609
case AWritingSystem of
1612
Result := FCS_ISO_10646_1;
1613
AList.Add(TObject(PtrUInt(Result)));
1615
QFontDatabaseSymbol:
1617
Result := SYMBOL_CHARSET;
1618
AList.Add(TObject(PtrUInt(Result)));
1622
Result := THAI_CHARSET;
1623
AList.Add(TObject(PtrUInt(Result)));
1625
QFontDatabaseTraditionalChinese:
1627
Result := CHINESEBIG5_CHARSET;
1628
AList.Add(TObject(PtrUInt(Result)));
1630
QFontDatabaseSimplifiedChinese:
1632
Result := GB2312_CHARSET;
1633
AList.Add(TObject(PtrUInt(Result)));
1635
QFontDatabaseKorean:
1637
Result := HANGEUL_CHARSET;
1638
AList.Add(TObject(PtrUInt(Result)));
1640
QFontDatabaseJapanese:
1642
Result := SHIFTJIS_CHARSET;
1643
AList.Add(TObject(PtrUInt(Result)));
1645
QFontDatabaseHebrew:
1647
Result := HEBREW_CHARSET;
1648
AList.Add(TObject(PtrUInt(Result)));
1649
AList.Add(TObject(PtrUInt(FCS_ISO_8859_8)));
1653
Result := GREEK_CHARSET;
1654
AList.Add(TObject(PtrUInt(Result)));
1655
AList.Add(TObject(PtrUInt(FCS_ISO_8859_7)));
1657
QFontDatabaseArabic:
1659
Result := ARABIC_CHARSET;
1660
AList.Add(TObject(PtrUInt(Result)));
1662
QFontDatabaseCyrillic:
1664
Result := RUSSIAN_CHARSET;
1665
AList.Add(TObject(PtrUInt(Result)));
1666
AList.Add(TObject(PtrUInt(FCS_ISO_8859_5)));
1670
Result := FCS_ISO_10646_1;
1671
AList.Add(TObject(PtrUInt(Result)));
1672
AList.Add(TObject(PtrUInt(ANSI_CHARSET)));
1673
AList.Add(TObject(PtrUInt(FCS_ISO_8859_1)));
1674
AList.Add(TObject(PtrUInt(FCS_ISO_8859_2)));
1675
AList.Add(TObject(PtrUInt(FCS_ISO_8859_3)));
1676
AList.Add(TObject(PtrUInt(FCS_ISO_8859_4)));
1677
AList.Add(TObject(PtrUInt(FCS_ISO_8859_9)));
1678
AList.Add(TObject(PtrUInt(FCS_ISO_8859_10)));
1679
AList.Add(TObject(PtrUInt(FCS_ISO_8859_15)));
1680
AList.Add(TObject(PtrUInt(EASTEUROPE_CHARSET)));
1685
{------------------------------------------------------------------------------
1686
Function: EnumFontFamiliesEx
1689
[in] Handle to the device context.
1691
[in] Pointer to a LOGFONT structure that contains information about the
1692
fonts to enumerate. The function examines the following members.
1695
lfCharset If set to DEFAULT_CHARSET, the function enumerates all fonts
1696
in all character sets. If set to a valid character set value,
1697
the function enumerates only fonts in the specified character
1699
lfFaceName If set to an empty string, the function enumerates one font
1700
in each available typeface name. If set to a valid typeface
1701
name, the function enumerates all fonts with the
1704
lfPitchAndFamily Must be set to zero for all language versions of
1705
the operating system.
1708
[in] Pointer to the application definedcallback function. For more
1709
information, see the EnumFontFamExProc function.
1711
[in] Specifies an applicationdefined value. The function passes this value
1712
to the callback function along with font information.
1714
This parameter is not used and must be zero.
1718
The return value is the last value returned by the callback function.
1719
This value depends on which font families are available for the
1722
------------------------------------------------------------------------------}
1723
function TCDWidgetSet.EnumFontFamiliesEx(DC: HDC; lpLogFont: PLogFont; Callback: FontEnumExProc; Lparam: LParam; Flags: dword): longint;
1725
FontList: TStringList;
1729
//Metric.ntmentm.ntmAvgWidth := 0; // just to shutup compiler
1731
// Read all font files from /system/fonts/*.ttf
1732
{ Example from HTC Wildfire:
1733
-rw-r--r-- root root 117072 2010-05-27 23:49 DroidSansMono.ttf
1734
-rw-r--r-- root root 191032 2010-05-27 23:49 DroidSans-Bold.ttf
1735
-rw-r--r-- root root 184836 2010-05-27 23:49 DroidSerif-Bold.ttf
1736
-rw-r--r-- root root 1160880 2010-05-27 23:49 gcsh00d-hkscs.ttf
1737
-rw-r--r-- root root 189916 2010-05-27 23:49 DroidSerif-BoldItalic.ttf
1738
-rw-r--r-- root root 6880 2010-05-27 23:49 Clockopia.ttf
1739
-rw-r--r-- root root 190044 2010-05-27 23:49 DroidSans.ttf
1740
-rw-r--r-- root root 177176 2010-05-27 23:49 DroidSerif-Italic.ttf
1741
-rw-r--r-- root root 172532 2010-05-27 23:49 DroidSerif-Regular.ttf
1742
-rw-r--r-- root root 3640264 2011-03-10 14:10 DroidSansFallback.ttf
1743
-rw-r--r-- root root 3538916 2008-08-01 14:00 mfont.mbf
1744
-rw-r--r-- root root 36028 2008-08-01 14:00 DroidSansThai.ttf
1745
-rw-r--r-- root root 23076 2008-08-01 14:00 DroidSansHebrew.ttf
1746
-rw-r--r-- root root 35908 2008-08-01 14:00 DroidSansArabic.ttf
1747
-rw-r--r-- root root 12292 2008-08-01 14:00 ARDJ-KK.ttf
1749
{ FontList := TStringList.create;
1751
ShellCtrls.TCustomShellTreeView.GetFilesInDir();
1753
// In this case we want to list all fonts
1754
if (lpLogFont^.lfCharSet = DEFAULT_CHARSET) and
1755
(lpLogFont^.lfFaceName= '') and
1756
(lpLogFont^.lfPitchAndFamily = 0) then
1758
for i := 0 to FontList.Count - 1 do
1760
EnumLogFont.elfLogFont.lfFaceName := FontList[i];
1761
Result := Callback(EnumLogFont, Metric, FontType, LParam);
1773
(*{------------------------------------------------------------------------------
1774
Function: ExcludeClipRect
1778
------------------------------------------------------------------------------}
1779
function TQtWidgetSet.ExcludeClipRect(dc: hdc; Left, Top, Right, Bottom : Integer) : Integer;
1782
ClipRegion: QRegionH;
1784
QtDC: TQtDeviceContext;
1787
{$ifdef VerboseQtWinAPI}
1788
WriteLn('[WinAPI ExcludeClipRect]');
1792
if not IsValidDC(DC) then Exit;
1794
QtDC := TQtDeviceContext(DC);
1796
{ExcludeClipRect on X11 paint engine is pretty slow with complex regions
1797
eg. setting clipRegion with hundreds of rects (usually created by
1798
calling ExcludeClipRect for many children on widget) dramatically kills
1799
performance of our application.
1800
To get rid of it we are using trick from webkit. If numRects is over
1801
25 then create an new rect region with boundsRect of NewRegion.
1802
see issue http://bugs.freepascal.org/view.php?id=19698.
1803
If you want accurate ExcludeClipRect use graphicssystem Raster or
1804
see comment in TQtWidgetSet.ExtSelectClipRgn}
1805
ExRegion := QRegion_create(Left, Top, Right - Left, Bottom - Top, QRegionRectangle);
1806
Region := QRegion_create;
1807
ClipRegion := QRegion_create;
1809
QPainter_clipRegion(QtDC.Widget, ClipRegion);
1810
QRegion_subtracted(ClipRegion, Region, ExRegion);
1812
// only for X11 paintEngine.
1813
if (QPaintEngine_type(QtDC.PaintEngine) = QPaintEngineX11) and
1814
not QRegion_isEmpty(Region) and
1815
(QRegion_numRects(Region) > 25) then
1817
QRegion_boundingRect(Region, @R);
1818
QRegion_setRects(Region, @R, 1);
1821
QtDC.setClipRegion(Region);
1822
QtDC.setClipping(True);
1823
if QRegion_isEmpty(Region) then
1824
Result := NULLREGION
1826
if QRegion_numRects(Region) = 1 then
1827
Result := SIMPLEREGION
1829
Result := COMPLEXREGION;
1832
QRegion_destroy(ClipRegion);
1833
QRegion_destroy(Region);
1834
QRegion_destroy(ExRegion);
1838
function TQtWidgetSet.ExtCreatePen(dwPenStyle, dwWidth: DWord;
1839
const lplb: TLogBrush; dwStyleCount: DWord; lpStyle: PDWord): HPEN;
1845
QtPen := TQtPen.Create(True);
1846
QtPen.IsExtPen := True;
1848
case dwPenStyle and PS_STYLE_MASK of
1849
PS_SOLID: QtPen.setStyle(QtSolidLine);
1850
PS_DASH: QtPen.setStyle(QtDashLine);
1851
PS_DOT: QtPen.setStyle(QtDotLine);
1852
PS_DASHDOT: QtPen.setStyle(QtDashDotLine);
1853
PS_DASHDOTDOT: QtPen.setStyle(QtDashDotDotLine);
1854
PS_USERSTYLE: QtPen.setStyle(QtCustomDashLine);
1855
PS_NULL: QtPen.setStyle(QtNoPen);
1858
QtPen.setCosmetic((dwPenStyle and PS_TYPE_MASK) = PS_COSMETIC);
1859
if (dwPenStyle and PS_TYPE_MASK) = PS_GEOMETRIC then
1861
QtPen.setWidth(dwWidth);
1862
case dwPenStyle and PS_JOIN_MASK of
1863
PS_JOIN_ROUND: QtPen.setJoinStyle(QtRoundJoin);
1864
PS_JOIN_BEVEL: QtPen.setJoinStyle(QtBevelJoin);
1865
PS_JOIN_MITER: QtPen.setJoinStyle(QtMiterJoin);
1868
case dwPenStyle and PS_ENDCAP_MASK of
1869
PS_ENDCAP_ROUND: QtPen.setCapStyle(QtRoundCap);
1870
PS_ENDCAP_SQUARE: QtPen.setCapStyle(QtSquareCap);
1871
PS_ENDCAP_FLAT: QtPen.setCapStyle(QtFlatCap);
1875
if (dwPenStyle and PS_STYLE_MASK) = PS_USERSTYLE then
1876
QtPen.setDashPattern(lpStyle, dwStyleCount);
1878
QPen_Color(QtPen.FHandle, @Color);
1879
ColorRefToTQColor(ColorToRGB(TColor(lplb.lbColor)), Color);
1880
QPen_setColor(QtPen.FHandle, @Color);
1882
Result := HPEN(QtPen);
1885
function TQtWidgetSet.ExtSelectClipRGN(dc: hdc; rgn : hrgn; Mode : Longint) : Integer;
1890
QtWidget: TQtWidget = nil;
1891
QtDC: TQtDeviceContext;
1895
{$ifdef VerboseQtWinAPI}
1896
WriteLn('[WinAPI TQtWidgetSet.ExtSelectClipRGN]');
1898
if not IsValidDC(DC) then
1903
Result := SIMPLEREGION;
1905
QtDC := TQtDeviceContext(DC);
1907
if Assigned(QtDC.Parent) then
1908
QtWidget := QtObjectFromWidgetH(QtDC.Parent);
1910
if Assigned(QtWidget) or
1911
(not Assigned(QtWidget) and Assigned(QtDC.vImage)) then
1913
// there is no clipping region in the DC
1915
RGN_COPY: Result := SelectClipRGN(DC, RGN);
1920
// as MSDN says only RGN_COPY allows NULL RGN param.
1921
if not IsValidGDIObject(RGN) then
1926
// get existing clip
1927
QtRgn := QtDC.getClipRegion;
1929
if (QtRgn = nil) or (QtRgn.GetRegionType = NULLREGION) then
1931
Result := SelectClipRGN(DC, RGN);
1935
// get transformation
1936
GetWindowOrgEx(DC, @DCOrigin);
1937
R := QtRgn.getBoundingRect;
1938
Clip := CreateRectRGN(0, 0, R.Right - R.Left, R.Bottom - R.Top);
1939
TQtRegion(Clip).translate(DCOrigin.X, DCOrigin.Y);
1941
// create target clip
1942
Tmp := CreateEmptyRegion;
1944
Result := CombineRGN(Tmp, Clip, RGN, Mode);
1946
SelectClipRGN(DC, Tmp);
1953
// when substracting we must have active clipregion
1954
// with all of its rects.
1955
QtRgn := QtDC.getClipRegion;
1956
if (QtRgn = nil) or (QtRgn.GetRegionType = NULLREGION) then
1958
Result := SelectClipRGN(DC, RGN);
1962
Tmp := CreateEmptyRegion;
1963
Result := CombineRGN(Tmp, HRGN(QtRgn), RGN, MODE);
1965
// X11 paintEngine comment only !
1966
// we'll NOT reset num of rects here (performance problem) like we do
1967
// in ExcludeClipRect, because this function must be correct,
1968
// if someone want accurate ExcludeClipRect with X11 then
1969
// use code from intfbasewinapi.inc TWidgetSet.ExcludeClipRect()
1970
// which calls this function and then combineRgn.
1971
SelectClipRGN(DC, Tmp);
1977
Result := inherited ExtSelectClipRGN(DC, RGN, Mode);
1980
{$ifdef CD_UseNativeText}
1981
{------------------------------------------------------------------------------
1982
Function: ExtTextOut
1985
------------------------------------------------------------------------------}
1986
function TCDWidgetSet.ExtTextOut(DC: HDC; X, Y: Integer; Options: Longint;
1987
Rect: PRect; Str: PChar; Count: Longint; Dx: PInteger): Boolean;
1989
lJavaString: jstring;
1990
lJavaBitmap: jobject;
1992
lImage: TLazIntfImage = nil;
1993
lCanvas: TLazCanvas = nil;
1994
lWidth, lHeight: jint;
1995
lDestCanvas: TLazCanvas;
1997
// array for the parameters
1998
lParams: array[0..0] of JValue;
2000
{$ifdef VerboseCDText}
2001
DebugLn(Format(':>[WinAPI ExtTextOut] DC=%x javaEnvRef=%x Str=%s X=%d Y=%d',
2002
[DC, PtrInt(javaEnvRef), StrPas(Str), X, Y]));
2007
if (Str = nil) or (Str = '') then Exit;
2009
if ((Options and (ETO_OPAQUE + ETO_CLIPPED)) <> 0) and (Rect = nil) then
2012
if not IsValidDC(DC) then Exit;
2013
lDestCanvas := TLazCanvas(DC);
2015
if (lDestCanvas.Font = nil) or (lDestCanvas.Font.Size = 0) then lFontSize := DefaultFontAndroidSize
2016
else lFontSize := Abs(lDestCanvas.Font.Size);
2018
if (javaEnvRef = nil) then Exit;
2020
// Prepare the input
2021
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, Str);
2022
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lcltext, lJavaString);
2023
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, javaField_lcltextsize, lFontSize);
2025
// Call the method to measure the text
2026
javaEnvRef^^.CallVoidMethod(javaEnvRef, javaActivityObject, javaMethod_LCLDoGetTextBounds);
2028
// Call the method to draw the text
2029
lParams[0].i := FPColorToAndroidColor(lDestCanvas.Font.FPColor);
2030
javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaActivityObject, javaMethod_LCLDoDrawText, @lParams[0]);
2032
// Get the bitmap with the text
2033
lJavaBitmap := javaEnvRef^^.GetObjectField(javaEnvRef, javaActivityObject, javaField_lclbitmap);
2034
lWidth := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclwidth);
2035
lHeight := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclheight);
2037
{$ifdef VerboseCDText}
2038
DebugLn(Format(':[WinAPI ExtTextOut] lWidth=%d lHeight=%d DestCanvasSize=%d, %d lFontSize=%d',
2039
[lWidth, lHeight, lDestCanvas.Width, lDestCanvas.Height, lFontSize]));
2042
// ---------------------------
2043
// Now copy it pixel per pixel
2044
// ---------------------------
2047
AndroidBitmap_lockPixels(javaEnvRef, lJavaBitmap, @pixels);
2049
// Prepare the non-native image and canvas
2050
UpdateControlLazImageAndCanvas(lImage, lCanvas, lWidth, lHeight, clfRGBA32, pixels, True, False, False);
2052
// Execute the copy, pixel by pixel with Alpha blending
2053
// Simple AlphaBlend was showing redish areas in the emulator
2054
// because misteriously it read the target area pixels as red
2056
// Don't apply WindowOrg to the dest pos because it is applied
2057
// on each pixel drawing and was set via SetWindowOrg already
2058
lDestCanvas.AlphaBlendIgnoringDestPixels(lCanvas, X, Y, 0, 0, lWidth, lHeight);
2060
// Release the helper objects
2063
// Release the bitmap lock
2064
AndroidBitmap_unlockPixels(javaEnvRef, lJavaBitmap);
2066
{$ifdef VerboseCDText}
2067
DebugLn(':<[WinAPI ExtTextOut]');
2072
{ if ((Options and ETO_OPAQUE) <> 0) then
2073
QtDC.fillRect(Rect^.Left, Rect^.Top, Rect^.Right - Rect^.Left, Rect^.Bottom - Rect^.Top);}
2074
{ if (Options and ETO_CLIPPED <> 0) then
2076
B := QtDC.getClipping;
2080
QtDC.setClipRect(Rect^);
2082
QtDC.drawText(X, Y, Rect^.Right - Rect^.Left, Rect^.Bottom - Rect^.Top, 0, @WideStr);
2086
QtDC.drawText(X, Y, @WideStr);
2093
(*{------------------------------------------------------------------------------
2099
------------------------------------------------------------------------------}
2100
function TQtWidgetSet.FillRect(DC: HDC; const Rect: TRect; Brush: HBRUSH): Boolean;
2104
{$ifdef VerboseQtWinAPI}
2105
DebugLn('[WinAPI FillRect Rect=', dbgs(Rect),' Brush=', dbghex(Brush));
2108
if not IsValidDC(DC) then
2110
if not IsValidGdiObject(Brush) then
2113
TQtDeviceContext(DC).fillRect(@Rect, TQtBrush(Brush).FHandle);
2117
{------------------------------------------------------------------------------
2119
Params: DC: HDC; RegionHnd: HRGN; hbr: HBRUSH
2122
------------------------------------------------------------------------------}
2123
function TQtWidgetSet.FillRgn(DC: HDC; RegionHnd: HRGN; hbr: HBRUSH): Bool;
2127
hasClipping: Boolean;
2128
QtDC: TQtDeviceContext;
2130
{$ifdef VerboseQtWinAPI}
2131
DebugLn('[WinAPI FillRgn Rgn=', dbgs(RegionHnd),' Brush=', dbghex(hbr));
2136
if not IsValidDC(DC) then exit;
2138
QtDC := TQtDeviceContext(DC);
2140
HasClipping := QtDC.getClipping;
2143
OldRgn := TQtRegion.Create(True);
2146
QPainter_clipRegion(QtDC.Widget, OldRgn.FHandle);
2147
if SelectClipRgn(DC, RegionHnd) <> ERROR then
2149
R := TQtRegion(RegionHnd).getBoundingRect;
2150
QtDC.fillRect(@R, TQtBrush(hbr).FHandle);
2152
SelectClipRgn(DC, HRGN(OldRgn));
2163
{------------------------------------------------------------------------------
2168
Draws the border of a rectangle.
2169
------------------------------------------------------------------------------}
2170
function TQtWidgetSet.Frame(DC: HDC; const ARect: TRect): Integer;
2174
if not IsValidDC(DC) then Exit;
2176
TQtDeviceContext(DC).drawRect(ARect.Left, ARect.Top,
2177
ARect.Right - ARect.Left, ARect.Bottom - ARect.Top);
2182
{------------------------------------------------------------------------------
2187
Draws a 3d border in Qt native style.
2188
------------------------------------------------------------------------------}
2189
function TQtWidgetSet.Frame3d(DC : HDC; var ARect : TRect;
2190
const FrameWidth : integer; const Style : TBevelCut) : boolean;
2192
QtDC: TQtDeviceContext;
2194
{$ifdef VerboseQtWinAPI}
2195
DebugLn('[TQtWidgetSet.Frame3d Rect=', dbgs(ARect));
2200
if not IsValidDC(DC) then exit;
2202
QtDC := TQtDeviceContext(DC);
2206
bvLowered: QtDC.qDrawWinPanel(ARect.Left, ARect.Top,
2207
ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, nil, True, FrameWidth);
2208
bvRaised: QtDC.qDrawWinPanel(ARect.Left, ARect.Top,
2209
ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, nil, False, FrameWidth);
2210
bvSpace: QtDC.qDrawPlainRect(ARect.Left, ARect.Top,
2211
ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, nil, FrameWidth);
2214
InflateRect(ARect, -FrameWidth, -FrameWidth);
2218
{------------------------------------------------------------------------------
2222
------------------------------------------------------------------------------}
2223
function TQtWidgetSet.FrameRect(DC: HDC; const ARect: TRect;
2224
hBr: HBRUSH): Integer;
2228
if not IsValidDC(DC) then Exit;
2230
TQtDeviceContext(DC).qDrawPLainRect(ARect.Left, ARect.Top,
2231
ARect.Right - ARect.Left, ARect.Bottom - ARect.Top);
2236
function TQtWidgetSet.GetActiveWindow: HWND;
2243
Widget := QApplication_activeWindow;
2244
if Widget <> nil then
2246
W := QtObjectFromWidgetH(Widget);
2249
if TQtMainWindow(W).MDIAreaHandle <> nil then
2251
Area := QMdiAreaH(TQtMainWindow(W).MDIAreaHandle.Widget);
2252
SubW := QtObjectFromWidgetH(QMdiArea_activeSubWindow(Area));
2254
Result := HWND(SubW)
2265
{------------------------------------------------------------------------------
2266
Method: TQtWidgetSet.GetBitmapBits
2270
------------------------------------------------------------------------------}
2271
function TQtWidgetSet.GetBitmapBits(Bitmap: HBITMAP; Count: Longint; Bits: Pointer): Longint;
2275
{$ifdef VerboseQtWinAPI}
2276
WriteLn('[WinAPI GetBitmapBits]',' Bitmap=', dbghex(Bitmap),' Count=',Count);
2281
if (Bitmap = 0) or (Count <= 0) then
2284
Image := QImage_create(TQtImage(Bitmap).FHandle);
2286
Result := (QImage_width(Image) * QImage_height(Image) * QImage_depth(Image) + 7) div 8;
2287
if Count < Result then
2290
Move(QImage_bits(Image)^, Bits^, Result);
2292
QImage_destroy(Image);
2296
function TQtWidgetSet.GetBkColor(DC: HDC): TColorRef;
2298
QtDC: TQtDeviceContext;
2300
Result := CLR_INVALID;
2301
if not IsValidDC(DC) then Exit;
2302
QtDC := TQtDeviceContext(DC);
2303
Result := QtDC.GetBkColor;
2306
function TQtWidgetSet.GetCapture: HWND;
2315
AWin := Windows.GetCapture;
2317
w := QWidget_find(AWin)
2321
if (w = nil) and (QApplication_mouseButtons() > 0) then
2322
w := QApplication_focusWidget()
2324
if w <> QWidget_mouseGrabber then
2325
w := QWidget_mouseGrabber;
2328
w := QWidget_mouseGrabber();
2333
// Capture widget can be child of complex control. In any case we should return TQtWidget as result.
2334
// So we will look for parent while not found apropriate LCL handle.
2335
Widget := GetFirstQtObjectFromWidgetH(w);
2336
Result := HWND(Widget);
2340
{$ifdef VerboseQtWinAPI}
2341
WriteLn('[WinAPI GetCapture] Capture = ', Result);
2345
function TQtWidgetSet.GetCaretPos(var lpPoint: TPoint): Boolean;
2347
Result := QtCaret.GetCaretPos(lpPoint);
2350
function TQtWidgetSet.GetCaretRespondToFocus(handle: HWND; var ShowHideOnFocus: boolean): Boolean;
2352
ShowHideOnFocus := QtCaret.GetQtCaretRespondToFocus;
2356
{------------------------------------------------------------------------------
2357
Function: GetClientBounds
2360
Returns: true on success
2362
Returns the client bounds of a control. The client bounds is the rectangle of
2363
the inner area of a control, where the child controls are visible. The
2364
coordinates are relative to the control's left and top.
2365
------------------------------------------------------------------------------}
2366
function TCDWidgetSet.BackendGetClientBounds(handle : HWND; var ARect : TRect) : Boolean;
2370
lForm := TCDForm(handle);
2375
if lForm.Image = nil then Exit(False);
2377
ARect.Right := lForm.Image.Width;
2378
ARect.Bottom := lForm.Image.Height;
2383
(*{------------------------------------------------------------------------------
2384
Function: GetClientRect
2387
Returns: true on success
2389
Returns the client bounds of a control. The client bounds is the rectangle of
2390
the inner area of a control, where the child controls are visible. The
2391
coordinates are relative to the control's left and top.
2392
------------------------------------------------------------------------------}
2393
function TQtWidgetSet.GetClientRect(handle : HWND; var ARect : TRect) : Boolean;
2395
{$ifdef VerboseQtWinAPI}
2396
WriteLn('[WinAPI GetClientRect]');
2399
GetClientBounds(Handle, ARect);
2400
OffsetRect(ARect, -ARect.Left, -ARect.Top);
2405
{------------------------------------------------------------------------------
2406
Function: GetClipBox
2410
Returns the smallest rectangle which includes the entire current
2411
Clipping Region, or if no Clipping Region is set, the current
2412
dimensions of the Drawable.
2414
The result can be one of the following constants
2419
------------------------------------------------------------------------------}
2420
function TQtWidgetSet.GetClipBox(DC: hDC; lpRect: PRect): Longint;
2425
Result := NULLREGION;
2426
if lpRect <> nil then
2427
lpRect^ := Rect(0,0,0,0);
2429
if not IsValidDC(DC) then
2432
if Result <> ERROR then
2433
with TQtDeviceContext(DC) do
2435
{$ifdef VerboseQtWinAPI}
2436
Writeln('TQtWidgetSet.GetClipBox FastClip=',
2437
((vClipRect <> nil) and not vClipRectDirty) );
2440
// the most correct way to get a clipbox if through
2441
// region.boundingrect, but it's slower.
2443
// TODO: remove "and false" below when vClipRectDirty is implemented
2444
// it should be "true" when user set a custom clip rect
2445
// and "false" on beginpaint
2446
if (vClipRect<>nil) and not vClipRectDirty and false then
2447
lpRect^ := vClipRect^
2451
ARegion := QRegion_Create;
2453
QPainter_clipRegion(Widget, ARegion);
2454
GetWindowOrgEx(DC, @Pt);
2455
if (Pt.X <> 0) or (Pt.Y <> 0) then
2456
SetWindowOrgEx(DC, Pt.X, Pt.Y, @Pt);
2457
QRegion_boundingRect(ARegion, lpRect);
2459
QRegion_destroy(ARegion);
2461
Result := SIMPLEREGION;
2464
if vImage <> nil then
2466
lpRect^ := Rect(0, 0, vImage.width, vImage.height);
2467
Result := SIMPLEREGION;
2469
{$ifdef VerboseQtWinAPI}
2470
WriteLn('TQtWidgetSet.GetClipBox Rect=', dbgs(lprect^));
2475
{------------------------------------------------------------------------------
2476
Function: GetClipRGN
2480
Returns a copy of the current Clipping Region.
2482
The result can be one of the following constants
2486
------------------------------------------------------------------------------}
2487
function TQtWidgetSet.GetClipRGN(DC : hDC; RGN : hRGN): Longint;
2489
{$ifdef VerboseQtWinAPI}
2490
Writeln('Trace: [WinAPI GetClipRgn]',
2491
' DC: ', dbghex(DC),
2492
' RGN: ', dbghex(Rgn));
2494
WriteLn(' QRegionH=', PtrInt(TQtRegion(Rgn).Widget))
2498
// it assumes that clipregion object has been created some other place
2500
if not IsValidDC(DC) then
2504
if not TQtDeviceContext(DC).getClipping then
2508
// if our TQtRegion contains widget then
2509
// first destroy it because QPainter creates
2511
if TQtRegion(Rgn).FHandle <> nil then
2513
QRegion_destroy(TQtRegion(Rgn).FHandle);
2514
TQtRegion(Rgn).FHandle := QRegion_create;
2516
QPainter_clipRegion(TQtDeviceContext(DC).Widget, TQtRegion(Rgn).FHandle);
2521
function TQtWidgetSet.GetCmdLineParamDescForInterface: string;
2522
function b(const s: string): string;
2524
Result:=BreakString(s,75,22)+LineEnding+LineEnding;
2529
+b(rsqtOptionDoGrab)
2532
+b(rsqtOptionStyleSheet)
2533
+b(rsqtOptionGraphicsStyle)
2534
+b(rsqtOptionSession)
2535
+b(rsqtOptionWidgetCount)
2536
+b(rsqtOptionReverse)
2538
+b(rsqtOptionX11Display)
2539
+b(rsqtOptionX11Geometry)
2540
+b(rsqtOptionX11Font)
2541
+b(rsqtOptionX11BgColor)
2542
+b(rsqtOptionX11FgColor)
2543
+b(rsqtOptionX11BtnColor)
2544
+b(rsqtOptionX11Name)
2545
+b(rsqtOptionX11Title)
2546
+b(rsqtOptionX11Visual)
2547
+b(rsqtOptionX11NCols)
2548
+b(rsqtOptionX11CMap)
2550
+b(rsqtOptionX11InputStyle)
2555
{------------------------------------------------------------------------------
2556
Method: GetCurrentObject
2558
DC - A handle to the DC
2559
uObjectType - The object type to be queried
2560
Returns: If the function succeeds, the return value is a handle to the specified object.
2561
If the function fails, the return value is NULL.
2562
------------------------------------------------------------------------------}
2564
function TQtWidgetSet.GetCurrentObject(DC: HDC; uObjectType: UINT): HGDIOBJ;
2566
QtDC: TQtDeviceContext absolute DC;
2569
if not QtWidgetSet.IsValidDC(DC) then
2572
OBJ_BITMAP: Result := HGDIOBJ(QtDC.vImage);
2573
OBJ_BRUSH: Result := HGDIOBJ(QtDC.vBrush);
2574
OBJ_FONT: Result := HGDIOBJ(QtDC.vFont);
2575
OBJ_PEN: Result := HGDIOBJ(QtDC.vPen);
2579
{------------------------------------------------------------------------------
2580
Function: GetCursorPos
2581
Params: lpPoint: The cursorposition
2582
Returns: True if succesful
2584
------------------------------------------------------------------------------}
2585
function TCDWidgetSet.GetCursorPos(var lpPoint: TPoint ): Boolean;
2587
// QCursor_pos(@vPoint);
2595
(*{------------------------------------------------------------------------------
2597
Params: hWnd is any widget.
2600
This function is Called:
2601
- Once on app startup with hWnd = 0
2602
- Twice for every TLabel on the TCustomLabel.CalcSize function
2603
------------------------------------------------------------------------------}
2604
function TCDWidgetSet.BackendGetDC(hWnd: HWND): HDC;
2606
lFormHandle: TCDNonNativeForm;
2608
lFormHandle := TCDNonNativeForm(hWnd);
2613
if hWnd = 0 then Exit;
2616
if lFormHandle.Canvas = nil then lFormHandle.Canvas := TLazCanvas.create(nil);
2617
Result := HDC(lFormHandle.Canvas);
2620
function TQtWidgetSet.GetDCOriginRelativeToWindow(PaintDC: HDC;
2621
WindowHandle: HWND; var OriginDiff: TPoint): boolean;
2623
QtDC: TQtDeviceContext absolute PaintDC;
2624
Matrix: QTransformH;
2627
{$ifdef VerboseQtWinAPI}
2628
WriteLn('[WinAPI GetDCOriginRelativeToWindow] PaintDC ' + dbghex(PaintDC));
2630
Result := IsValidDC(PaintDC);
2633
Matrix := QPainter_transform(QtDC.Widget);
2634
OriginDiff := Point(0, 0);
2636
if WindowHandle <> 0 then
2637
P := TQtWidget(WindowHandle).getClientOffset;
2638
if Matrix <> nil then
2640
OriginDiff.X := Round(QTransform_Dx(Matrix)) - P.X;
2641
OriginDiff.Y := Round(QTransform_Dy(Matrix)) - P.Y;
2645
{------------------------------------------------------------------------------
2646
Function: GetDeviceCaps
2647
Params: DC: HDC; Index: Integer
2649
------------------------------------------------------------------------------}
2650
function TCDWidgetSet.GetDeviceCaps(DC: HDC; Index: Integer): Integer;
2654
{$ifdef VerboseCDWinAPI}
2655
DebugLn(':>[WinAPI GetDeviceCaps] DC ' + dbghex(DC));
2660
if DC = 0 then DC := HDC(ScreenDC);
2661
LazDC := TLazCanvas(DC);
2665
// Result := QPaintDevice_widthMM(PaintDevice);
2667
// Result := QPaintDevice_heightMM(PaintDevice);
2669
// Result := QPaintDevice_width(PaintDevice);
2671
// Result := QPaintDevice_depth(PaintDevice);
2675
// Result := QPaintDevice_numColors(PaintDevice);
2678
if javaEnvRef = nil then Exit;
2679
Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclxdpi);
2683
if javaEnvRef = nil then Exit;
2684
Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclydpi);
2687
// Result := QPaintDevice_height(PaintDevice);
2693
{$ifdef VerboseCDWinAPI}
2694
DebugLn(':<[WinAPI GetDeviceCaps] Result=' + dbghex(Result));
2698
(*function TQtWidgetSet.GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT; Bits: Pointer; var BitInfo: BitmapInfo; Usage: UINT): Integer;
2701
{$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION}
2702
WriteLn('***** [WinAPI TQtWidgetSet.GetDIBits] missing implementation ');
2706
{------------------------------------------------------------------------------
2707
Function: GetDoubleClickTime
2711
------------------------------------------------------------------------------}
2712
function TQtWidgetSet.GetDoubleClickTime: UINT;
2714
Result := QApplication_doubleClickInterval;
2717
{------------------------------------------------------------------------------
2722
------------------------------------------------------------------------------}
2723
function TQtWidgetSet.GetFocus: HWND;
2726
{$ifdef VerboseFocus}
2731
W := QApplication_FocusWidget();
2734
Result := HwndFromWidgetH(W);
2735
{$ifdef VerboseFocus}
2736
Obj := TQtWidget(Result);
2737
Write('TQtWidgetSet.GetFocus: WidgetH=',dbghex(ptruint(W)), ' QtWidget=', dbgsname(Obj));
2739
WriteLn(' LclObject=', dbgsname(Obj.LCLObject))
2746
function TCDWidgetSet.GetKeyState(nVirtKey: Integer): Smallint;
2751
VK_LSHIFT: nVirtKey := VK_SHIFT;
2752
VK_LCONTROL: nVirtKey := VK_CONTROL;
2753
VK_LMENU: nVirtKey := VK_MENU;
2756
// where to track toggle state?
2760
if (QApplication_mouseButtons and QtLeftButton) > 0 then
2761
Result := Result or StateDown;
2763
if (QApplication_mouseButtons and QtRightButton) > 0 then
2764
Result := Result or StateDown;
2766
if (QApplication_mouseButtons and QtMidButton) > 0 then
2767
Result := Result or StateDown;
2769
if (QApplication_mouseButtons and QtXButton1) > 0 then
2770
Result := Result or StateDown;
2772
if (QApplication_mouseButtons and QtXButton2) > 0 then
2773
Result := Result or StateDown;
2775
if (QApplication_keyboardModifiers and QtAltModifier) > 0 then
2776
Result := Result or StateDown;
2778
if (QApplication_keyboardModifiers and QtShiftModifier) > 0 then
2779
Result := Result or StateDown;
2781
if (QApplication_keyboardModifiers and QtControlModifier) > 0 then
2782
Result := Result or StateDown;
2784
if (QApplication_keyboardModifiers and QtMetaModifier) > 0 then
2785
Result := Result or StateDown;
2786
{$ifdef VerboseQtWinAPI}
2788
DebugLn('TQtWidgetSet.GetKeyState TODO ', DbgSVKCode(Word(nVirtkey)));
2793
(*function TQtWidgetSet.GetMapMode(DC: HDC): Integer;
2795
if IsValidDC(DC) then
2796
Result := TQtDeviceContext(DC).vMapMode
2801
function TQtWidgetSet.GetMonitorInfo(Monitor: HMONITOR; lpmi: PMonitorInfo): Boolean;
2803
Desktop: QDesktopWidgetH;
2805
Result := (lpmi <> nil) and (lpmi^.cbSize >= SizeOf(TMonitorInfo)) or (Monitor = 0);
2806
if not Result then Exit;
2807
Desktop := QApplication_desktop();
2809
Result := (Monitor >= 0) and (Monitor < PtrUInt(QDesktopWidget_numScreens(Desktop)));
2810
if not Result then Exit;
2811
QDesktopWidget_screenGeometry(Desktop, @lpmi^.rcMonitor, Monitor);
2812
QDesktopWidget_availableGeometry(Desktop, @lpmi^.rcWork, Monitor);
2813
if PtrUInt(QDesktopWidget_primaryScreen(Desktop)) = Monitor then
2814
lpmi^.dwFlags := MONITORINFOF_PRIMARY
2819
{------------------------------------------------------------------------------
2820
Method: TQtWidgetSet.GetDeviceSize
2822
Returns: True if successful
2824
Return the size of a device
2825
------------------------------------------------------------------------------}
2826
function TQtWidgetSet.GetDeviceSize(DC: HDC; var P: TPoint): Boolean;
2828
{$ifdef VerboseQtWinAPI}
2829
WriteLn('[WinAPI GetDeviceSize]');
2837
if not IsValidDC(DC) then Exit;
2839
if (TObject(DC) is TQtDeviceContext) then
2840
P := TQtDeviceContext(DC).getDeviceSize;
2845
{------------------------------------------------------------------------------
2846
Method: TQtWidgetSet.GetObject
2848
Returns: The size written to the buffer
2850
Necessary for TBitmap support
2851
------------------------------------------------------------------------------}
2852
function TQtWidgetSet.GetObject(GDIObj: HGDIOBJ; BufSize: Integer; Buf: Pointer): Integer;
2854
QtPenStyleToWinStyleMap: array[QtPenStyle] of UINT =
2856
{ QtNoPen } PS_NULL,
2857
{ QtSolidLine } PS_SOLID,
2858
{ QtDashLine } PS_DASH,
2859
{ QtDotLine } PS_DOT,
2860
{ QtDashDotLine } PS_DASHDOT,
2861
{ QtDashDotDotLine } PS_DASHDOTDOT,
2862
{ QtCustomDashLine } PS_USERSTYLE
2866
AFont: TQtFont absolute aObject;
2867
APen: TQtPen absolute aObject;
2868
ABrush: TQtBrush absolute aObject;
2869
BitmapSection : TDIBSECTION;
2870
ALogFont: PLogFont absolute Buf;
2871
ALogPen: PLogPen absolute Buf;
2872
AExtLogPen: PExtLogPen absolute Buf;
2873
ALogBrush: PLogBrush absolute Buf;
2874
Dashes: TQRealArray;
2876
{$ifdef VerboseQtWinAPI}
2880
{$ifdef VerboseQtWinAPI}
2881
WriteLn('Trace:> [WinAPI GetObject] GDIObj: ' + dbghex(GDIObj));
2887
if not IsValidGDIObject(GDIObj) then
2889
{$ifdef VerboseQtWinAPI}
2890
WriteLn('Trace:< [WinAPI GetObject] Invalid GDI Object');
2896
aObject := TObject(GDIObj);
2898
{------------------------------------------------------------------------------
2900
------------------------------------------------------------------------------}
2901
if aObject is TQtFont then
2904
Result := SizeOf(TLogFont)
2906
if BufSize >= SizeOf(TLogFont) then
2908
Result := SizeOf(TLogFont);
2910
FillChar(ALogFont^, SizeOf(ALogFont^), 0);
2911
ALogFont^.lfHeight := AFont.getPixelSize;
2912
ALogFont^.lfEscapement := AFont.Angle;
2913
case AFont.getWeight of
2914
10: ALogFont^.lfWeight := FW_THIN;
2915
15: ALogFont^.lfWeight := FW_EXTRALIGHT;
2916
25: ALogFont^.lfWeight := FW_LIGHT;
2917
50: ALogFont^.lfWeight := FW_NORMAL;
2918
55: ALogFont^.lfWeight := FW_MEDIUM;
2919
63: ALogFont^.lfWeight := FW_SEMIBOLD;
2920
75: ALogFont^.lfWeight := FW_BOLD;
2921
80: ALogFont^.lfWeight := FW_EXTRABOLD;
2922
87: ALogFont^.lfWeight := FW_HEAVY;
2925
ALogFont^.lfItalic := Ord(AFont.getItalic) * High(Byte);
2926
ALogFont^.lfUnderline := Ord(AFont.getUnderline) * High(Byte);
2927
ALogFont^.lfStrikeOut := Ord(AFont.getStrikeOut) * High(Byte);
2928
ALogFont^.lfCharSet := DEFAULT_CHARSET;
2929
case AFont.getStyleStategy of
2930
QFontPreferMatch: ALogFont^.lfQuality := DRAFT_QUALITY;
2931
QFontPreferQuality: ALogFont^.lfQuality := PROOF_QUALITY;
2932
QFontNoAntialias: ALogFont^.lfQuality := NONANTIALIASED_QUALITY;
2933
QFontPreferAntialias: ALogFont^.lfQuality := ANTIALIASED_QUALITY;
2935
ALogFont^.lfQuality := DEFAULT_QUALITY;
2937
ALogFont^.lfFaceName := UTF16ToUTF8(AFont.getFamily);
2940
{------------------------------------------------------------------------------
2942
------------------------------------------------------------------------------}
2944
if aObject is TQtPen then
2946
if not APen.IsExtPen then
2949
Result := SizeOf(TLogPen)
2951
if BufSize >= SizeOf(TLogPen) then
2953
Result := SizeOf(TLogPen);
2954
TQColorToColorRef(APen.getColor, ALogPen^.lopnColor);
2955
if APen.getCosmetic then
2956
ALogPen^.lopnWidth := Point(1, 0)
2958
ALogPen^.lopnWidth := Point(APen.getWidth, 0);
2959
ALogPen^.lopnStyle := QtPenStyleToWinStyleMap[APen.getStyle];
2964
i := SizeOf(TExtLogPen);
2965
if APen.getStyle = QtCustomDashLine then
2967
Dashes := APen.getDashPattern;
2968
inc(i, (Length(Dashes) - 1) * SizeOf(DWord));
2975
if BufSize >= i then
2978
AExtLogPen^.elpPenStyle := QtPenStyleToWinStyleMap[APen.getStyle];
2980
if not APen.getCosmetic then
2982
AExtLogPen^.elpPenStyle := AExtLogPen^.elpPenStyle or PS_GEOMETRIC;
2984
case APen.getJoinStyle of
2985
QtMiterJoin: AExtLogPen^.elpPenStyle := AExtLogPen^.elpPenStyle or PS_JOIN_MITER;
2986
QtBevelJoin: AExtLogPen^.elpPenStyle := AExtLogPen^.elpPenStyle or PS_JOIN_BEVEL;
2987
QtRoundJoin: AExtLogPen^.elpPenStyle := AExtLogPen^.elpPenStyle or PS_JOIN_ROUND;
2990
case APen.getCapStyle of
2991
QtFlatCap: AExtLogPen^.elpPenStyle := AExtLogPen^.elpPenStyle or PS_ENDCAP_FLAT;
2992
QtSquareCap: AExtLogPen^.elpPenStyle := AExtLogPen^.elpPenStyle or PS_ENDCAP_SQUARE;
2993
QtRoundCap: AExtLogPen^.elpPenStyle := AExtLogPen^.elpPenStyle or PS_ENDCAP_ROUND;
2996
AExtLogPen^.elpWidth := APen.getWidth;
2999
AExtLogPen^.elpWidth := 1;
3001
AExtLogPen^.elpBrushStyle := BS_SOLID;
3002
TQColorToColorRef(APen.getColor, AExtLogPen^.elpColor);
3003
AExtLogPen^.elpHatch := 0;
3005
AExtLogPen^.elpNumEntries := Length(Dashes);
3006
if AExtLogPen^.elpNumEntries > 0 then
3008
for i := 0 to AExtLogPen^.elpNumEntries - 1 do
3009
PDword(@AExtLogPen^.elpStyleEntry)[i] := Trunc(Dashes[i]);
3012
AExtLogPen^.elpStyleEntry[0] := 0;
3016
{------------------------------------------------------------------------------
3018
------------------------------------------------------------------------------}
3020
if aObject is TQtRegion then
3022
{TODO: implement Region}
3023
{$ifdef VerboseQtWinAPI}
3024
ObjType := 'Region';
3027
{------------------------------------------------------------------------------
3029
------------------------------------------------------------------------------}
3030
if aObject is TQtBrush then
3033
Result := SizeOf(TLogBrush)
3035
if BufSize >= SizeOf(TLogBrush) then
3037
Result := SizeOf(TLogBrush);
3038
TQColorToColorRef(ABrush.getColor^, ALogBrush^.lbColor);
3039
ABrush.GetLbStyle(ALogBrush^.lbStyle, ALogBrush^.lbHatch);
3042
{------------------------------------------------------------------------------
3044
------------------------------------------------------------------------------}
3046
if aObject is TQtImage then
3048
{$ifdef VerboseQtWinAPI}
3053
Result := SizeOf(TDIBSECTION)
3056
BitmapSection.dsOffset := 0;
3057
FillChar(BitmapSection, SizeOf(TDIBSECTION), 0);
3059
with TQtImage(aObject) do
3062
BitmapSection.dsBm.bmType := $4D42;
3063
BitmapSection.dsBm.bmWidth := width;
3064
BitmapSection.dsBm.bmHeight := height;
3065
BitmapSection.dsBm.bmWidthBytes := bytesPerLine;
3066
BitmapSection.dsBm.bmPlanes := 1;//Does Bitmap Format support more?
3067
BitmapSection.dsBm.bmBitsPixel := depth;
3068
BitmapSection.dsBm.bmBits := bits;
3070
{dsBmih - BITMAPINFOHEADER}
3071
BitmapSection.dsBmih.biSize := 40;
3072
BitmapSection.dsBmih.biWidth := BitmapSection.dsBm.bmWidth;
3073
BitmapSection.dsBmih.biHeight := BitmapSection.dsBm.bmHeight;
3074
BitmapSection.dsBmih.biPlanes := BitmapSection.dsBm.bmPlanes;
3075
BitmapSection.dsBmih.biBitCount := BitmapSection.dsBm.bmBitsPixel;
3077
BitmapSection.dsBmih.biCompression := 0;
3079
BitmapSection.dsBmih.biSizeImage := numBytes;
3080
BitmapSection.dsBmih.biXPelsPerMeter := dotsPerMeterX;
3081
BitmapSection.dsBmih.biYPelsPerMeter := dotsPerMeterY;
3083
BitmapSection.dsBmih.biClrUsed := 0;
3084
BitmapSection.dsBmih.biClrImportant := 0;
3087
if BufSize >= SizeOf(BitmapSection) then
3089
PDIBSECTION(Buf)^ := BitmapSection;
3090
Result := SizeOf(TDIBSECTION);
3092
else if BufSize > 0 then
3094
Move(BitmapSection, Buf^, BufSize);
3100
{$ifdef VerboseQtWinAPI}
3101
WriteLn('Trace:< [WinAPI GetObject] Result=', dbgs(Result), ' ObjectType=', ObjType);
3105
function TQtWidgetSet.GetParent(Handle : HWND): HWND;
3107
QtWidget: TQtWidget;
3109
{$ifdef VerboseQtWinAPI}
3110
writeln('Trace:> [WinAPI GetParent] Handle: ' + dbghex(Handle));
3116
QtWidget := TQtWidget(Handle);
3118
Result := HwndFromWidgetH(QtWidget.GetParent);
3120
{$ifdef VerboseQtWinAPI}
3121
writeln('Trace:< [WinAPI GetParent] : ' + dbghex(Result));
3125
function TQtWidgetSet.GetProp(Handle: hwnd; Str: PChar): Pointer;
3128
result := TQtWidget(Handle).Props[str]
3133
function TQtWidgetSet.GetRgnBox(RGN : HRGN; lpRect : PRect) : Longint;
3137
{$ifdef VerboseQtWinAPI}
3138
writeln('Trace:> [WinAPI GetRgnBox] Handle: ' + dbghex(RGN));
3140
Result := SIMPLEREGION;
3141
if lpRect <> nil then
3142
lpRect^ := Rect(0,0,0,0);
3143
if not IsValidGDIObject(RGN) then
3147
Result := TQtRegion(RGN).GetRegionType;
3148
if not (Result in [ERROR, NULLREGION]) and (lpRect <> nil) then
3150
R := TQtRegion(RGN).getBoundingRect;
3155
Right := R.Left + R.Right;
3156
Bottom := R.Top + R.Bottom;
3162
function TQtWidgetSet.GetROP2(DC: HDC): Integer;
3164
QtDC: TQtDeviceContext absolute DC;
3166
{$ifdef VerboseQtWinAPI}
3167
writeln('> TQtWidgetSet.GetROP2() DC ',dbghex(DC));
3169
Result := R2_COPYPEN;
3170
if not IsValidDC(DC) then
3172
Result := QtDC.Rop2;
3173
{$ifdef VerboseQtWinAPI}
3174
writeln('< TQtWidgetSet.GetROP2() DC ',dbghex(DC),' Result ',Result);
3178
function TQtWidgetSet.GetScrollBarSize(Handle: HWND; BarKind: Integer): integer;
3181
ScrollBar: TQtScrollBar;
3183
{$ifdef VerboseQtWinAPI}
3184
writeln('Trace:> [WinAPI GetScrollBarSize] Handle: ' + dbghex(Handle),' BarKind: ',BarKind);
3187
if Handle = 0 then exit;
3189
w := TQtWidget(Handle);
3191
{TODO: find out what to do with TCustomForm descendants }
3192
if w is TQtAbstractScrollArea then
3194
if BarKind in [SM_CXVSCROLL, SM_CYVSCROLL] then
3195
ScrollBar := TQtAbstractScrollArea(w).verticalScrollBar
3197
ScrollBar := TQtAbstractScrollArea(w).horizontalScrollBar;
3199
if w is TQtScrollBar then
3200
ScrollBar := TQtScrollBar(w)
3203
if ScrollBar <> nil then
3205
if BarKind in [SM_CXHSCROLL, SM_CYVSCROLL] then
3206
Result := ScrollBar.getWidth
3208
Result := ScrollBar.getHeight;
3212
function TQtWidgetSet.GetScrollbarVisible(Handle: HWND; SBStyle: Integer): boolean;
3215
ScrollBar: TQtScrollBar;
3217
{$ifdef VerboseQtWinAPI}
3218
writeln('Trace:> [WinAPI GetScrollBarVisible] Handle: ' + dbghex(Handle),' SBStyle: ',SBStyle);
3221
if Handle = 0 then exit;
3223
w := TQtWidget(Handle);
3225
{TODO: find out what to do with TCustomForm descendants }
3226
if w is TQtAbstractScrollArea then
3228
if SBStyle = SB_VERT then
3229
ScrollBar := TQtAbstractScrollArea(w).verticalScrollBar
3231
ScrollBar := TQtAbstractScrollArea(w).horizontalScrollBar;
3233
if w is TQtScrollBar then
3234
ScrollBar := TQtScrollBar(w)
3238
if ScrollBar <> nil then
3239
Result := ScrollBar.getVisible;
3242
{------------------------------------------------------------------------------
3243
Function: GetScrollInfo
3245
SB_CTL Retrieves the parameters for a scroll bar control. The hwnd
3246
parameter must be the handle to the scroll bar control.
3247
SB_HORZ Retrieves the parameters for the window's standard horizontal
3249
SB_VERT Retrieves the parameters for the window's standard vertical
3252
ScrollInfo returns TScrollInfo structure.
3256
------------------------------------------------------------------------------}
3257
function TQtWidgetSet.GetScrollInfo(Handle: HWND; BarFlag: Integer; Var ScrollInfo: TScrollInfo): Boolean;
3259
QtScrollBar: TQtScrollBar;
3263
if Handle = 0 then exit;
3265
if (csDestroying in TQtWidget(Handle).LCLObject.ComponentState) or
3266
(csFreeNotification in TQtWidget(Handle).LCLObject.ComponentState) then
3271
if not TQtWidget(Handle).LCLObject.InheritsFrom(TCustomScrollBar) then
3273
if (TQtWidget(Handle) is TQtAbstractScrollArea) then
3276
SB_HORZ: QtScrollBar := TQtAbstractScrollArea(Handle).horizontalScrollBar;
3277
SB_VERT: QtScrollBar := TQtAbstractScrollArea(Handle).verticalScrollBar;
3283
QtScrollBar := TQtScrollBar(TScrollBar(TQtWidget(Handle).LCLObject).Handle);
3285
if Assigned(QtScrollBar) then
3288
if (ScrollInfo.fMask and SIF_POS) <> 0 then
3290
if QtScrollBar.ChildOfComplexWidget = ccwAbstractScrollArea then
3291
ScrollInfo.nPos := QtScrollBar.getSliderPosition
3293
ScrollInfo.nPos := QtScrollBar.getValue;
3297
if (ScrollInfo.fMask and SIF_RANGE) <> 0 then
3299
ScrollInfo.nMin:= QtScrollBar.getMin;
3300
ScrollInfo.nMax:= QtScrollBar.getMax + QtScrollBar.getPageStep;
3303
if (ScrollInfo.fMask and SIF_PAGE) <> 0 then
3304
ScrollInfo.nPage := QtScrollBar.getPageStep;
3307
if (ScrollInfo.fMask and SIF_TRACKPOS) <> 0 then
3308
ScrollInfo.nTrackPos := QtScrollBar.getSliderPosition;
3314
function TQtWidgetSet.GetStockObject(Value: Integer): THandle;
3316
{$ifdef VerboseQtWinAPI}
3317
WriteLn('Trace:> [WinAPI GetStockObject] Value: ', Value);
3323
BLACK_BRUSH: // Black brush.
3324
Result := FStockBlackBrush;
3325
DKGRAY_BRUSH: // Dark gray brush.
3326
Result := FStockDKGrayBrush;
3327
GRAY_BRUSH: // Gray brush.
3328
Result := FStockGrayBrush;
3329
LTGRAY_BRUSH: // Light gray brush.
3330
Result := FStockLtGrayBrush;
3331
NULL_BRUSH: // Null brush (equivalent to HOLLOW_BRUSH).
3332
Result := FStockNullBrush;
3333
WHITE_BRUSH: // White brush.
3334
Result := FStockWhiteBrush;
3336
BLACK_PEN: // Black pen.
3337
Result := FStockBlackPen;
3338
NULL_PEN: // Null pen.
3339
Result := FStockNullPen;
3340
WHITE_PEN: // White pen.
3341
Result := FStockWhitePen;
3343
{System font. By default, Windows uses the system font to draw menus,
3344
dialog box controls, and text. In Windows versions 3.0 and later,
3345
the system font is a proportionally spaced font; earlier versions of
3346
Windows used a monospace system font.}
3347
DEFAULT_GUI_FONT, SYSTEM_FONT:
3350
If FStockSystemFont <> 0 then
3352
DeleteObject(FStockSystemFont);
3353
FStockSystemFont := 0;
3356
If FStockSystemFont = 0 then
3357
FStockSystemFont := CreateDefaultFont;
3358
Result := FStockSystemFont;
3361
{$ifdef VerboseQtWinAPI}
3363
WriteLn('[WinAPI GetStockObject] UNHANDLED Value: ', Value);
3366
{$ifdef VerboseQtWinAPI}
3367
WriteLn('Trace:< [WinAPI GetStockObject] Value: ', Value);
3371
{------------------------------------------------------------------------------
3372
Function: TQtWidgetSet.GetSysColor
3373
Params: index to the syscolors array
3376
------------------------------------------------------------------------------}
3377
function TQtWidgetSet.GetSysColor(nIndex: Integer): DWORD;
3379
function GetColor(Group: QPaletteColorGroup; Role: QPaletteColorRole; ClassName: PAnsiChar = nil): TColor;
3385
Handle := QPalette_create;
3386
if ClassName = nil then
3387
QApplication_palette(Handle)
3389
QApplication_palette(Handle, ClassName);
3391
QColor := QPalette_color(Handle, Group, Role);
3392
QC := QColor_create(QColor);
3394
Result := (QColor_red(QC) and $00FF) or ((QColor_green(QC) and $00FF) shl 8) or ((QColor_blue(QC) and $00FF) shl 16);
3399
QPalette_destroy(Handle);
3403
if (nIndex < 0) or (nIndex > MAX_SYS_COLORS) then
3405
{$ifdef VerboseQtWinAPI}
3406
WriteLn('Trace:Unknown lcl system color: [TQtWidgetSet.GetSysColor]');
3412
if FCachedColors[nIndex] = nil then
3415
COLOR_SCROLLBAR : Result:=GetColor(QPaletteActive, QPaletteButton);
3416
COLOR_BACKGROUND : Result:=GetColor(QPaletteActive, QPaletteWindow);
3417
COLOR_WINDOW : Result:=GetColor(QPaletteInActive, QPaletteBase);
3418
COLOR_WINDOWFRAME : Result:=GetColor(QPaletteActive, QPaletteShadow);
3419
COLOR_WINDOWTEXT : Result:=GetColor(QPaletteActive, QPaletteWindowText);
3420
COLOR_ACTIVEBORDER : Result:=GetColor(QPaletteActive, QPaletteWindow);
3421
COLOR_INACTIVEBORDER : Result:=GetColor(QPaletteInactive, QPaletteWindow);
3422
COLOR_APPWORKSPACE : Result:=GetColor(QPaletteActive, QPaletteWindow);
3423
COLOR_HIGHLIGHT : Result:=GetColor(QPaletteActive, QPaletteHighlight);
3424
COLOR_HIGHLIGHTTEXT : Result:=GetColor(QPaletteActive, QPaletteHighlightedText);
3425
COLOR_BTNFACE : Result:=GetColor(QPaletteActive, QPaletteButton);
3426
COLOR_BTNSHADOW : Result:=GetColor(QPaletteActive, QPaletteDark);
3427
COLOR_GRAYTEXT : Result:=GetColor(QPaletteDisabled, QPaletteText);
3428
COLOR_BTNTEXT : Result:=GetColor(QPaletteActive, QPaletteButtonText);
3429
COLOR_BTNHIGHLIGHT : Result:=GetColor(QPaletteActive, QPaletteLight);
3430
COLOR_3DDKSHADOW : Result:=GetColor(QPaletteActive, QPaletteShadow);
3431
COLOR_3DLIGHT : Result:=GetColor(QPaletteActive, QPaletteMidlight);
3432
COLOR_INFOTEXT : Result:=GetColor(QPaletteInActive, QPaletteToolTipText);
3433
COLOR_INFOBK : Result:=GetColor(QPaletteInActive, QPaletteToolTipBase);
3434
COLOR_HOTLIGHT : Result:=GetColor(QPaletteActive, QPaletteLight);
3436
// qt does not provide any methods to retrieve titlebar colors
3438
COLOR_ACTIVECAPTION : Result:=GetColor(QPaletteActive, QPaletteHighlight);
3439
COLOR_INACTIVECAPTION : Result:=GetColor(QPaletteInActive, QPaletteHighlight);
3440
COLOR_CAPTIONTEXT : Result:=GetColor(QPaletteActive, QPaletteHighlightedText);
3441
COLOR_INACTIVECAPTIONTEXT : Result:=GetColor(QPaletteInactive, QPaletteHighlightedText);
3442
COLOR_GRADIENTACTIVECAPTION : Result:=GetColor(QPaletteActive, QPaletteBase);
3443
COLOR_GRADIENTINACTIVECAPTION : Result:=GetColor(QPaletteInactive, QPaletteBase);
3445
COLOR_ACTIVECAPTION : Result:=Windows.GetSysColor(COLOR_ACTIVECAPTION);
3446
COLOR_INACTIVECAPTION : Result:=Windows.GetSysColor(COLOR_INACTIVECAPTION);
3447
COLOR_CAPTIONTEXT : Result:=Windows.GetSysColor(COLOR_CAPTIONTEXT);
3448
COLOR_INACTIVECAPTIONTEXT : Result:=Windows.GetSysColor(COLOR_INACTIVECAPTIONTEXT);
3449
COLOR_GRADIENTACTIVECAPTION : Result:=Windows.GetSysColor(COLOR_GRADIENTACTIVECAPTION);
3450
COLOR_GRADIENTINACTIVECAPTION : Result:=Windows.GetSysColor(COLOR_GRADIENTINACTIVECAPTION);
3452
COLOR_MENU : Result:=GetColor(QPaletteActive, QPaletteButton, 'QMenu');
3453
COLOR_MENUTEXT : Result:=GetColor(QPaletteActive, QPaletteButtonText, 'QMenu');
3454
COLOR_MENUHILIGHT : Result:=GetColor(QPaletteDisabled, QPaletteHighlight, 'QMenu');
3455
COLOR_MENUBAR : Result:=GetColor(QPaletteActive, QPaletteButton, 'QMenu');
3456
COLOR_FORM : Result:=GetColor(QPaletteActive, QPaletteWindow);
3460
FCachedColors[nIndex] := getMem(SizeOf(LongWord));
3461
FCachedColors[nIndex]^ := Result;
3464
Result := FCachedColors[nIndex]^;
3467
function TQtWidgetSet.GetSysColorBrush(nIndex: Integer): HBrush;
3469
function GetBrush(Group: QPaletteColorGroup; Role: QPaletteColorRole; ClassName: PAnsiChar = nil): HBrush;
3473
Handle := QPalette_create;
3474
if ClassName = nil then
3475
QApplication_palette(Handle)
3477
QApplication_palette(Handle, ClassName);
3478
if FSysColorBrushes[nIndex] = 0 then
3479
Result := HBrush(TQtBrush.Create(False))
3481
Result := FSysColorBrushes[nIndex];
3482
TQtBrush(Result).FHandle := QBrush_create(QPalette_brush(Handle, Group, Role));
3483
TQtBrush(Result).FShared := True;
3485
QPalette_destroy(Handle);
3488
function GetSolidBrush(AColor: TColor): HBrush;
3492
if FSysColorBrushes[nIndex] = 0 then
3493
Result := HBrush(TQtBrush.Create(True))
3495
Result := FSysColorBrushes[nIndex];
3496
Color := QBrush_Color(TQtBrush(Result).FHandle)^;
3497
ColorRefToTQColor(ColorToRGB(AColor), Color);
3498
QBrush_setColor(TQtBrush(Result).FHandle, @Color);
3499
TQtBrush(Result).FShared := True;
3503
if (nIndex < 0) or (nIndex > MAX_SYS_COLORS) then
3509
if (FSysColorBrushes[nIndex] = 0) or
3511
(FSysColorBrushes[nIndex] <> 0) and
3512
(TQtBrush(FSysColorBrushes[nIndex]).FHandle = nil)
3516
COLOR_SCROLLBAR : Result:=GetBrush(QPaletteActive, QPaletteButton);
3517
COLOR_BACKGROUND : Result:=GetBrush(QPaletteActive, QPaletteWindow);
3518
COLOR_WINDOW : Result:=GetBrush(QPaletteInActive, QPaletteBase);
3519
COLOR_WINDOWFRAME : Result:=GetBrush(QPaletteActive, QPaletteShadow);
3520
COLOR_WINDOWTEXT : Result:=GetBrush(QPaletteActive, QPaletteWindowText);
3521
COLOR_ACTIVEBORDER : Result:=GetBrush(QPaletteActive, QPaletteWindow);
3522
COLOR_INACTIVEBORDER : Result:=GetBrush(QPaletteInactive, QPaletteWindow);
3523
COLOR_APPWORKSPACE : Result:=GetBrush(QPaletteActive, QPaletteWindow);
3524
COLOR_HIGHLIGHT : Result:=GetBrush(QPaletteActive, QPaletteHighlight);
3525
COLOR_HIGHLIGHTTEXT : Result:=GetBrush(QPaletteActive, QPaletteHighlightedText);
3526
COLOR_BTNFACE : Result:=GetBrush(QPaletteActive, QPaletteButton);
3527
COLOR_BTNSHADOW : Result:=GetBrush(QPaletteActive, QPaletteDark);
3528
COLOR_GRAYTEXT : Result:=GetBrush(QPaletteActive, QPaletteText);
3529
COLOR_BTNTEXT : Result:=GetBrush(QPaletteActive, QPaletteButtonText);
3530
COLOR_BTNHIGHLIGHT : Result:=GetBrush(QPaletteActive, QPaletteLight);
3531
COLOR_3DDKSHADOW : Result:=GetBrush(QPaletteActive, QPaletteShadow);
3532
COLOR_3DLIGHT : Result:=GetBrush(QPaletteActive, QPaletteMidlight);
3533
COLOR_INFOTEXT : Result:=GetBrush(QPaletteInActive, QPaletteToolTipText);
3534
COLOR_INFOBK : Result:=GetBrush(QPaletteInActive, QPaletteToolTipBase);
3535
COLOR_HOTLIGHT : Result:=GetBrush(QPaletteActive, QPaletteLight);
3537
// qt does not provide any methods to retrieve titlebar colors
3539
COLOR_ACTIVECAPTION : Result:=GetBrush(QPaletteActive, QPaletteHighlight);
3540
COLOR_INACTIVECAPTION : Result:=GetBrush(QPaletteInActive, QPaletteHighlight);
3541
COLOR_CAPTIONTEXT : Result:=GetBrush(QPaletteActive, QPaletteHighlightedText);
3542
COLOR_INACTIVECAPTIONTEXT : Result:=GetBrush(QPaletteInactive, QPaletteHighlightedText);
3543
COLOR_GRADIENTACTIVECAPTION : Result:=GetBrush(QPaletteActive, QPaletteBase);
3544
COLOR_GRADIENTINACTIVECAPTION : Result:=GetBrush(QPaletteInactive, QPaletteBase);
3546
COLOR_ACTIVECAPTION : Result:=GetSolidBrush(Windows.GetSysColor(COLOR_ACTIVECAPTION));
3547
COLOR_INACTIVECAPTION : Result:=GetSolidBrush(Windows.GetSysColor(COLOR_INACTIVECAPTION));
3548
COLOR_CAPTIONTEXT : Result:=GetSolidBrush(Windows.GetSysColor(COLOR_CAPTIONTEXT));
3549
COLOR_INACTIVECAPTIONTEXT : Result:=GetSolidBrush(Windows.GetSysColor(COLOR_INACTIVECAPTIONTEXT));
3550
COLOR_GRADIENTACTIVECAPTION : Result:=GetSolidBrush(Windows.GetSysColor(COLOR_GRADIENTACTIVECAPTION));
3551
COLOR_GRADIENTINACTIVECAPTION : Result:=GetSolidBrush(Windows.GetSysColor(COLOR_GRADIENTINACTIVECAPTION));
3553
COLOR_MENU : Result:=GetBrush(QPaletteActive, QPaletteButton, 'QMenu');
3554
COLOR_MENUTEXT : Result:=GetBrush(QPaletteActive, QPaletteButtonText, 'QMenu');
3555
COLOR_MENUHILIGHT : Result:=GetBrush(QPaletteDisabled, QPaletteHighlight, 'QMenu');
3556
COLOR_MENUBAR : Result:=GetBrush(QPaletteActive, QPaletteButton, 'QMenu');
3557
COLOR_FORM : Result:=GetBrush(QPaletteActive, QPaletteWindow);
3561
FSysColorBrushes[nIndex] := Result;
3564
Result := FSysColorBrushes[nIndex];
3567
{------------------------------------------------------------------------------
3568
Function: GetSystemMetrics
3573
------------------------------------------------------------------------------}
3574
function TCDWidgetSet.GetSystemMetrics(nIndex: Integer): Integer;
3578
{$ifdef VerboseCDWinAPI}
3579
DebugLn(Format(':>[TCDWidgetSet.GetSystemMetrics] nIndex=%d javaEnvRef=%x', [nIndex, PtrInt(javaEnvRef)]));
3585
{$ifdef VerboseQtWinAPI}
3586
WriteLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_ARRANGE ');
3591
{$ifdef VerboseQtWinAPI}
3592
WriteLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CLEANBOOT ');
3599
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CMOUSEBUTTONS ');
3601
{ SM_CXBORDER, SM_CYBORDER:
3603
// size of frame around controls
3604
Result := QStyle_pixelMetric(QApplication_style(),
3605
QStylePM_DefaultFrameWidth, nil, nil);
3609
Result := 32; // recomended in docs
3613
Result := 32; // recomended in docs
3617
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXDOUBLECLK ');
3621
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYDOUBLECLK ');
3641
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXFIXEDFRAME ');
3645
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYFIXEDFRAME ');
3649
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXFULLSCREEN ');
3653
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYFULLSCREEN ');
3657
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXHTHUMB ');
3666
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXICONSPACING ');
3670
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYICONSPACING ');
3674
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXMAXIMIZED ');
3678
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMAXIMIZED ');
3682
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXMAXTRACK ');
3686
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMAXTRACK ');
3690
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXMENUCHECK ');
3694
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMENUCHECK ');
3698
Result := QStyle_pixelMetric(QApplication_style(), QStylePM_IndicatorWidth, nil, nil);
3702
Result := QStyle_pixelMetric(QApplication_style(), QStylePM_IndicatorHeight, nil, nil);
3706
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXMIN ');
3710
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMIN ');
3714
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXMINIMIZED ');
3718
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMINIMIZED ');
3722
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXMINSPACING ');
3726
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMINSPACING ');
3730
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXMINTRACK ');
3734
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMINTRACK ');
3738
Result := 100; // avoid errors if this is called too early
3739
if javaEnvRef = nil then Exit;
3740
Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclscreenwidth);
3741
if Result = 0 then Result := 100;
3745
Result := 100; // avoid errors if this is called too early
3746
if javaEnvRef = nil then Exit;
3747
Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclscreenheight);
3748
if Result = 0 then Result := 100;
3752
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXSIZE ');
3756
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYSIZE ');
3761
Result := QStyle_pixelMetric(QApplication_style(), QStylePM_MDIFrameWidth, nil, nil);
3770
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CXSMSIZE ');
3774
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYSMSIZE ');
3778
if javaEnvRef = nil then Exit;
3779
Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclscreenwidth);
3783
if javaEnvRef = nil then Exit;
3784
Result := javaEnvRef^^.GetLongField(javaEnvRef, javaActivityObject, javaField_lclscreenheight);
3791
Result := QStyle_pixelMetric(QApplication_Style, QStylePM_ScrollBarExtent, nil, nil);
3795
Result := QStyle_pixelMetric(QApplication_Style, QStylePM_TitleBarHeight, nil, nil);
3799
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYKANJIWINDOW ');
3803
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYMENU ');
3807
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYSMCAPTION ');
3811
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_CYVTHUMB ');
3815
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_DBCSENABLED ');
3819
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_DEBUG ');
3821
SM_MENUDROPALIGNMENT:
3823
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_MENUDROPALIGNMENT');
3827
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_MIDEASTENABLED ');
3831
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_MOUSEPRESENT ');
3833
SM_MOUSEWHEELPRESENT:
3835
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_MOUSEWHEELPRESENT');
3839
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_NETWORK ');
3843
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_PENWINDOWS ');
3847
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_SECURE ');
3851
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_SHOWSOUNDS ');
3855
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_SLOWMACHINE ');
3859
//DebugLn('Trace:TODO: [TQtWidgetSet.GetSystemMetrics] --> SM_SWAPBUTTON ');
3862
{$ifdef VerboseCDWinAPI}
3863
DebugLn(':<[TCDWidgetSet.GetSystemMetrics] Result=' + dbghex(Result));
3867
{$ifdef CD_UseNativeText}
3868
{------------------------------------------------------------------------------
3869
Function: GetTextExtentExPoint
3870
Params: http://msdn.microsoft.com/en-us/library/dd144935%28VS.85%29.aspx
3871
Returns: True on success
3872
------------------------------------------------------------------------------}
3873
function TCDWidgetSet.GetTextExtentExPoint(DC: HDC; Str: PChar; Count,
3874
MaxWidth: Integer; MaxCount, PartialWidths: PInteger; var Size: TSize
3877
LazDC: TLazCanvas absolute DC;
3880
arraydata_obj: JFloatArray;
3884
lJavaString: jstring;
3887
{$ifdef VerboseCDText}
3888
DebugLn(Format('[WinAPI GetTextExtentExPoint] DC=%x javaEnvRef=%x Str=%s MaxWidth=%d',
3889
[DC, PtrInt(javaEnvRef), StrPas(Str), MaxWidth]));
3891
// Result := inherited GetTextExtentExPoint(DC, Str, Count, MaxWidth, MaxCount, PartialWidths, Size);
3895
if not IsValidDC(DC) then Exit;
3897
lTextStr := StrPas(Str);
3898
if Count <> Length(lTextStr) then SetLength(lTextStr, Count);
3900
if (LazDC.Font = nil) or (LazDC.Font.Size = 0) then lFontSize := DefaultFontAndroidSize
3901
else lFontSize := LazDC.Font.Size;
3903
if (javaEnvRef = nil) then Exit;
3905
// Prepare the input
3906
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(lTextStr));
3907
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lcltext, lJavaString);
3908
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, javaField_lcltextsize, lFontSize);
3909
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, javaField_lclmaxwidth, MaxWidth);
3912
javaEnvRef^^.CallVoidMethod(javaEnvRef, javaActivityObject, javaMethod_LCLDoGetTextPartialWidths);
3915
lMaxCount := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lclmaxcount);
3916
{$ifdef VerboseCDText}
3917
DebugLn(Format(':[WinAPI GetTextExtentExPoint] MaxCount=%d', [lMaxCount]));
3920
if MaxCount <> nil then MaxCount^ := lMaxCount;
3922
if PartialWidths <> nil then
3925
// Get the object field, returns JObject (because Array is instance of Object)
3926
arraydata_obj := javaEnvRef^^.GetObjectField(javaEnvRef, javaActivityObject, javaField_lclpartialwidths);
3927
// Get the elements (you probably have to fetch the length of the array as well
3928
arraydata := javaEnvRef^^.GetFloatArrayElements(javaEnvRef, arraydata_obj, lIsCopy);
3930
for i := 0 to lMaxCount-1 do
3932
PartialWidths[i] := Round(arraydata[i]);
3933
{$ifdef VerboseCDText}
3934
DebugLn(Format(':[WinAPI GetTextExtentExPoint] i=%d PartialWidth=%d',
3935
[i, PartialWidths[i]]));
3939
// Don't forget to release it
3940
javaEnvRef^^.ReleaseFloatArrayElements(javaEnvRef, arraydata_obj, arraydata, 0);
3943
// Now calculate the general size
3944
GetTextExtentPoint(DC, PChar(lTextStr), lMaxCount, Size);
3947
{------------------------------------------------------------------------------
3948
Function: GetTextExtentPoint
3951
------------------------------------------------------------------------------}
3952
function TCDWidgetSet.GetTextExtentPoint(DC: HDC; Str: PChar; Count: Integer; var Size: TSize): Boolean;
3954
lJavaString: jstring;
3958
{$ifdef VerboseCDText}
3959
DebugLn(Format('[WinAPI GetTextExtentPoint] DC=%x javaEnvRef=%x', [DC, PtrInt(javaEnvRef)]));
3964
if not IsValidDC(DC) then Exit;
3965
LazDC := TLazCanvas(DC);
3967
if (LazDC.Font = nil) or (LazDC.Font.Size = 0) then lFontSize := DefaultFontAndroidSize
3968
else lFontSize := LazDC.Font.Size;
3970
if (javaEnvRef = nil) then Exit;
3972
// Prepare the input
3973
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, Str);
3974
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lcltext, lJavaString);
3975
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, javaField_lcltextsize, lFontSize);
3978
javaEnvRef^^.CallVoidMethod(javaEnvRef, javaActivityObject, javaMethod_LCLDoGetTextBounds);
3981
Size.cx := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lclwidth);
3982
Size.cy := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lclheight);
3984
{$ifdef VerboseCDText}
3985
DebugLn(Format('[WinAPI GetTextExtentPoint] Size=%d, %d', [Size.cx, Size.cy]));
3991
{------------------------------------------------------------------------------
3992
Function: GetTextMetrics
3993
Params: DC - A device context with a font selected
3994
TM - The structure to receive the font information
3995
Returns: If successfull
3996
------------------------------------------------------------------------------}
3997
function TCDWidgetSet.GetTextMetrics(DC: HDC; var TM: TTextMetric): Boolean;
3999
lAverageCharWidth: Integer;
4000
lJavaString: jstring;
4004
{$ifdef VerboseCDText}
4005
DebugLn(Format('[WinAPI GetTextMetrics] DC=%x javaEnvRef=%x', [DC, PtrInt(javaEnvRef)]));
4010
if not IsValidDC(DC) then Exit;
4011
LazDC := TLazCanvas(DC);
4013
if (LazDC.Font = nil) or (LazDC.Font.Size = 0) then lFontSize := DefaultFontAndroidSize
4014
else lFontSize := LazDC.Font.Size;
4016
if (javaEnvRef = nil) then Exit;
4018
// Prepare the input for getting the average width of a char
4019
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar('x'));
4020
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lcltext, lJavaString);
4021
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, javaField_lcltextsize, lFontSize);
4024
javaEnvRef^^.CallVoidMethod(javaEnvRef, javaActivityObject, javaMethod_LCLDoGetTextBounds);
4026
lAverageCharWidth := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lclwidth);
4028
// Prepare the input for getting the max height of a text and other metrics
4029
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar('Íg'));
4030
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lcltext, lJavaString);
4031
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, javaField_lcltextsize, lFontSize);
4034
javaEnvRef^^.CallVoidMethod(javaEnvRef, javaActivityObject, javaMethod_LCLDoGetTextBounds);
4037
TM.tmHeight := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lclheight);
4038
TM.tmAscent := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lcltextascent);
4039
TM.tmDescent := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lcltextdescent);
4040
TM.tmInternalLeading := 0;
4041
TM.tmExternalLeading := javaEnvRef^^.GetIntField(javaEnvRef, javaActivityObject, javaField_lcltextleading);
4042
TM.tmAveCharWidth := lAverageCharWidth;
4043
TM.tmMaxCharWidth := TM.tmAveCharWidth; // Just a not very good guess for now
4044
{ FontWeight := QtDC.font.getWeight;
4046
25: TM.tmWeight := FW_LIGHT;
4047
50: TM.tmWeight := FW_NORMAL;
4048
63: TM.tmWeight := FW_SEMIBOLD;
4049
75: TM.tmWeight := FW_BOLD;
4050
87: TM.tmWeight := FW_HEAVY;
4052
TM.tmWeight := Round(FontWeight * 9.5);
4055
TM.tmDigitizedAspectX := 0;
4056
TM.tmDigitizedAspectY := 0;
4057
TM.tmFirstChar := 'a';
4058
TM.tmLastChar := 'z';
4059
TM.tmDefaultChar := 'x';
4060
TM.tmBreakChar := '?';
4061
{ TM.tmItalic := Ord(QtDC.Font.getItalic);
4062
TM.tmUnderlined := Ord(QtDC.Font.getUnderline);
4063
TM.tmStruckOut := Ord(QtDC.Font.getStrikeOut);}
4065
{ Defaults to a TrueType font.
4066
Note that the meaning of the FIXED_PITCH constant is the opposite of
4067
the name implies, according to MSDN docs. Just a small inconsistency
4068
on Windows API that we have to mimic. }
4069
{if QtDC.font.fixedPitch then
4070
TM.tmPitchAndFamily := TRUETYPE_FONTTYPE
4072
TM.tmPitchAndFamily := FIXED_PITCH or TRUETYPE_FONTTYPE;
4074
TM.tmCharSet := DEFAULT_CHARSET;
4080
(*function TQtWidgetSet.GetViewPortExtEx(DC: HDC; Size: PSize): Integer;
4084
if IsValidDC(DC) and (Size <> nil) then
4086
QPainter_ViewPort(TQtDeviceContext(DC).Widget, @R);
4087
Size^.cx := R.Right - R.Left;
4088
Size^.cy := R.Bottom - R.Top;
4089
Result := Integer(True);
4091
Result := Integer(False);
4094
function TQtWidgetSet.GetViewPortOrgEx(DC: HDC; P: PPoint): Integer;
4098
if IsValidDC(DC) and (P <> nil) then
4100
QPainter_ViewPort(TQtDeviceContext(DC).Widget, @R);
4102
Result := Integer(True);
4104
Result := Integer(False);
4107
function TQtWidgetSet.GetWindowExtEx(DC: HDC; Size: PSize): Integer;
4111
if IsValidDC(DC) and (Size <> nil) then
4113
QPainter_Window(TQtDeviceContext(DC).Widget, @R);
4114
Size^.cx := R.Right - R.Left;
4115
Size^.cy := R.Bottom - R.Top;
4116
Result := Integer(True);
4118
Result := Integer(False);
4121
function TQtWidgetSet.GetWindowLong(Handle : hwnd; int: Integer): PtrInt;
4124
{$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION}
4125
WriteLn('***** [WinAPI TQtWidgetSet.GetWindowLong] missing implementation ');
4129
{------------------------------------------------------------------------------
4130
Method: GetWindowOrgEx
4133
------------------------------------------------------------------------------}
4134
function TQtWidgetSet.GetWindowOrgEx(dc: hdc; P: PPoint): Integer;
4136
Matrix: QTransformH;
4138
{$ifdef VerboseQtWinAPI}
4139
WriteLn('Trace: > [WinAPI GetWindowOrgEx]');
4142
if not IsValidDC(DC) and (P<>nil) then
4144
{$ifdef VerboseQtWinAPI}
4145
WriteLn('Trace: < [WinAPI GetWindowOrgEx] No valid DC or P is nil');
4150
Matrix := QPainter_transform(TQtDeviceContext(DC).Widget);
4151
if Matrix <> nil then
4153
P^.X := -Trunc(QTransform_Dx(Matrix));
4154
P^.Y := -Trunc(QTransform_Dy(Matrix));
4157
{$ifdef VerboseQtWinAPI}
4158
WriteLn('Trace: < [WinAPI GetWindowOrgEx] Result=', dbgs(p^));
4163
{------------------------------------------------------------------------------
4164
Method: GetWindowRect
4165
Params: Handle - handle of window
4166
Rect - record for window coordinates
4167
Returns: if the function succeeds, the return value is nonzero; if the
4168
function fails, the return value is zero
4170
Retrieves the dimensions of the bounding rectangle of the specified window.
4171
------------------------------------------------------------------------------}
4172
function TQtWidgetSet.GetWindowRect(Handle: HWND; var ARect: TRect): Integer;
4177
{$ifdef VerboseQtWinAPI}
4178
WriteLn('[WinAPI GetWindowRect]');
4182
if not IsValidHandle(Handle) then
4184
APos := QtPoint(0,0);
4185
QWidget_mapToGlobal(TQtWidget(Handle).Widget, @APos, @APos);
4187
R := TQtWidget(Handle).getFrameGeometry;
4188
ARect := Bounds(APos.X,APos.Y,R.Right-R.Left,R.Bottom-R.Top);
4193
{------------------------------------------------------------------------------
4194
Function: GetWindowRelativePosition
4195
Params: Handle : HWND;
4196
Returns: true on success
4198
returns the current widget Left, Top, relative to the client origin of its
4200
------------------------------------------------------------------------------}
4201
function TCDWidgetSet.BackendGetWindowRelativePosition(Handle: HWND; var Left, Top: integer): boolean;
4203
{$ifdef VerboseCDWinAPI}
4204
DebugLn('[WinAPI BackendGetWindowRelativePosition]');
4212
{------------------------------------------------------------------------------
4213
Function: GetWindowSize
4214
Params: Handle : hwnd;
4215
Returns: true on success
4217
Returns the current widget Width and Height
4218
------------------------------------------------------------------------------}
4219
function TCDWidgetSet.BackendGetWindowSize(Handle: hwnd; var Width, Height: integer): boolean;
4223
{$ifdef VerboseCDWinAPI}
4224
DebugLn('[WinAPI BackendGetWindowSize]');
4226
if Handle = 0 then Exit(False);
4227
lForm := TCDForm(handle);
4228
if lForm.Image = nil then Exit(False);
4230
Width := lForm.Image.Width;
4231
Height := lForm.Image.Height;
4236
(*{------------------------------------------------------------------------------
4237
Function: GradientFill
4238
Params: DC - DeviceContext to perform on
4239
Vertices - array of Points W/Color & Alpha
4240
NumVertices - Number of Vertices
4241
Meshes - array of Triangle or Rectangle Meshes,
4242
each mesh representing one Gradient Fill
4243
NumMeshes - Number of Meshes
4244
Mode - Gradient Type, either Triangle,
4245
Vertical Rect, Horizontal Rect
4247
Returns: true on success
4249
Performs multiple Gradient Fills, either a Three way Triangle Gradient,
4250
or a two way Rectangle Gradient, each Vertex point also supports optional
4251
Alpha/Transparency for more advanced Gradients.
4252
------------------------------------------------------------------------------}
4253
function TQtWidgetSet.GradientFill(DC: HDC; Vertices: PTriVertex;
4254
NumVertices : Longint;
4255
Meshes: Pointer; NumMeshes : Longint; Mode : Longint): boolean;
4257
function DoFillTriangle: Boolean; inline;
4259
Result := (Mode and GRADIENT_FILL_TRIANGLE) = GRADIENT_FILL_TRIANGLE;
4262
function DoFillVRect: Boolean; inline;
4264
Result := (Mode and GRADIENT_FILL_RECT_V) = GRADIENT_FILL_RECT_V;
4267
function VertexToColor(AVertex: tagTRIVERTEX): TQColor;
4271
TheAlpha := AVertex.Alpha shr 8;
4272
if TheAlpha = 0 then
4275
QColor_fromRgb(@Result, Red shr 8, Green shr 8, Blue shr 8, TheAlpha);
4278
function FillTriMesh(Mesh: tagGradientTriangle) : Boolean;
4280
V1, V2, V3: tagTRIVERTEX;
4281
C1, C2, C3: TQColor;
4282
Grad: QConicalGradientH;
4284
Triangle: QPolygonH;
4292
(Vertex1 < Cardinal(NumVertices)) and (Vertex2 >= 0) and
4293
(Vertex2 < Cardinal(NumVertices)) and (Vertex2 >= 0) and
4294
(Vertex3 < Cardinal(NumVertices)) and (Vertex3 >= 0);
4296
if (Vertex1 = Vertex2) or
4297
(Vertex1 = Vertex3) or
4298
(Vertex2 = Vertex3) or not Result then
4301
V1 := Vertices[Vertex1];
4302
V2 := Vertices[Vertex2];
4303
V3 := Vertices[Vertex3];
4305
Painter := TQtDeviceContext(DC).Widget;
4306
QPainter_save(Painter);
4307
Triangle := QPolygon_create(3);
4308
QPolygon_setPoint(Triangle, 0, V1.X, V1.Y);
4309
QPolygon_setPoint(Triangle, 1, V2.X, V2.Y);
4310
QPolygon_setPoint(Triangle, 2, V3.X, V3.Y);
4311
QPolygon_boundingRect(Triangle, @R);
4316
Rgn := QRegion_create(@R);
4318
// make our poly clip region , so gradient center is at real center
4319
QPainter_setClipRegion(Painter, Rgn, QtIntersectClip);
4321
Grad := QConicalGradient_create(R.Right div 2, R.Bottom div 2, 90);
4322
C1 := VertexToColor(V1);
4323
C2 := VertexToColor(V2);
4324
C3 := VertexToColor(V3);
4326
QGradient_setColorAt(Grad, 0.0, @C1); // open
4327
QGradient_setColorAt(Grad, 0.33, @C2); // left corner
4328
QGradient_setColorAt(Grad, 0.66, @C3); // right corner
4329
QGradient_setColorAt(Grad, 1.0, @C1); // close
4332
Brush := QBrush_create(Grad);
4333
QPainter_setPen(Painter, QtNoPen);
4334
QPainter_setBrush(Painter, Brush);
4336
// move center point down, so we remove reflections of C2 and C3
4337
// TODO: C1 reflection is still visible
4338
QPainter_setBrushOrigin(Painter, 0, R.Bottom div 5);
4339
QPainter_drawPolygon(Painter, Triangle);
4341
//TODO: now me must make it look "softer" because reflection look of
4342
// first color is ugly.
4344
QBrush_destroy(Brush);
4345
QPolygon_destroy(Triangle);
4346
QGradient_destroy(Grad);
4347
QRegion_destroy(Rgn);
4348
QPainter_restore(Painter);
4353
function FillRectMesh(Mesh: tagGradientRect) : boolean;
4355
TL,BR: tagTRIVERTEX;
4356
StartColor, EndColor, SwapColor: TQColor;
4358
SwapColors: Boolean;
4365
(UpperLeft < Cardinal(NumVertices)) and (UpperLeft >= 0) and
4366
(LowerRight < Cardinal(NumVertices)) and (LowerRight >= 0);
4367
if (LowerRight = UpperLeft) or not Result then
4370
TL := Vertices[UpperLeft];
4371
BR := Vertices[LowerRight];
4372
SwapColors := (BR.Y < TL.Y) and (BR.X < TL.X);
4385
StartColor := VertexToColor(TL);
4386
EndColor := VertexToColor(BR);
4389
SwapColor := StartColor;
4390
StartColor := EndColor;
4391
EndColor := SwapColor;
4394
Grad := QLinearGradient_create(TL.X, TL.Y, TL.X, BR.Y)
4396
Grad := QLinearGradient_create(TL.X, TL.Y, BR.X, TL.Y);
4397
QGradient_setColorAt(Grad, 0, @StartColor);
4398
QGradient_setColorAt(Grad, 1, @EndColor);
4399
Brush := QBrush_create(Grad);
4400
TQtDeviceContext(DC).fillRect(TL.X, TL.Y, BR.X - TL.X, BR.Y - TL.Y, Brush);
4401
QGradient_destroy(Grad);
4402
QBrush_destroy(Brush);
4407
MeshSize: Array[Boolean] of Integer = (
4408
SizeOf(tagGradientRect), SizeOf(tagGradientTriangle));
4412
{$ifdef VerboseQtWinAPI}
4413
WriteLn('***** [WinAPI TQtWidgetSet.GradientFill] ');
4416
//Currently Alpha blending is ignored... Ideas anyone?
4417
Result := (Meshes <> nil) and (NumMeshes >= 1) and (NumVertices >= 2)
4418
and (Vertices <> nil);
4419
if Result and DoFillTriangle then
4420
Result := NumVertices >= 3;
4425
//Sanity Checks For Vertices Size vs. Count
4426
if MemSize(Vertices) < PtrUInt(SizeOf(tagTRIVERTEX)*NumVertices) then
4429
//Sanity Checks For Meshes Size vs. Count
4430
if MemSize(Meshes) < PtrUInt(MeshSize[DoFillTriangle]*NumMeshes) then
4433
for I := 0 to NumMeshes - 1 do
4435
if DoFillTriangle then
4437
if not FillTriMesh(PGradientTriangle(Meshes)[I]) then
4442
if not FillRectMesh(PGradientRect(Meshes)[I]) then
4450
function TQtWidgetSet.HideCaret(hWnd: HWND): Boolean;
4452
Result := (hWnd <> 0) and QtCaret.HideCaret(TQtWidget(hWnd));
4455
{------------------------------------------------------------------------------
4456
Procedure: InitializeCriticalSection
4457
Params: var CritSection: TCriticalSection
4459
------------------------------------------------------------------------------}
4460
procedure TQtWidgetSet.InitializeCriticalSection(var CritSection: TCriticalSection);
4462
ACritSec: System.PRTLCriticalSection;
4465
System.InitCriticalSection(ACritSec^);
4466
CritSection:=TCriticalSection(ACritSec);
4469
function TQtWidgetSet.IntersectClipRect(dc: hdc; Left, Top, Right, Bottom: Integer): Integer;
4471
QtDC: TQtDeviceContext absolute dc;
4472
IntersectRgn, Rgn: QRegionH;
4474
{$ifdef VerboseQtWinAPI}
4475
WriteLn('[WinAPI TQtWidgetSet.IntersectClipRect] L ',Left,' T ',Top,' R ',Right,' B ',Bottom);
4478
if not IsValidDC(DC) then exit;
4480
IntersectRgn := QRegion_create(Left, Top, Right - Left, Bottom - Top);
4482
if QtDC.getClipping then
4484
Rgn := QRegion_create;
4486
QPainter_clipRegion(QtDC.Widget, Rgn);
4487
if QRegion_isEmpty(Rgn) then
4488
QtDC.setClipRegion(IntersectRgn)
4490
QtDC.setClipRegion(IntersectRgn, QtIntersectClip);
4491
QtDC.setClipping(True);
4493
QRegion_destroy(Rgn);
4494
Rgn := QRegion_create;
4495
QPainter_clipRegion(QtDC.Widget, Rgn);
4496
Result := QtDC.GetRegionType(Rgn);
4498
QRegion_destroy(Rgn);
4502
QtDC.setClipRegion(InterSectRgn);
4503
QtDC.setClipping(True);
4504
Result := QtDC.GetRegionType(InterSectRgn);
4507
QRegion_destroy(IntersectRgn);
4511
function TQtWidgetSet.IsIconic(Handle: HWND): boolean;
4513
Result := TQtWidget(Handle).isMinimized;
4516
function TQtWidgetSet.IsWindow(handle: HWND): boolean;
4518
Result := IsValidHandle(Handle);
4521
function TQtWidgetSet.IsWindowEnabled(Handle: HWND): boolean;
4523
Result := TQtWidget(Handle).getEnabled;
4526
function TQtWidgetSet.IsWindowVisible(Handle: HWND): boolean;
4528
Result := TQtWidget(Handle).getVisible;
4531
function TQtWidgetSet.IsZoomed(Handle: HWND): boolean;
4533
Result := TQtWidget(Handle).isMaximized;
4536
{------------------------------------------------------------------------------
4537
Function: InvalidateRect
4543
------------------------------------------------------------------------------}
4544
function TCDWidgetSet.BackendInvalidateRect(aHandle: HWND; Rect: pRect; bErase: Boolean): Boolean;
4546
{$ifdef VerboseCDWinAPI}
4547
DebugLn('[TCDWidgetSet.InvalidateRect]');
4549
if AHandle = 0 then exit(False);
4551
eventResult := eventResult or 1;
4556
(*{------------------------------------------------------------------------------
4557
Function: InvalidateRgn
4561
Returns: True if invalidate is successfull.
4562
Invalidates region of widget.
4563
------------------------------------------------------------------------------}
4564
function TQtWidgetSet.InvalidateRgn(aHandle: HWND; Rgn: HRGN; Erase: Boolean
4567
{$ifdef VerboseQtWinAPI}
4568
WriteLn('[WinAPI InvalidateRgn]');
4572
if IsValidGDIObject(Rgn) and (TQtRegion(Rgn).FHandle <> nil) then
4573
TQtWidget(aHandle).UpdateRegion(TQtRegion(Rgn).FHandle)
4575
TQtWidget(aHandle).Update;
4578
{------------------------------------------------------------------------------
4579
Procedure: LeaveCriticalSection
4580
Params: var CritSection: TCriticalSection
4582
------------------------------------------------------------------------------}
4583
procedure TQtWidgetSet.LeaveCriticalSection(var CritSection: TCriticalSection);
4585
ACritSec: System.PRTLCriticalSection;
4587
ACritSec:=System.PRTLCriticalSection(CritSection);
4588
System.LeaveCriticalsection(ACritSec^);
4591
{------------------------------------------------------------------------------
4597
------------------------------------------------------------------------------}
4598
function TQtWidgetSet.LineTo(DC: HDC; X, Y: Integer): Boolean;
4600
PenPos, LastPos: TPoint;
4602
{$ifdef VerboseQtWinAPI}
4603
WriteLn('[WinAPI LineTo]');
4608
if not IsValidDC(DC) then Exit;
4610
TQtDeviceContext(DC).getPenPos(@PenPos);
4611
LastPos := Point(X, Y);
4612
if TQtDeviceContext(DC).pen.getCosmetic then
4613
LastPos := TQtDeviceContext(DC).GetLineLastPixelPos(PenPos, LastPos);
4614
TQtDeviceContext(DC).drawLine(PenPos.X, PenPos.Y, LastPos.X, LastPos.Y);
4615
MoveToEx(DC, X, Y, nil);
4620
function TQtWidgetSet.LPtoDP(DC: HDC; var Points; Count: Integer): BOOL;
4624
Matrix: QTransformH;
4625
QtDC: TQtDeviceContext;
4629
if not IsValidDC(DC) then
4632
QtDC := TQtDeviceContext(DC);
4634
Matrix := QPainter_transform(QtDC.Widget);
4641
QTransform_map(Matrix, PQtPoint(@QtPoint), PQtPoint(@QtPoint));
4650
function TCDWidgetSet.MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: Cardinal): integer;
4652
lJavaString: jstring;
4655
{$ifdef VerboseCDWinAPI}
4656
DebugLn(Format('[TCDWidgetSet.MessageBox] HWND=%x javaEnvRef=%x lpText=%s lpCaption=%s uType=%d',
4657
[HWND, PtrInt(javaEnvRef), StrPas(lpText), StrPas(lpCaption), uType]));
4660
Result := 0; // The real result goes to Application.OnMessageDialogExecute
4662
if (javaEnvRef = nil) then Exit;
4664
// Prepare the input
4666
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, lpText);
4667
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lcltext, lJavaString);
4668
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, lpCaption);
4669
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lcltitle, lJavaString);
4672
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton1, -1);
4673
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton2, -1);
4674
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton3, -1);
4679
BtnText := RemoveAccelChars(rsMbYes);
4680
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4681
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton1str, lJavaString);
4682
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton1, IDOK);
4687
BtnText := RemoveAccelChars(rsMbYes);
4688
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4689
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton1str, lJavaString);
4690
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton1, IDOK);
4692
BtnText := RemoveAccelChars(rsMbCancel);
4693
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4694
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton2str, lJavaString);
4695
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton2, IDCANCEL);
4697
MB_ABORTRETRYIGNORE:
4700
BtnText := RemoveAccelChars(rsMbAbort);
4701
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4702
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton1str, lJavaString);
4703
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton1, IDABORT);
4705
BtnText := RemoveAccelChars(rsMbRetry);
4706
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4707
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton2str, lJavaString);
4708
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton2, IDRETRY);
4710
BtnText := RemoveAccelChars(rsMbIgnore);
4711
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4712
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton3str, lJavaString);
4713
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton3, IDIGNORE);
4718
BtnText := RemoveAccelChars(rsMbYes);
4719
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4720
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton1str, lJavaString);
4721
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton1, IDYES);
4723
BtnText := RemoveAccelChars(rsMbNo);
4724
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4725
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton2str, lJavaString);
4726
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton2, IDNO);
4728
BtnText := RemoveAccelChars(rsMbCancel);
4729
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4730
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton3str, lJavaString);
4731
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton3, IDCANCEL);
4736
BtnText := RemoveAccelChars(rsMbYes);
4737
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4738
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton1str, lJavaString);
4739
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton1, IDYES);
4741
BtnText := RemoveAccelChars(rsMbNo);
4742
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4743
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton2str, lJavaString);
4744
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton2, IDNO);
4749
BtnText := RemoveAccelChars(rsMbRetry);
4750
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4751
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton1str, lJavaString);
4752
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton1, IDRETRY);
4754
BtnText := RemoveAccelChars(rsMbCancel);
4755
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(BtnText));
4756
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lclbutton2str, lJavaString);
4757
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, JavaField_lclbutton2, IDCANCEL);
4762
javaEnvRef^^.CallVoidMethod(javaEnvRef, javaActivityObject, javaMethod_LCLDoShowMessageBox);
4765
(*{------------------------------------------------------------------------------
4771
------------------------------------------------------------------------------}
4772
function TQtWidgetSet.MoveToEx(DC: HDC; X, Y: Integer; OldPoint: PPoint): Boolean;
4774
{$ifdef VerboseQtWinAPI}
4775
WriteLn('[WinAPI MoveToEx]',
4783
if not IsValidDC(DC) then Exit;
4785
if (OldPoint <> nil) then TQtDeviceContext(DC).getPenPos(OldPoint);
4787
TQtDeviceContext(DC).setPenPos(X, Y);
4792
function TQtWidgetSet.OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer;
4798
if not IsValidGDIObject(RGN) then
4801
QtRgn := TQtRegion(RGN).FHandle;
4803
QRegion_translate(QtRgn, nXOffset, nYOffset);
4805
if QRegion_isEmpty(QtRgn) then
4806
Result := NULLREGION
4809
if TQtRegion(RGN).IsPolyRegion or (TQtRegion(RGN).numRects > 0) then
4810
Result := COMPLEXREGION
4812
Result := SIMPLEREGION;
4816
function TQtWidgetSet.PeekMessage(var lpMsg : TMsg; Handle : HWND; wMsgFilterMin, wMsgFilterMax,wRemoveMsg : UINT): Boolean;
4819
{$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION}
4820
WriteLn('***** [WinAPI TQtWidgetSet.PeekMessage] missing implementation ');
4824
{------------------------------------------------------------------------------
4825
Function: PolyBezier
4826
Params: DC: HDC; Points: PPoint; NumPts: Integer; Filled: Boolean;
4829
------------------------------------------------------------------------------}
4830
function TQtWidgetSet.PolyBezier(DC: HDC; Points: PPoint; NumPts: Integer;
4831
Filled, Continuous: Boolean): Boolean;
4833
{$ifdef VerboseQtWinAPI}
4834
WriteLn('[WinAPI PolyBezier] DC: ', dbghex(DC));
4836
Result := inherited PolyBezier(DC, Points, NumPts, Filled, Continuous);
4839
{------------------------------------------------------------------------------
4841
Params: DC: HDC; Points: PPoint; NumPts: Integer; Winding: Boolean
4843
------------------------------------------------------------------------------}
4844
function TQtWidgetSet.Polygon(DC: HDC; Points: PPoint; NumPts: Integer;
4845
Winding: Boolean): boolean;
4850
{$ifdef VerboseQtWinAPI}
4851
WriteLn('[WinAPI Polygon] DC: ', dbghex(DC));
4853
Result := IsValidDC(DC);
4856
GetMem(QtPoints, NumPts * SizeOf(TQtPoint));
4857
for i := 0 to NumPts - 1 do
4858
QtPoints[i] := QtPoint(Points[i].x, Points[i].y);
4860
QPainter_drawPolygon(TQtDeviceContext(DC).Widget, QtPoints, NumPts, QtWindingFill)
4862
QPainter_drawPolygon(TQtDeviceContext(DC).Widget, QtPoints, NumPts, QtOddEvenFill);
4867
{------------------------------------------------------------------------------
4869
Params: DC: HDC; Points: PPoint; NumPts: Integer
4871
------------------------------------------------------------------------------}
4872
function TQtWidgetSet.Polyline(DC: HDC; Points: PPoint; NumPts: Integer): boolean;
4874
{$ifdef VerboseQtWinAPI}
4875
WriteLn('[WinAPI Polyline] DC: ', dbghex(DC));
4877
Result := IsValidDC(DC) and (NumPts > 0);
4879
TQtDeviceContext(DC).DrawPolyLine(Points, NumPts);
4882
function TQtWidgetSet.PostMessage(Handle: HWND; Msg: Cardinal; wParam: WParam; lParam: LParam): Boolean;
4884
Widget: TQtWidget absolute Handle;
4885
Event: QLCLMessageEventH;
4890
Event := QLCLMessageEvent_create(QEventLCLMessage, Msg, wParam, lParam, 0);
4891
QCoreApplication_postEvent(Widget.Widget, Event, 1 {high priority});
4896
function TQtWidgetSet.PtInRegion(RGN: HRGN; X, Y: Integer): Boolean;
4900
if not IsValidGDIObject(RGN) then
4903
Result := TQtRegion(RGN).containsPoint(X, Y);
4906
{------------------------------------------------------------------------------
4908
Params: DC: HDC; X1, Y1, X2, Y2: Integer
4911
The Rectangle function draws a rectangle. The rectangle is outlined by using
4912
the current pen and filled by using the current brush.
4913
------------------------------------------------------------------------------}
4914
function TCDWidgetSet.Rectangle(DC: HDC; X1, Y1, X2, Y2: Integer): Boolean;
4916
LazDC: TLazCanvas absolute DC;
4918
if DC = 0 then Exit;
4920
{$ifdef VerboseCDWinAPI}
4921
// DebugLn(Format('[WinAPI Rectangle] DC=%s DC.Width=%d DC.Height=%d', [dbghex(DC), LazDC.Width, LazDC.Height]));
4922
DebugLn(Format('[WinAPI Rectangle] DC=%s', [dbghex(DC)]));
4923
DebugLn(Format('[WinAPI Rectangle] DC.Width=%d DC.Height=%d', [LazDC.Width, LazDC.Height]));
4926
//if not IsValidDC(DC) then Exit(False);
4927
LazDC.Brush.FPColor := colWhite;
4928
LazDC.Rectangle(X1, Y1, X2, Y2);
4929
{ R := NormalizeRect(Rect(X1, Y1, X2, Y2));
4930
if IsRectEmpty(R) then Exit(True);
4932
TQtDeviceContext(DC).drawRect(R.Left, R.Top, R.Right - R.Left - 1, R.Bottom - R.Top - 1);}
4936
function TQtWidgetSet.RectVisible(dc : hdc; const ARect: TRect) : Boolean;
4938
QtDC: TQtDeviceContext;
4940
{$ifdef VerboseCDWinAPI}
4941
writeln('[WinAPI RectVisible] ');
4944
if not IsValidDC(DC) then Exit;
4945
QtDC := TQtDeviceContext(DC);
4946
// as MSDN says only clipping region can play here
4947
if QtDC.getClipping then
4948
Result := QtDC.getClipRegion.containsRect(ARect);
4951
{------------------------------------------------------------------------------
4952
Function: RedrawWindow
4959
------------------------------------------------------------------------------}
4960
function TQtWidgetSet.RedrawWindow(Wnd: HWND; lprcUpdate: PRECT; hrgnUpdate: HRGN; flags: UINT): Boolean;
4962
QtWidget: TQtWidget;
4965
if not IsValidHandle(Wnd) then
4968
QtWidget := TQtWidget(Wnd);
4969
if IsValidGDIObject(hrgnUpdate) then
4970
Region := TQtRegion(hrgnUpdate)
4973
if (lprcUpdate = nil) and (hrgnUpdate = 0) then
4975
QtWidget.Update(nil);
4979
if Region = nil then
4980
Result := InvalidateRect(Wnd, lprcUpdate, False)
4982
QtWidget.UpdateRegion(Region.FHandle);
4987
function TQtWidgetSet.ReleaseCapture: Boolean;
4991
w := TQtWidget(GetCapture);
4996
if w is TQtMainWindow then
4999
windows.ReleaseCapture;
5004
{$ifdef VerboseQtWinAPI}
5005
WriteLn('[WinAPI ReleaseCapture] Capture = ', THandle(w));
5009
{------------------------------------------------------------------------------
5011
Params: hWnd: Handle to the window whose DC is to be released.
5012
hDC: Handle to the DC to be released.
5014
------------------------------------------------------------------------------}
5015
function TQtWidgetSet.ReleaseDC(hWnd: HWND; DC: HDC): Integer;
5017
{$ifdef VerboseQtWinAPI}
5018
WriteLn('[WinAPI ReleaseDC]',
5019
' hWnd: ', dbghex(hWnd),
5020
' DC: ', dbghex(DC));
5025
if IsValidDC(DC) then Exit;
5031
{------------------------------------------------------------------------------
5032
Function: RestoreDC: Restore a previously saved DC state
5034
DC: Handle to a DeviceContext
5035
SavedDC: Index of saved state that needs to be restored
5036
Returns: True if state was successfuly restored.
5037
-------------------------------------------------------------------------------}
5038
function TQtWidgetSet.RestoreDC(DC: HDC; SavedDC: Integer): Boolean;
5042
{$ifdef VerboseQTWinAPI}
5043
WriteLn('Trace:> [WinAPI RestoreDC] DC=', dbghex(DC),' SavedDC=',SavedDC);
5045
// if SavedDC is positive, it represents the wished saved dc instance
5046
// if SavedDC is negative, it's a relative number from last pushed state
5048
if SavedDCList=nil then
5050
{$ifdef VerboseQTWinAPI}
5051
WriteLn('Trace:< [WinAPI RestoreDC] there is no List yet, result=', result);
5057
SavedDC := SavedDC + SavedDCList.Count;
5060
Result := (SavedDC > 0) and (SavedDC < SavedDCList.Count);
5064
while SavedDC > 0 do
5066
DCData := PQtDcData(SavedDCList[SavedDC]);
5067
SavedDCList.Delete(SavedDC);
5068
Result := TQtDeviceContext(DC).RestoreDCData(DCData);
5072
{$ifdef VerboseQTWinAPI}
5073
WriteLn('Trace:< [WinAPI RestoreDC]');
5077
function TQtWidgetSet.RoundRect(DC: hDC; X1, Y1, X2, Y2: Integer; RX,RY : Integer): Boolean;
5080
if not IsValidDC(DC) then
5082
{$ifdef VerboseQTWinAPI}
5083
WriteLn('Trace:< [WinAPI RoundRect] DC Invalid, result=', result);
5087
Result := inherited RoundRect(DC, X1, Y1, X2, Y2, RX, RY);
5089
{------------------------------------------------------------------------------
5090
Function: SaveDC: save DC state information to a stack
5092
Returns: The index assigned to the or 0 if DC is not valid
5093
-------------------------------------------------------------------------------}
5094
function TQtWidgetSet.SaveDC(DC: HDC): Integer;
5098
{$ifdef VerboseQTWinAPI}
5099
WriteLn('Trace:> [WinAPI SaveDC] DC=', dbghex(DC));
5104
if not IsValidDC(DC) then
5106
{$ifdef VerboseQTWinAPI}
5107
WriteLn('Trace:< [WinAPI SaveDC] DC Invalid, result=', result);
5112
if SavedDCList=nil then
5114
SavedDCList := TFPList.Create;
5115
SavedDCList.Add(nil); // start at index 1, 0 is an invalid saved state
5118
DCData := TQtDeviceContext(DC).CreateDCData;
5120
SavedDCList.Insert(Result, DCData);
5122
{$ifdef VerboseQTWinAPI}
5123
WriteLn('Trace:< [WinAPI SaveDC] result=', Result);
5127
{------------------------------------------------------------------------------
5128
Function: ScreenToClient
5129
Params: Handle: HWND; var P: TPoint
5131
-------------------------------------------------------------------------------}
5132
function TQtWidgetSet.ScreenToClient(Handle : HWND; var P : TPoint) : Integer;
5137
if IsValidHandle(Handle) then
5139
APoint := QtPoint(P.X, P.Y);
5140
QWidget_mapFromGlobal(TQtWidget(Handle).GetContainerWidget, @APoint, @APoint);
5141
P := Point(APoint.x, APoint.y);
5146
{------------------------------------------------------------------------------
5147
Method: ScrollWindowEx
5148
Params: HWnd - handle of window to scroll
5149
DX - horizontal amount to scroll
5150
DY - vertical amount to scroll
5151
PRcScroll - pointer to scroll rectangle
5152
PRcClip - pointer to clip rectangle
5153
HRgnUpdate - handle of update region
5154
PRcUpdate - pointer to update rectangle
5155
Flags - scrolling flags
5157
Returns: True if succesfull
5159
The ScrollWindowEx function scrolls the content of the specified window's
5161
------------------------------------------------------------------------------}
5162
function TQtWidgetSet.ScrollWindowEx(HWnd: HWND; DX, DY: Integer; PRcScroll,
5163
PRcClip: PRect; HRgnUpdate: HRGN; PRcUpdate: PRect; Flags: UINT): Boolean;
5169
if (HWND = 0) then exit;
5171
W := TQtWidget(HWND);
5172
if ((Flags and SW_SCROLLCHILDREN) <> 0) then
5173
W.scroll(dx, dy, nil)
5175
if (PrcScroll = nil) then
5177
R := W.getClientBounds;
5178
W.scroll(dx, dy, @R);
5181
W.scroll(dx, dy, PRcScroll);
5183
if ((Flags and SW_INVALIDATE) <> 0) then
5185
if IsValidGDIObject(HRgnUpdate) then
5187
R := TQtRegion(HRgnUpdate).getBoundingRect;
5191
if PRcClip <> nil then
5193
PRcUpdate := PRcClip;
5201
{------------------------------------------------------------------------------
5202
Function: SelectClipRGN
5206
Sets the DeviceContext's ClipRegion. The Return value
5207
is the new clip regions type, or ERROR.
5209
The result can be one of the following constants
5215
------------------------------------------------------------------------------}
5216
function TQtWidgetSet.SelectClipRGN(DC: hDC; RGN: HRGN): Longint;
5218
QtDC: TQtDeviceContext;
5219
EmptyRegion: QRegionH;
5223
if IsValidDC(DC) then
5225
QtDC := TQtDeviceContext(DC);
5226
if IsValidGDIObject(RGN) then
5228
Result := TQtRegion(Rgn).GetRegionType;
5229
// RGN is in Device coordinates. Qt expects logical coordinates
5230
// so we need to convert RGN coords.
5231
GetWindowOrgEx(DC, @P);
5232
TQtRegion(Rgn).translate(P.X, P.Y);
5233
QtDC.setClipRegion(TQtRegion(Rgn).FHandle);
5236
EmptyRegion := QRegion_create;
5238
QtDC.setClipRegion(EmptyRegion, QtNoClip);
5240
QRegion_destroy(EmptyRegion);
5242
Result := NULLREGION;
5247
{------------------------------------------------------------------------------
5248
Function: SelectObject
5250
Returns: The GDI object of the same type previously associated with the DC
5252
Changes one of the GDI objects (Font, Brush, etc) of a Device Context;
5253
------------------------------------------------------------------------------}
5254
function TQtWidgetSet.SelectObject(DC: HDC; GDIObj: HGDIOBJ): HGDIOBJ;
5257
{$ifdef VerboseQtWinAPI}
5261
{$ifdef VerboseQtWinAPI}
5262
WriteLn('Trace:> [WinAPI SelectObject]',
5264
' GDIObj=', dbghex(GDIObj));
5269
if not IsValidDC(DC) then
5271
{$ifdef VerboseQtWinAPI}
5272
WriteLn('Trace:< [WinAPI SelectObject] Invalid DC');
5278
if not IsValidGDIObject(GDIObj) then
5280
{$ifdef VerboseQtWinAPI}
5281
WriteLn('Trace:< [WinAPI SelectObject] Invalid GDI Object');
5287
aObject := TObject(GDIObj);
5289
if aObject is TQtFont then
5291
{$ifdef VerboseQtWinAPI}
5295
Result := HGDIOBJ(TQtDeviceContext(DC).font);
5297
TQtDeviceContext(DC).setFont(TQtFont(aObject));
5299
else if aObject is TQtPen then
5301
{$ifdef VerboseQtWinAPI}
5304
result := HGDIOBJ(TQtDeviceContext(DC).pen);
5306
TQtDeviceContext(DC).setPen(TQtPen(aObject));
5308
else if aObject is TQtBrush then
5310
{$ifdef VerboseQtWinAPI}
5314
Result := HGDIOBJ(TQtDeviceContext(DC).brush);
5316
TQtDeviceContext(DC).setBrush(TQtBrush(aObject));
5318
else if aObject is TQtImage then
5320
{$ifdef VerboseQtWinAPI}
5324
Result := HGDIOBJ(TQtDeviceContext(DC).vImage);
5326
// TODO: is this also saved in qpainter_save?
5327
TQtDeviceContext(DC).setImage(TQtImage(aObject));
5329
if AObject is TQtRegion then
5331
Result := HGDIOBJ(TQtDeviceContext(DC).getClipRegion);
5332
SelectClipRGN(DC, HRGN(GDIObj));
5335
{$ifdef VerboseQtWinAPI}
5336
WriteLn('Trace:< [WinAPI SelectObject] Result=', dbghex(Result), ' ObjectType=', ObjType);
5340
function TQtWidgetSet.SendMessage(HandleWnd: HWND; Msg: Cardinal;
5341
WParam: WParam; LParam: LParam): LResult;
5343
Widget: TQtWidget absolute HandleWnd;
5344
Event: QLCLMessageEventH;
5347
if (HandleWnd <> 0) and (Widget.Widget <> nil) then
5349
Event := QLCLMessageEvent_create(QEventLCLMessage, Msg, wParam, lParam, 0);
5351
QCoreApplication_sendEvent(Widget.Widget, Event);
5352
Result := QLCLMessageEvent_getMsgResult(Event);
5354
QLCLMessageEvent_destroy(Event);
5359
function TQtWidgetSet.SetActiveWindow(Handle: HWND): HWND;
5361
Result := GetActiveWindow;
5364
TQtWidget(Handle).Activate
5366
Result := 0; // error
5369
{------------------------------------------------------------------------------
5370
Function: SetBKColor
5375
------------------------------------------------------------------------------}
5376
function TQtWidgetSet.SetBKColor(DC: HDC; Color: TColorRef): TColorRef;
5378
{$ifdef VerboseQtWinAPI}
5379
WriteLn('Trace:> [WinAPI SetBkColor]',
5380
' DC: ', dbghex(DC),
5381
' Color: ', dbgs(Color));
5386
if not IsValidDC(DC) then
5388
{$ifdef VerboseQtWinAPI}
5389
WriteLn('Trace:< [WinAPI SetBkColor] Invalid DC');
5395
Result := TQtDeviceContext(DC).SetBkColor(TColorRef(Color));
5398
{------------------------------------------------------------------------------
5402
------------------------------------------------------------------------------}
5403
function TQtWidgetSet.SetBkMode(DC: HDC; bkMode: Integer): Integer;
5405
{$ifdef VerboseQtWinAPI}
5406
WriteLn('Trace:> [WinAPI SetBkMode] DC=', dbghex(DC), ' BkMode=', dbgs(bkMode));
5411
if not IsValidDC(DC) then
5413
{$ifdef VerboseQtWinAPI}
5414
WriteLn('Trace:< [WinAPI SetBkMode] Invalid DC');
5420
Result := TQtDeviceContext(DC).SetBkMode(bkMode);
5423
function TQtWidgetSet.SetCapture(AHandle: HWND): HWND;
5427
Result := GetCapture;
5428
if Result <> AHandle then
5432
if AHandle <> 0 then
5434
Windows.SetCapture(AHandle);
5436
TQtWidget(AHandle).grabMouse();
5438
{$ifdef VerboseQtWinAPI}
5439
WriteLn('[WinAPI SetCapture] Capture = ', Result, ' New capture = ', AHandle);
5444
FillChar(Message, SizeOf(Message), 0);
5445
Message.msg := LM_CAPTURECHANGED;
5446
Message.wParam := 0;
5447
Message.lParam := Result;
5448
LCLMessageGlue.DeliverMessage(TQtWidget(AHandle).LCLObject, Message);
5453
function TQtWidgetSet.SetCaretPos(X, Y: Integer): Boolean;
5455
Result := QtCaret.SetCaretPos(X, Y);
5458
function TQtWidgetSet.SetCaretPosEx(Handle: HWnd; X, Y: Integer): Boolean;
5460
Result := QtCaret.SetCaretPos(X, Y);
5463
function TQtWidgetSet.SetCaretRespondToFocus(handle: HWND;
5464
ShowHideOnFocus: boolean): Boolean;
5467
QtCaret.SetQtCaretRespondToFocus(ShowHideOnFocus);
5470
{------------------------------------------------------------------------------
5472
Params: ACursor - HCursor (TQtCursor)
5474
previous global cursor
5475
------------------------------------------------------------------------------}
5476
function TQtWidgetSet.SetCursor(ACursor: HCURSOR): HCURSOR;
5478
Result := HCURSOR(OverrideCursor);
5480
if Result = ACursor then
5483
if Screen.Cursors[crDefault] = ACursor then
5484
OverrideCursor := nil
5486
OverrideCursor := TQtCursor(ACursor);
5489
{------------------------------------------------------------------------------
5490
Function: SetCursorPos
5495
------------------------------------------------------------------------------}
5496
function TQtWidgetSet.SetCursorPos(X, Y: Integer): Boolean;
5498
{$ifdef VerboseQtWinAPI}
5499
WriteLn('[WinAPI SetCursorPos]');
5502
QCursor_setPos(X, Y);
5507
{------------------------------------------------------------------------------
5509
Params: hWnd - Window handle to be focused
5512
------------------------------------------------------------------------------}
5513
function TQtWidgetSet.SetFocus(hWnd: HWND): HWND;
5520
{$ifdef VerboseFocus}
5521
WriteLn('********* TQtWidgetSet.SetFocus INIT focusing ', TQtWidget(hwnd).lclobject.name);
5524
W := TQtWidget(HWND).getWindow;
5525
if (W <> nil) and W.getVisible and not W.IsActiveWindow and
5526
not TQtMainWindow(W).Blocked then
5528
TQtWidget(hWnd).setFocus;
5529
{$ifdef VerboseFocus}
5530
DebugLn('********* TQtWidgetSet.SetFocus END was %x now is %x',[result,hwnd]);
5535
function TQtWidgetSet.GetForegroundWindow: HWND;
5540
if WindowManagerName = 'metacity' then
5541
W := X11GetActivewindow
5543
W := QApplication_activeWindow();
5545
W := QApplication_activeWindow();
5547
Result := HwndFromWidgetH(W);
5550
function TQtWidgetSet.SetForegroundWindow(HWnd: HWND): boolean;
5555
Result := TQtWidget(HWND).IsActiveWindow;
5556
TQtWidget(HWnd).Activate;
5560
function TQtWidgetSet.SetMenu(AWindowHandle: HWND; AMenuHandle: HMENU): Boolean;
5562
AWidget, AMenuWidget: TQtWidget;
5563
QtMainWindow: TQtMainWindow absolute AWidget;
5564
QtMenuBar: TQtMenuBar absolute AMenuWidget;
5567
AWidget := TQtWidget(AWindowHandle);
5568
Result := AWidget is TQtMainWindow;
5571
AMenuWidget := TQtWidget(AMenuHandle);
5572
if AMenuWidget is TQtMenuBar then
5574
R := AWidget.LCLObject.ClientRect;
5575
R1 := QtMainWindow.MenuBar.getGeometry;
5576
R1.Right := R.Right;
5577
QtMenuBar.setGeometry(R1);
5578
QtMainWindow.setMenuBar(QMenuBarH(QtMenuBar.Widget));
5581
QtMainWindow.setMenuBar(QMenuBarH(QtMainWindow.MenuBar.Widget));
5585
function TQtWidgetSet.SetParent(hWndChild: HWND; hWndParent: HWND): HWND;
5587
OldVisible: Boolean;
5588
Flags: QtWindowFlags;
5591
{$ifdef VerboseQtWinAPI}
5592
writeln('[WinApi SetParent] child: ',dbgHex(PtrUInt(hwndChild)),
5593
' parent: ',dbgHex(PtrUInt(hWndParent)));
5596
if not IsValidHandle(hwndChild) then
5598
Result := GetParent(hWndChild);
5599
if (Result = hwndParent) then
5601
W := TQtWidget(hWndChild);
5602
OldVisible := W.getVisible;
5603
Flags := W.windowFlags;
5604
if IsValidHandle(hWndParent) then
5605
W.setParent(TQtWidget(hWndParent).GetContainerWidget)
5609
W.setWindowFlags(Flags);
5611
W.setVisible(OldVisible);
5614
function TQtWidgetSet.SetMapMode(DC: HDC; fnMapMode : Integer): Integer;
5619
if IsValidDC(DC) then
5621
if fnMapMode <> TQtDeviceContext(DC).vMapMode then
5624
MM_ANISOTROPIC:; // user's choice
5625
MM_ISOTROPIC:; // adjusted after each SetViewPortExtEx call (see MSDN for details)
5626
MM_HIENGLISH: AWindowExt := Point(1000, -1000);
5627
MM_HIMETRIC: AWindowExt := Point(2540, -2540);
5628
MM_LOENGLISH: AWindowExt := Point(100, -100);
5629
MM_LOMETRIC: AWindowExt := Point(254, -254);
5630
MM_TWIPS: AWindowExt := Point(1440, -1440);
5632
fnMapMode := MM_TEXT;
5634
TQtDeviceContext(DC).vMapMode := fnMapMode;
5635
QPainter_setViewTransformEnabled(TQtDeviceContext(DC).Widget, fnMapMode <> MM_TEXT);
5636
if not (fnMapMode in [MM_TEXT, MM_ANISOTROPIC, MM_ISOTROPIC]) then
5638
QPainter_Window(TQtDeviceContext(DC).Widget, @R);
5639
R.BottomRight := AWindowExt;
5640
QPainter_setWindow(TQtDeviceContext(DC).Widget, @R);
5641
QPainter_ViewPort(TQtDeviceContext(DC).Widget, @R);
5642
R.Right := QtWidgetSet.GetDeviceCaps(DC, LOGPIXELSX);
5643
R.Bottom := QtWidgetSet.GetDeviceCaps(DC, LOGPIXELSX);
5644
QPainter_setViewPort(TQtDeviceContext(DC).Widget, @R);
5647
Result := Integer(True);
5649
Result := Integer(False);
5652
function TQtWidgetSet.SetViewPortExtEx(DC: HDC; XExtent, YExtent : Integer; OldSize: PSize): Boolean;
5658
if IsValidDC(DC) then
5660
QPainter_ViewPort(TQtDeviceContext(DC).Widget, @R);
5661
if OldSize <> nil then
5663
OldSize^.cx := R.Right - R.Left;
5664
OldSize^.cy := R.Bottom - R.Top;
5666
if (XExtent <> R.Right) or (YExtent <> R.Bottom) then
5668
case TQtDeviceContext(DC).vMapMode of
5669
MM_ANISOTROPIC, MM_ISOTROPIC:
5671
if TQtDeviceContext(DC).vMapMode = MM_ISOTROPIC then
5673
// TK: Is here also an adjustment on Windows if DPIX and DPIY are different?
5674
QPainter_Window(TQtDeviceContext(DC).Widget, @RW);
5675
Ratio := RW.Right / RW.Bottom; // no check, programmer cannot put nonsense
5676
if YExtent * Ratio > XExtent then
5677
YExtent := RoundToInt(XExtent / Ratio)
5678
else if YExtent * Ratio < XExtent then
5679
XExtent := RoundToInt(YExtent * Ratio)
5681
QPainter_setViewPort(TQtDeviceContext(DC).Widget, R.Left, R.Top, XExtent, YExtent);
5689
function TQtWidgetSet.SetViewPortOrgEx(DC: HDC; NewX, NewY: Integer; OldPoint: PPoint): Boolean;
5694
if IsValidDC(DC) then
5696
QPainter_ViewPort(TQtDeviceContext(DC).Widget, @R);
5697
if OldPoint <> nil then
5698
OldPoint^ := R.TopLeft;
5699
if (TQtDeviceContext(DC).vMapMode <> MM_TEXT) and (NewX <> R.Left) or (NewY <> R.Top) then
5701
QPainter_setViewPort(TQtDeviceContext(DC).Widget, NewX, NewY, R.Right - R.Left, R.Bottom - R.Top);
5707
function TQtWidgetSet.SetWindowExtEx(DC: HDC; XExtent, YExtent: Integer; OldSize: PSize): Boolean;
5712
if IsValidDC(DC) then
5714
QPainter_Window(TQtDeviceContext(DC).Widget, @R);
5715
if OldSize <> nil then
5717
OldSize^.cx := R.Right - R.Left;
5718
OldSize^.cy := R.Bottom - R.Top;
5720
if (XExtent <> R.Right) or (YExtent <> R.Bottom) then
5722
case TQtDeviceContext(DC).vMapMode of
5723
MM_ANISOTROPIC, MM_ISOTROPIC:
5725
QPainter_setWindow(TQtDeviceContext(DC).Widget, R.Left, R.Top, XExtent, YExtent);
5733
{------------------------------------------------------------------------------
5734
Method: SetWindowOrgEx
5735
Params: DC - handle of device context
5736
NewX - new x-coordinate of window origin
5737
NewY - new y-coordinate of window origin
5738
Point - record receiving original origin
5739
Returns: Whether the call was successful
5741
Sets the window origin of the device context by using the specified coordinates.
5742
------------------------------------------------------------------------------}
5743
function TQtWidgetSet.SetWindowOrgEx(DC : HDC; NewX, NewY : Integer; OldPoint: PPoint) : Boolean;
5747
{$ifdef VerboseQtWinAPI}
5748
WriteLn('[WinAPI SetWindowOrgEx] DC: ', dbghex(DC), ' NewX: ', dbgs(NewX), ' NewY: ', dbgs(NewY));
5753
if IsValidDC(DC) then
5755
GetWindowOrgEx(DC, @P);
5757
if (P.X <> 0) or (P.Y <> 0) then
5758
TQtDeviceContext(DC).translate(P.X, P.Y);
5759
if OldPoint <> nil then
5761
TQtDeviceContext(DC).translate(-NewX, -NewY);
5766
{------------------------------------------------------------------------------
5767
Method: SetWindowPos
5768
Params: HWnd - handle of window
5769
HWndInsertAfter - placement-order handle
5770
X - horizontal position
5771
Y - vertical position
5774
UFlags - window-positioning flags
5775
Returns: If the function succeeds
5777
Changes the size, position, and Z order of a child, pop-up, or top-level
5779
------------------------------------------------------------------------------}
5780
function TQtWidgetSet.SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx,
5781
cy: Integer; uFlags: UINT): Boolean;
5783
DisableUpdates: boolean;
5785
{$ifdef VerboseQtWinAPI}
5786
WriteLn('[WinAPI SetWindowPos] Handle: ', dbghex(hWnd),
5787
' hWndInsertAfter: ',dbghex(hWnd));
5789
Result := hWnd <> 0;
5793
DisableUpdates := (SWP_NOREDRAW and uFlags) <> 0;
5794
if DisableUpdates then
5795
TQtWidget(Hwnd).setUpdatesEnabled(False);
5797
if (SWP_NOMOVE and uFlags) = 0 then
5798
TQtWidget(Hwnd).move(X, Y);
5800
if (SWP_NOSIZE and uFlags) = 0 then
5801
TQtWidget(Hwnd).resize(CX, CY);
5803
if (SWP_NOZORDER and uFlags) = 0 then
5805
case hWndInsertAfter of
5808
TQtWidget(hWnd).raiseWidget;
5809
if (SWP_NOACTIVATE and uFlags) = 0 then
5810
TQtWidget(hWnd).Activate;
5812
HWND_BOTTOM: TQtWidget(hWnd).lowerWidget;
5813
{TODO: HWND_TOPMOST ,HWND_NOTOPMOST}
5817
if DisableUpdates then
5818
TQtWidget(Hwnd).setUpdatesEnabled(True);
5822
{------------------------------------------------------------------------------
5823
Method: SetWindowRgn
5824
Params: hWnd - handle of the widget
5825
hRgn - handle of the region
5827
Returns: 0 if the call failed, any other value if it was successful
5829
Makes the region specifyed in hRgn be the only part of the window which is
5831
------------------------------------------------------------------------------}
5832
function TQtWidgetSet.SetWindowRgn(hWnd: HWND;
5833
hRgn: HRGN; bRedraw: Boolean):longint;
5840
{$ifdef VerboseQtWinAPI}
5841
WriteLn('[WinAPI SetWindowRgn] Handle: ', dbghex(hWnd));
5845
if (hWnd = 0) or (hRgn = 0) then Exit;
5847
w := TQtWidget(hWnd);
5848
r := TQtRegion(hRgn);
5850
// Now set the mask in the widget
5851
w.setMask(r.FHandle);
5856
function TQtWidgetSet.ShowCaret(hWnd: HWND): Boolean;
5858
Result := (hWnd <> 0) and (QtCaret.ShowCaret(TQtWidget(hWnd)));
5861
{------------------------------------------------------------------------------
5865
------------------------------------------------------------------------------}
5866
function TQtWidgetSet.SetProp(Handle: hwnd; Str: PChar; Data: Pointer): Boolean;
5870
TQtWidget(Handle).Props[str] := Data;
5871
Result := (TQtWidget(Handle).Props[str]=Data);
5872
{$ifdef VerboseQtWinApi}
5873
DebugLn('[WinAPI SetProp win=%s str=%s data=%x',[dbgsname(TQtWidget(Handle)), str, ptrint(data)]);
5879
{------------------------------------------------------------------------------
5881
Params: HDC, Raster OP mode
5882
Returns: Old Raster OP mode
5884
Please note that the bitwise raster operation modes, denoted with a
5885
RasterOp prefix, are only natively supported in the X11 and
5886
raster paint engines.
5887
This means that the only way to utilize these modes on the Mac is
5889
The RasterOp denoted blend modes are not supported for pens and brushes
5890
with alpha components. Also, turning on the QPainter::Antialiasing render
5891
hint will effectively disable the RasterOp modes.
5892
------------------------------------------------------------------------------}
5893
function TQtWidgetSet.SetROP2(DC: HDC; Mode: Integer): Integer;
5895
QtDC: TQtDeviceContext absolute DC;
5897
{$ifdef VerboseQtWinAPI}
5898
writeln('TQtWidgetSet.SetROP2() DC ',dbghex(DC),' Mode ',Mode);
5900
Result := R2_COPYPEN;
5901
if not IsValidDC(DC) then
5903
Result := QtDC.Rop2;
5907
{------------------------------------------------------------------------------
5908
Function: SetScrollInfo
5910
Returns: The new position value
5912
------------------------------------------------------------------------------}
5913
function TQtWidgetSet.SetScrollInfo(Handle : HWND; SBStyle : Integer;
5914
ScrollInfo: TScrollInfo; bRedraw : Boolean): Integer;
5916
Control: TWinControl;
5917
ScrollBar: TQtScrollBar;
5919
function UpdateScrollInfo: Integer;
5921
iReCountMax: Integer;
5922
SBUpdatesCount: Integer;
5924
WheelLines: Integer;
5927
SBUpdatesCount := 0;
5929
if (ScrollInfo.FMask and SIF_RANGE) <> 0 then
5931
inc(SBUpdatesCount);
5932
ScrollBar.setMinimum(ScrollInfo.nMin);
5934
// we must recount ScrollBar.Max since invalid value raises AV
5935
iRecountMax := ScrollInfo.nMax - ScrollInfo.nPage;
5936
if iRecountMax < ScrollInfo.nMin then
5937
iRecountMax := ScrollInfo.nMin;
5939
ScrollBar.setMaximum(iRecountMax);
5942
if (ScrollInfo.FMask and SIF_PAGE) <> 0 then
5944
// segfaults if we don't check Enabled property
5945
if ScrollBar.getEnabled then
5947
inc(SBUpdatesCount);
5948
ScrollBar.setPageStep(ScrollInfo.nPage);
5949
WheelLines := QApplication_wheelScrollLines();
5952
i := Max(1, floor((GetPageStep / WheelLines) / 6));
5958
if (ScrollInfo.FMask and SIF_UPDATEPOLICY) <> 0 then
5959
ScrollBar.setTracking(ScrollInfo.nTrackPos <> SB_POLICY_DISCONTINUOUS);
5961
if (ScrollInfo.FMask and SIF_POS) <> 0 then
5963
inc(SBUpdatesCount);
5965
if SBUpdatesCount = 1 then
5966
ScrollBar.BeginUpdate;
5968
if not (ScrollBar.getTracking and ScrollBar.getSliderDown) then
5970
{do not setValue() if values are equal, since it calls
5971
signalValueChanged() which sends unneeded LM_SCROLL msgs }
5972
if (ScrollBar.getValue = ScrollInfo.nPos) then
5973
SBUpdatesCount := 0;
5975
if (ScrollInfo.nPos < ScrollBar.getMin) then
5976
ScrollInfo.nPos := ScrollBar.getMin
5978
if (ScrollInfo.nPos > ScrollBar.getMax) then
5979
ScrollInfo.nPos := ScrollBar.getMax;
5981
if (SBUpdatesCount > 0) then
5982
ScrollBar.setValue(ScrollInfo.nPos);
5985
if ScrollBar.InUpdate then
5986
ScrollBar.EndUpdate;
5990
if (ScrollInfo.FMask and SIF_TRACKPOS) <> 0 then
5992
ScrollBar.TrackPos := ScrollInfo.nTrackPos;
5993
// from MSDN: the SetScrollInfo function ignores this member
5994
// ScrollBar.setSliderPosition(ScrollInfo.nTrackPos);
5997
Result := ScrollBar.getValue;
6001
// bRedraw is useles with qt
6005
if (Handle = 0) then exit;
6011
{TODO: SB_BOTH fixme }
6012
//writeln('TODO: ############## SB_BOTH CALLED HERE .... #################');
6017
{HWND is always TScrollBar, but seem that Create ScrollBar should be called here }
6018
if (csReading in TQtWidget(Handle).LCLObject.ComponentState) or
6019
(csDestroying in TQtWidget(Handle).LCLObject.ComponentState) then exit;
6021
ScrollBar := TQtScrollBar(Handle);
6023
if not Assigned(ScrollBar) then exit;
6028
if (csReading in TQtWidget(Handle).LCLObject.ComponentState) or
6029
(csDestroying in TQtWidget(Handle).LCLObject.ComponentState) then
6032
if TQtWidget(Handle) is TQtAbstractScrollArea then
6034
ScrollBar := TQtAbstractScrollArea(Handle).horizontalScrollBar;
6038
Control := TWinControl(TQtWidget(Handle).LCLObject.FindChildControl(TQtWidget(Handle).LCLObject.Name+'_HSCROLLBAR'));
6039
if (Control <> nil) and (Control.HandleAllocated) then
6040
ScrollBar := TQtScrollBar(Control.Handle)
6046
if (csReading in TQtWidget(Handle).LCLObject.ComponentState) or
6047
(csDestroying in TQtWidget(Handle).LCLObject.ComponentState) then
6050
if TQtWidget(Handle) is TQtAbstractScrollArea then
6052
ScrollBar := TQtAbstractScrollArea(Handle).verticalScrollBar;
6056
Control := TWinControl(TQtWidget(Handle).LCLObject.FindChildControl(TQtWidget(Handle).LCLObject.Name+'_VSCROLLBAR'));
6057
if (Control <> nil) and (Control.HandleAllocated) then
6058
ScrollBar := TQtScrollBar(Control.Handle)
6064
if Assigned(ScrollBar) then
6065
Result := UpdateScrollInfo;
6068
{------------------------------------------------------------------------------
6069
Method: SetTextColor
6072
------------------------------------------------------------------------------}
6073
function TQtWidgetSet.SetTextColor(DC: HDC; Color: TColorRef): TColorRef;
6075
{$ifdef VerboseQtWinAPI}
6076
WriteLn('[WinAPI SetTextColor] DC: ', dbghex(DC));
6078
Result := CLR_INVALID;
6079
if not IsValidDC(DC) then begin
6080
{$ifdef VerboseQtWinAPI}
6081
WriteLn('[WinAPI SetTextColor] Invalid DC');
6085
Result := TQtDeviceContext(DC).vTextColor;
6086
TQtDeviceContext(DC).vTextColor := ColorToRGB(TColor(Color)); // be sure we get TColorRef
6089
{------------------------------------------------------------------------------
6090
function ShowScrollBar(Handle: HWND; wBar: Integer; bShow: Boolean): Boolean;
6091
Params Handle: HWND; wBar: Integer; bShow: Boolean
6093
------------------------------------------------------------------------------}
6094
function TQtWidgetSet.ShowScrollBar(Handle: HWND; wBar: Integer; bShow: Boolean): Boolean;
6097
ScrollArea: TQtAbstractScrollArea;
6099
{$ifdef VerboseQtWinAPI}
6100
WriteLn('[WinAPI ShowScrollBar] Handle: ', dbghex(Handle),' wBar: ',wBar);
6103
Result := (Handle <> 0);
6105
if not Result then exit;
6107
w := TQtWidget(Handle);
6109
if w is TQtAbstractScrollArea then
6111
ScrollArea := TQtAbstractScrollArea(w);
6116
ScrollArea.setScrollStyle(ssBoth)
6118
ScrollArea.setScrollStyle(ssNone);
6124
ScrollArea.setScrollStyle(ssHorizontal)
6126
ScrollArea.ScrollBarPolicy[False] := QtScrollBarAlwaysOff;
6132
ScrollArea.setScrollStyle(ssVertical)
6134
ScrollArea.ScrollBarPolicy[True] := QtScrollBarAlwaysOff;
6150
{------------------------------------------------------------------------------
6151
function ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean;
6154
SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED
6155
------------------------------------------------------------------------------}
6156
function TQtWidgetSet.ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean;
6160
{$ifdef VerboseQtWinAPI}
6161
WriteLn('[WinAPI ShowWindow] hwnd ',dbgHex(PtrUInt(hWnd)),' nCmdShow ',nCmdShow);
6166
Widget := TQtWidget(hWnd);
6168
if Widget <> nil then
6171
SW_SHOW: Widget.setVisible(True);
6172
SW_SHOWNORMAL: Widget.ShowNormal;
6173
SW_MINIMIZE: Widget.setWindowState(QtWindowMinimized);
6174
SW_SHOWMINIMIZED: Widget.ShowMinimized;
6175
SW_SHOWMAXIMIZED: Widget.ShowMaximized;
6176
SW_SHOWFULLSCREEN: Widget.ShowFullScreen;
6177
SW_HIDE: Widget.setVisible(False);
6183
{------------------------------------------------------------------------------
6184
Function: StretchBlt
6185
Params: DestDC: The destination devicecontext
6186
X, Y: The left/top corner of the destination rectangle
6187
Width, Height: The size of the destination rectangle
6188
SrcDC: The source devicecontext
6189
XSrc, YSrc: The left/top corner of the source rectangle
6190
SrcWidth, SrcHeight: The size of the source rectangle
6191
ROp: The raster operation to be performed
6192
Returns: True if succesful
6194
The StretchBlt function copies a bitmap from a source rectangle into a
6195
destination rectangle using the specified raster operation. If needed it
6196
resizes the bitmap to fit the dimensions of the destination rectangle.
6197
Sizing is done according to the stretching mode currently set in the
6198
destination device context.
6199
If SrcDC contains a mask the pixmap will be copied with this transparency.
6200
------------------------------------------------------------------------------}
6201
function TQtWidgetSet.StretchBlt(DestDC: HDC; X, Y, Width, Height: Integer;
6202
SrcDC: HDC; XSrc, YSrc, SrcWidth, SrcHeight: Integer; ROp: Cardinal): Boolean;
6204
Result := StretchMaskBlt(DestDC,X,Y,Width,Height,
6205
SrcDC,XSrc,YSrc,SrcWidth,SrcHeight,
6210
{------------------------------------------------------------------------------
6211
Function: StretchMaskBlt
6212
Params: DestDC: The destination devicecontext
6213
X, Y: The left/top corner of the destination rectangle
6214
Width, Height: The size of the destination rectangle
6215
SrcDC: The source devicecontext
6216
XSrc, YSrc: The left/top corner of the source rectangle
6217
SrcWidth, SrcHeight: The size of the source rectangle
6218
Mask: The handle of a monochrome bitmap
6219
XMask, YMask: The left/top corner of the mask rectangle
6220
ROp: The raster operation to be performed
6221
Returns: True if succesful
6223
The StretchMaskBlt function copies a bitmap from a source rectangle into a
6224
destination rectangle using the specified mask and raster operation. If needed
6225
it resizes the bitmap to fit the dimensions of the destination rectangle.
6226
Sizing is done according to the stretching mode currently set in the
6227
destination device context.
6228
------------------------------------------------------------------------------}
6229
function TQtWidgetSet.StretchMaskBlt(DestDC: HDC; X, Y, Width, Height: Integer;
6230
SrcDC: HDC; XSrc, YSrc, SrcWidth, SrcHeight: Integer; Mask: HBITMAP;
6231
XMask, YMask: Integer; Rop: DWORD): Boolean;
6233
SrcQDC: TQtDeviceContext absolute SrcDC;
6234
DstQDC: TQtDeviceContext absolute DestDC;
6235
SrcRect, DstRect, MaskRect: TRect;
6236
Image, TmpImage, QMask, TmpMask: QImageH;
6237
TmpPixmap: QPixmapH;
6238
SrcMatrix: QTransformH;
6241
{$ifdef VerboseQtWinAPI}
6242
WriteLn('[WinAPI StretchMaskBlt]',
6243
' DestDC:', dbghex(DestDC),
6244
' SrcDC:', dbghex(SrcDC),
6245
' Image:', dbghex(PtrInt(Image)),
6246
' X:', dbgs(X), ' Y:', dbgs(Y),
6247
' W:', dbgs(Width), ' H:', dbgs(Height),
6248
' XSrc:', dbgs(XSrc), ' YSrc:', dbgs(YSrc),
6249
' WSrc:', dbgs(SrcWidth), ' HSrc:', dbgs(SrcHeight));
6254
SrcMatrix := QPainter_transform(SrcQDC.Widget);
6255
if SrcQDC.vImage = nil then
6257
if SrcQDC.Parent <> nil then
6259
with SrcQDC.getDeviceSize do
6260
TmpPixmap := QPixmap_create(x, y);
6261
QPixmap_grabWindow(TmpPixmap, QWidget_winId(SrcQDC.Parent), 0, 0);
6262
Image := QImage_create();
6263
QPixmap_toImage(TmpPixmap, Image);
6264
QPixmap_destroy(TmpPixmap);
6270
Image := SrcQDC.vImage.FHandle;
6272
QTransform_map(SrcMatrix, XSrc, YSrc, @XSrc, @YSrc);
6273
// our map can have some transformations
6274
if XSrc < 0 then // we cannot draw from negative coord, so we will draw from zero with shift
6290
if dx <> 0 then // apply shifts
6292
inc(X, dx); // shift destination
6293
dec(Width, dx); // substract width
6294
dec(SrcWidth, dx); // and do not forget about SrcWidth or we will get unneeded stretching
6304
DstRect := Bounds(X, Y, Width, Height);
6305
SrcRect := Bounds(XSrc, YSrc, SrcWidth, SrcHeight);
6306
MaskRect := Bounds(XMask, YMask, SrcWidth, SrcHeight);
6307
// #0011187 - makes painting wrong
6308
//DstQDC.CorrectCoordinates(DstRect);
6309
//DstQDC.CorrectCoordinates(SrcRect);
6310
//DstQDC.CorrectCoordinates(MaskRect);
6312
QMask := TQtImage(Mask).FHandle
6316
if (DstRect.Right < DstRect.Left) or (DstRect.Bottom < DstRect.Top) then
6318
// Right < Left mean horizontal flip, Bottom < Top - vertical
6319
TmpImage := QImage_create();
6320
QImage_mirrored(Image, TmpImage, DstRect.Right < DstRect.Left, DstRect.Bottom < DstRect.Top);
6321
if QMask <> nil then
6323
TmpMask := QImage_create();
6324
QImage_mirrored(QMask, TmpMask, DstRect.Right < DstRect.Left, DstRect.Bottom < DstRect.Top);
6328
DstRect := NormalizeRect(DstRect);
6329
MaskRect := NormalizeRect(MaskRect);
6330
DstQDC.drawImage(@DstRect, TmpImage, @SrcRect, TmpMask, @MaskRect);
6331
QImage_destroy(TmpImage);
6332
if TmpMask <> nil then
6333
QImage_destroy(TmpMask);
6336
DstQDC.drawImage(@DstRect, Image, @SrcRect, QMask, @MaskRect);
6338
if SrcQDC.vImage = nil then
6339
QImage_destroy(Image);
6344
{------------------------------------------------------------------------------
6345
Function: SystemParametersInfo
6346
Params: uiAction: System-wide parameter to be retrieved or set
6347
uiParam: Depends on the system parameter being queried or set
6348
pvParam: Depends on the system parameter being queried or set
6350
Returns: True if the function succeeds
6351
retrieves or sets the value of one of the system-wide parameters
6352
------------------------------------------------------------------------------}
6353
function TQtWidgetSet.SystemParametersInfo(uiAction: DWord; uiParam: DWord; pvParam: Pointer; fWinIni: DWord): LongBool;
6356
SPI_GETWHEELSCROLLLINES: PDword(pvPAram)^ := QApplication_wheelScrollLines;
6357
SPI_GETWORKAREA: begin
6358
TRect(pvParam^):=Bounds(GetSystemMetrics(SM_XVIRTUALSCREEN),
6359
GetSystemMetrics(SM_YVIRTUALSCREEN),
6360
GetSystemMetrics(SM_CXVIRTUALSCREEN),
6361
GetSystemMetrics(SM_CYVIRTUALSCREEN));
6369
(*{------------------------------------------------------------------------------
6370
Method: UpdateWindow
6373
------------------------------------------------------------------------------}
6374
function TQtWidgetSet.UpdateWindow(Handle: HWND): Boolean;
6376
{$ifdef VerboseQtWinAPI}
6377
WriteLn('[WinAPI UpdateWindow]');
6382
TQtWidget(Handle).Update;
6387
{------------------------------------------------------------------------------
6388
Method: WindowFromPoint
6390
Returns: The return value is a handle to the window that contains the param
6392
If no window exists at the given point, the return value is 0.
6393
If the point is over a static text control,
6394
the return value is a handle to the window under the static text control.
6395
------------------------------------------------------------------------------}
6396
function TQtWidgetSet.WindowFromPoint(APoint: TPoint): HWND;
6400
// we use cachedresults instead of calling very expensive widgetAt
6401
if (FLastWFPResult <> 0) then
6403
if not IsValidWidgetAtCachePointer then
6406
if (APoint.X = FLastWFPMousePos.X) and (APoint.Y = FLastWFPMousePos.Y) and
6407
TQtWidget(FLastWFPResult).getVisible and
6408
TQtWidget(FLastWFPResult).getEnabled then
6410
// return from cache
6411
exit(FLastWFPResult);
6416
Widget := QApplication_widgetAt(APoint.x, APoint.y);
6418
if (Widget = nil) then
6420
if (APoint.X = FLastWFPMousePos.X) and (APoint.Y = FLastWFPMousePos.Y) then
6422
FLastWFPMousePos := Point(MaxInt, MaxInt);
6423
FLastWFPResult := 0;
6428
// according to MSDN disabled widget shouldn't be in result
6429
// but win32 returns first enabled and visible parent !
6430
if not QWidget_isEnabled(Widget) or not QWidget_isVisible(Widget) then
6432
while Widget <> nil do
6434
Widget := QWidget_parentWidget(Widget);
6435
if (Widget <> nil) and QWidget_IsVisible(Widget) and
6436
QWidget_isEnabled(Widget) then
6439
if Widget = nil then
6443
Result := HwndFromWidgetH(Widget);
6445
// return from cache if we are same TQtWidget, just update point
6446
if IsValidWidgetAtCachePointer and (Result = FLastWFPResult) then
6448
FLastWFPMousePos := APoint;
6449
exit(FLastWFPResult);
6452
// maybe we are viewport of native QAbstractScrollArea (eg. QTextEdit).
6453
if (Result = 0) then
6455
if QWidget_parentWidget(Widget) <> nil then
6457
while (Widget <> nil) do
6459
Widget := QWidget_parentWidget(Widget);
6460
if Widget <> nil then
6461
Result := HwndFromWidgetH(Widget);
6468
if (Result <> 0) and
6469
not (TQtWidget(Result) is TQtMainWindow) then
6471
if TQtWidget(Result).getOwner <> nil then
6472
Result := HWND(TQtWidget(Result).getOwner);
6475
Widget := QApplication_topLevelAt(APoint.x, APoint.y);
6476
if (Widget <> nil) and QWidget_isEnabled(Widget) then
6477
Result := HwndFromWidgetH(Widget)
6483
FLastWFPResult := Result;
6484
FLastWFPMousePos := APoint;
6487
//##apiwiz##eps## // Do not remove, no wizard declaration after this line