diff --git a/lcl/interfaces/wince/wincecallback.inc b/lcl/interfaces/wince/wincecallback.inc index 0de33afa29..b779b71753 100644 --- a/lcl/interfaces/wince/wincecallback.inc +++ b/lcl/interfaces/wince/wincecallback.inc @@ -291,7 +291,6 @@ Var DCIndex: integer; parLeft, parTop: integer; useDoubleBuffer: boolean; - isNotebook: boolean; isNativeControl: boolean; needParentPaint: boolean; lNotebookFound: boolean; @@ -306,8 +305,6 @@ Var // create a paint message GetClassName(Window, @winClassName, 20); - isNotebook := TWinCEWidgetSet(WidgetSet).ThemesActive and - CompareMem(@winClassName, @TabControlClsName, High(TabControlClsName)+1); isNativeControl := not CompareMem(@winClassName, @ClsName, High(ClsName)+1); ParentPaintWindow := 0; needParentPaint := GetNeedParentPaint(WindowInfo, lWinControl); @@ -334,8 +331,7 @@ Var PushEraseBkgndCommand(ecDiscard); // check if double buffering is requested - useDoubleBuffer := (WParam = 0) and (lWinControl.DoubleBuffered - or TWinCEWidgetSet(WidgetSet).ThemesActive); + useDoubleBuffer := (WParam = 0) and (lWinControl.DoubleBuffered); {$ifdef MSG_DEBUG} if useDoubleBuffer and (DoubleBufferDC <> 0) then begin @@ -423,7 +419,7 @@ Var PaintMsg.PaintStruct := @PS; if not useDoubleBuffer then PaintMsg.DC := DC; - if not needParentPaint and not isNotebook then + if not needParentPaint then begin // send through message to allow message override //lWinControl.EraseBackground(PaintMsg.DC); @@ -988,7 +984,7 @@ begin Assert(False, 'Trace:WindowProc - Checking Proc'); // Assert(False, Format('Trace:WindowProc - Window Value: $%S-%d; Msg Value: %S; WParam: $%S; LParam: $%S', [IntToHex(Window, 4), Window, WM_To_String(Msg), IntToHex(WParam, 4), IntToHex(LParam, 4)])); - Case Msg Of + case Msg Of WM_NULL: begin CheckSynchronize; @@ -996,7 +992,7 @@ begin end; WM_ACTIVATE: begin - Case Lo(WParam) Of + case Lo(WParam) Of WA_ACTIVE, WA_CLICKACTIVE: begin LMessage.Msg := LM_ACTIVATE @@ -1004,24 +1000,7 @@ begin WA_INACTIVE: begin LMessage.Msg := LM_DEACTIVATE; - end; - end; - end; - WM_ACTIVATEAPP: - begin - if Window = TWinCEWidgetSet(WidgetSet).AppHandle then - begin - if WParam <> 0 then - begin - Windows.SetWindowPos(TWinCEWidgetSet(WidgetSet).AppHandle, HWND_TOP, - 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE); - end; - - // activate/deactivate main window - if (Application <> nil) and (Application.MainForm <> nil) and - Application.MainForm.HandleAllocated then - begin - CallDefaultWindowProc(Application.MainForm.Handle, WM_NCACTIVATE, WParam, 0); + // Wince => maybe cast to WM_CLOSE? end; end; end; @@ -1278,7 +1257,14 @@ begin end; WinProcess := false; end; - end else begin + end else + if (lWinControl is TCustomBitBtn) and (PDrawItemStruct(LParam)^.ctlType = ODT_BUTTON) then + begin + DrawBitBtnImage(TCustomBitBtn(lWinControl), PDrawItemStruct(LParam)); + WinProcess := False; + end + else + begin with TLMDrawItems(LMessage) do begin Msg := LM_DRAWITEM; @@ -1300,12 +1286,6 @@ begin If (lWinControl is TCustomFloatSpinEdit) then EnableFloatSpinEditBuddy(Window, WParam<>0); - // ugly hack to give bitbtns a nice look - // When no theming active, the internal image needs to be - // recreated when the enabled state is changed -/// if not TWinCEWidgetSet(WidgetSet).ThemesActive -/// and (lWinControl is TCustomBitBtn) -/// then DrawBitBtnImage(TCustomBitBtn(lWinControl), PChar(TCustomBitBtn(lWinControl).Caption)); end; WM_ERASEBKGND: begin diff --git a/lcl/interfaces/wince/winceextra.pp b/lcl/interfaces/wince/winceextra.pp index b98e25fde8..152b9ce99e 100644 --- a/lcl/interfaces/wince/winceextra.pp +++ b/lcl/interfaces/wince/winceextra.pp @@ -62,6 +62,10 @@ const { missing listview styles} LVS_EX_LABELTIP = $00004000; + + { missing messages } + + WM_HIBERNATE = $03FF; @@ -198,7 +202,7 @@ end; {$goto on} // TODO: remove goto -function DrawState(dc:HDC ; hbr : HBRUSH ; func: DRAWSTATEPROC ; lp:LPARAM; wp:WPARAM;x,y,cx,cy:integer;flags:UINT) : boolean; +function DrawState(dc: HDC; hbr: HBRUSH; func: DRAWSTATEPROC; lp:LPARAM; wp:WPARAM; x, y, cx, cy: integer; flags: UINT): boolean; label cleanup; var @@ -233,9 +237,9 @@ begin if (cx=0) or (cy=0) then begin case opcode of - DST_TEXT,DST_PREFIXTEXT: + DST_TEXT, DST_PREFIXTEXT: begin - if not GetTextExtentPoint32(dc, pwidechar(lp), len, @s) + if not GetTextExtentPoint32(dc, PWideChar(lp), len, @s) then Exit; end; diff --git a/lcl/interfaces/wince/winceint.pp b/lcl/interfaces/wince/winceint.pp index 2d96b25a02..66da21e0bb 100644 --- a/lcl/interfaces/wince/winceint.pp +++ b/lcl/interfaces/wince/winceint.pp @@ -92,8 +92,6 @@ type TWinCEWidgetSet = class(TWidgetSet) private - AppTerminated: Boolean; - // The parent of all windows, represents the button of the taskbar // This window is also the owner of the clipboard. // Assoc. windowproc also acts as handler for popup menus @@ -118,8 +116,6 @@ type FWaitPipeHandlers: PPipeEventInfo; FOnAsyncSocketMsg: TSocketEvent; - - FThemesActive: boolean; { event handler helper functions } procedure HandleProcessEvent(AData: PtrInt; AFlags: dword); @@ -172,7 +168,6 @@ type property AppHandle: HWND read FAppHandle; property MessageFont: HFONT read FMessageFont; - property ThemesActive: boolean read FThemesActive;//just for not removing all those refrences property OnAsyncSocketMsg: TSocketEvent read FOnAsyncSocketMsg write FOnAsyncSocketMsg; end; diff --git a/lcl/interfaces/wince/wincewsbuttons.pp b/lcl/interfaces/wince/wincewsbuttons.pp index 8fff66e76c..5a242a2604 100644 --- a/lcl/interfaces/wince/wincewsbuttons.pp +++ b/lcl/interfaces/wince/wincewsbuttons.pp @@ -29,26 +29,25 @@ interface uses // Libs Windows, + // RTL + SysUtils, Classes, // LCL - SysUtils, Controls, LCLType, Forms, graphics, InterfaceBase, Buttons, LMessages,WinCEProc, WinCEWSControls, + Controls, Buttons, Graphics, GraphType, LCLType, LCLProc, // Widgetset - WSButtons, WSLCLClasses; + WSButtons, WSLCLClasses, WinCEWSControls, WinCEWSImgList, WinCEProc; type { TWinCEWSBitBtn } TWinCEWSBitBtn = class(TWSBitBtn) - private - protected - public + private + protected + public class function CreateHandle(const AWinControl: TWinControl; - const AParams: TCreateParams): HWND; //override; + const AParams: TCreateParams): HWND; override; class procedure GetPreferredSize(const AWinControl: TWinControl; var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override; - class procedure SetBounds(const AWinControl: TWinControl; - const ALeft, ATop, AWidth, AHeight: integer); override; - class procedure SetFont(const AWinControl: TWinControl; const AFont: TFont); override; class procedure SetGlyph(const ABitBtn: TCustomBitBtn; const AValue: TButtonGlyph); override; class procedure SetLayout(const ABitBtn: TCustomBitBtn; const AValue: TButtonLayout); override; class procedure SetMargin(const ABitBtn: TCustomBitBtn; const AValue: Integer); override; @@ -64,51 +63,27 @@ type public end; -procedure DrawBitBtnImage(BitBtn: TCustomBitBtn; ButtonCaption: PWideChar); +procedure DrawBitBtnImage(BitBtn: TCustomBitBtn; DrawStruct: PDrawItemStruct); implementation uses WinCEInt, WinCEExtra; - - -{ TWinCEWSBitBtn } -const - BUTTON_IMAGELIST_ALIGN_LEFT = 0; - BUTTON_IMAGELIST_ALIGN_RIGHT = 1; - BUTTON_IMAGELIST_ALIGN_TOP = 2; - BUTTON_IMAGELIST_ALIGN_BOTTOM = 3; - BUTTON_IMAGELIST_ALIGN_CENTER = 4; - - BCM_FIRST = $1600; - BCM_GETIDEALSIZE = BCM_FIRST + 1; - BCM_SETIMAGELIST = BCM_FIRST + 2; - BCM_GETIMAGELIST = BCM_FIRST + 3; - BCM_SETTEXTMARGIN = BCM_FIRST + 4; - BCM_GETTEXTMARGIN = BCM_FIRST + 5; - - { - you do need to destroy the imagelist yourself. - - you'll need 5 images to support all themed xp button states... - - Image 0 = normal - Image 1 = mouse hover - Image 2 = button down - Image 3 = button disabled - Image 4 = button focus - } - - XPBitBtn_ImageIndexToState: array[1..6] of TButtonState = - (bsUp, bsExclusive, bsDown, bsDisabled, bsUp, bsUp); - BitBtnEnabledToButtonState: array[boolean] of TButtonState = - (bsDisabled, bsUp); - type - BUTTON_IMAGELIST = packed record - himl: Windows.HIMAGELIST; - margin: Windows.RECT; - uAlign: UINT; + TBitBtnAceess = class(TCustomBitBtn) end; +const + ButtonStateToFrameState: array[TButtonState] of UInt = + ( +{ bsUp } DFCS_BUTTONPUSH, +{ bsDisabled } DFCS_BUTTONPUSH or DFCS_INACTIVE, +{ bsDown } DFCS_BUTTONPUSH or DFCS_PUSHED, +{ bsExclusive } DFCS_BUTTONPUSH, +{ bsHot } DFCS_BUTTONPUSH + ); + +{ TWinCEWSBitBtn } {------------------------------------------------------------------------------ Method: DrawBitBtnImage @@ -118,285 +93,148 @@ type Updates the button image combining the glyph and caption ------------------------------------------------------------------------------} -procedure DrawBitBtnImage(BitBtn: TCustomBitBtn; ButtonCaption: PWideChar); +procedure DrawBitBtnImage(BitBtn: TCustomBitBtn; DrawStruct: PDrawItemStruct); var - BitmapHandle: HBITMAP; // Handle of the button glyph BitBtnLayout: TButtonLayout; // Layout of button and glyph - BitBtnHandle: HWND; // Handle to bitbtn window - BitBtnDC: HDC; // Handle to DC of bitbtn window OldFontHandle: HFONT; // Handle of previous font in hdcNewBitmap - hdcNewBitmap: HDC; // Device context of the new Bitmap - SrcDC, MaskDC: HDC; - BitmapInfo: BITMAP; // Buffer for bitmap TextSize: Windows.SIZE; // For computing the length of button caption in pixels - OldBitmap: HBITMAP; // Handle to the old selected bitmap - NewBitmap: HBITMAP; // Handle of the new bitmap - MaskBmp, OldSrcBmp, OldMaskBmp: HBITMAP; - OldBitmapHandle: HBITMAP; // Handle of the provious bitmap in hdcNewBitmap XDestBitmap, YDestBitmap: integer; // X,Y coordinate of destination rectangle for bitmap XDestText, YDestText: integer; // X,Y coordinates of destination rectangle for caption newWidth, newHeight: integer; // dimensions of new combined bitmap - srcWidth: integer; // width of glyph to use, bitmap may have multiple glyphs - BitmapRect: Windows.RECT; - ButtonImageList: BUTTON_IMAGELIST; - I: integer; + srcWidth, srcHeight: integer; // width of glyph to use, bitmap may have multiple glyphs + DrawRect: TRect; + ButtonCaption: PWideChar; + ButtonState: TButtonState; - procedure DrawBitmap(AState: TButtonState); + procedure DrawBitmap; var - MonoDC: HDC; - MonoBmp, OldMonoBmp: HBITMAP; - BkColor: TColorRef; - TextFlags: integer; // flags for caption (enabled or disabled) - numGlyphs, glyphLeft, glyphWidth, glyphHeight: integer; - themesActive, emulateDisabled: boolean; + w, h: integer; + AIndex: Integer; + AEffect: TGraphicsDrawEffect; begin - emulateDisabled := false; - glyphLeft := 0; - glyphWidth := srcWidth; - glyphHeight := BitmapInfo.bmHeight; TextFlags := DST_PREFIXTEXT; - numGlyphs := BitBtn.NumGlyphs; - case AState of - bsDisabled: - begin - if numGlyphs > 1 then - glyphLeft := glyphWidth - else - emulateDisabled := true; - TextFlags := TextFlags or DSS_DISABLED; - end; - bsDown: if numGlyphs > 2 then glyphLeft := 2*glyphWidth; - bsExclusive: if numGlyphs > 3 then glyphLeft := 3*glyphWidth; - end; + if ButtonState = bsDisabled then + TextFlags := TextFlags or DSS_DISABLED; // fill with background color - OldBitmapHandle := SelectObject(hdcNewBitmap, NewBitmap); - Windows.FillRect(hdcNewBitmap, BitmapRect, BitBtn.Brush.Handle); - if not emulateDisabled then - begin - if MaskBmp <> 0 then - BitBlt(hdcNewBitmap, XDestBitmap, YDestBitmap, glyphWidth, - glyphHeight, MaskDC, glyphLeft, 0, SRCCOPY); - end else begin - // when not themed, windows wants a white background picture for disabled button image - ///themesActive := TWinCEWidgetSet(WidgetSet).ThemesActive; - ///if not themesActive then - FillRect(hdcNewBitmap, BitmapRect, GetStockObject(BLACK_BRUSH)); - if BitmapHandle <> 0 then - begin - // Create a Mono DC - MonoBmp := CreateBitmap(glyphWidth, glyphHeight, 1, 1, nil); - MonoDC := CreateCompatibleDC(hdcNewBitmap); - OldMonoBmp := SelectObject(MonoDC, MonoBmp); - // Create the black and white image - BkColor := SetBkColor(MaskDC, ColorToRGB(BitBtn.Brush.Color)); - BitBlt(MonoDC, 0, 0, glyphWidth, glyphHeight, MaskDC, glyphLeft, 0, SRCCOPY); - SetBkColor(MaskDC, BkColor); - {if themesActive then - begin - // non-themed winapi wants white/other as background/picture-disabled colors - // themed winapi draws bitmap-as, with transparency defined by bitbtn.brush color - BkColor := SetBkColor(hdcNewBitmap, ColorToRGB(BitBtn.Brush.Color)); - SetTextColor(hdcNewBitmap, GetSysColor(COLOR_BTNSHADOW)); - end;} - // Draw the black and white image - BitBlt(hdcNewBitmap, XDestBitmap, YDestBitmap, glyphWidth, glyphHeight, - MonoDC, 0, 0, SRCCOPY); - - SelectObject(MonoDC, OldMonoBmp); - DeleteDC(MonoDC); - DeleteObject(MonoBmp); - end; - end; - SetBkMode(hdcNewBitmap, TRANSPARENT); - SetTextColor(hdcNewBitmap, 0); - DrawState(hdcNewBitmap, 0, nil, LPARAM(ButtonCaption), 0, XDestText, YDestText, 0, 0, TextFlags); - SelectObject(hdcNewBitmap, OldBitmapHandle); + if (srcWidth <> 0) and (srcHeight <> 0) then + begin + TBitBtnAceess(BitBtn).FButtonGlyph.GetImageIndexAndEffect(ButtonState, AIndex, AEffect); + + w := TBitBtnAceess(BitBtn).FButtonGlyph.Images.Width; + h := TBitBtnAceess(BitBtn).FButtonGlyph.Images.Height; + + TWinCEWSCustomImageList.DrawToDC(TBitBtnAceess(BitBtn).FButtonGlyph.Images, AIndex, + DrawStruct^._hDC, Rect(XDestBitmap, YDestBitmap, w, h), + TBitBtnAceess(BitBtn).FButtonGlyph.Images.BkColor, + TBitBtnAceess(BitBtn).FButtonGlyph.Images.BlendColor, AEffect, + TBitBtnAceess(BitBtn).FButtonGlyph.Images.DrawingStyle, + TBitBtnAceess(BitBtn).FButtonGlyph.Images.ImageType); + end; + SetBkMode(DrawStruct^._hDC, TRANSPARENT); + if ButtonState = bsDown then + SetTextColor(DrawStruct^._hDC, $FFFFFF) + else + SetTextColor(DrawStruct^._hDC, 0); + DrawState(DrawStruct^._hDC, 0, nil, LPARAM(ButtonCaption), 0, XDestText, YDestText, 0, 0, TextFlags); end; -var -tmpWideText : PWideChar; + begin + DrawRect := DrawStruct^.rcItem; + + if DrawStruct^.itemState and ODS_DISABLED <> 0 then + ButtonState := bsDisabled + else + if DrawStruct^.itemState and (ODS_FOCUS or ODS_SELECTED) = (ODS_FOCUS or ODS_SELECTED) then + ButtonState := bsDown + else + if DrawStruct^.itemState and ODS_FOCUS = ODS_FOCUS then + ButtonState := bsHot + else + ButtonState := bsUp; + + DrawFrameControl(DrawStruct^._hDC, DrawRect, DFC_BUTTON, ButtonStateToFrameState[ButtonState]); + + // DFCS_ADJUSTRECT doesnot work + InflateRect(DrawRect, -4, -4); + + ButtonCaption := StringToPWideChar(BitBtn.Caption); // gather info about bitbtn - BitBtnHandle := BitBtn.Handle; if BitBtn.Glyph.Empty then begin - BitmapHandle := 0; - BitmapInfo.bmWidth := 0; - BitmapInfo.bmHeight := 0; srcWidth := 0; - end else begin - BitmapHandle := BitBtn.Glyph.Handle; - Windows.GetObject(BitmapHandle, sizeof(BitmapInfo), @BitmapInfo); - srcWidth := BitmapInfo.bmWidth; - if BitBtn.NumGlyphs > 1 then - srcWidth := srcWidth div BitBtn.NumGlyphs; + srcHeight := 0; + end else + begin + srcWidth := TBitBtnAceess(BitBtn).FButtonGlyph.Images.Width; + srcHeight := TBitBtnAceess(BitBtn).FButtonGlyph.Images.Height; end; BitBtnLayout := BitBtn.Layout; - BitBtnDC := GetDC(BitBtnHandle); - hdcNewBitmap := CreateCompatibleDC(BitBtnDC); - OldFontHandle := SelectObject(hdcNewBitmap, BitBtn.Font.Handle); - tmpWideText := StringToPWideChar(ButtonCaption); - GetTextExtentPoint32(hdcNewBitmap, tmpWideText, Length(ButtonCaption), @TextSize); - FreeMem(tmpWideText); + + OldFontHandle := SelectObject(DrawStruct^._hDC, BitBtn.Font.Reference.Handle); + GetTextExtentPoint32(DrawStruct^._hDC, ButtonCaption, Length(BitBtn.Caption), @TextSize); // calculate size of new bitmap case BitBtnLayout of blGlyphLeft, blGlyphRight: begin - if BitBtn.Spacing = -1 then - newWidth := BitBtn.Width - 10 - else - newWidth := TextSize.cx + srcWidth + BitBtn.Spacing; - if BitmapHandle <> 0 then + YDestBitmap := (DrawRect.Bottom + DrawRect.Top - srcHeight) div 2; + YDestText := (DrawRect.Bottom + DrawRect.Top - TextSize.cy) div 2; + + newWidth := TextSize.cx + srcWidth; + + if BitBtn.Spacing <> -1 then + newWidth := newWidth + BitBtn.Spacing; + + if srcWidth <> 0 then inc(newWidth, 2); - newHeight := TextSize.cy; - if newHeight < BitmapInfo.bmHeight then - newHeight := BitmapInfo.bmHeight; - YDestBitmap := (newHeight - BitmapInfo.bmHeight) div 2; - YDestText := (newHeight - TextSize.cy) div 2; + case BitBtnLayout of - blGlyphLeft: + blGlyphLeft: begin - XDestBitmap := 0; - XDestText := srcWidth; - if BitBtn.Spacing = -1 then - inc(XDestText, (newWidth - srcWidth - TextSize.cx) div 2) - else - inc(XDestText, BitBtn.Spacing); + XDestBitmap := (DrawRect.Right + DrawRect.Left - newWidth) div 2; + XDestText := XDestBitmap + srcWidth; end; - blGlyphRight: + blGlyphRight: begin - XDestBitmap := newWidth - srcWidth; - XDestText := XDestBitmap - TextSize.cx; - if BitBtn.Spacing = -1 then - dec(XDestText, (newWidth - srcWidth - TextSize.cx) div 2) - else - dec(XDestText, BitBtn.Spacing); + XDestText := (DrawRect.Right + DrawRect.Left - newWidth) div 2; + XDestBitmap := XDestText + TextSize.cx; end; end; end; blGlyphTop, blGlyphBottom: begin - newWidth := TextSize.cx; - if newWidth < srcWidth then - newWidth := srcWidth; - if BitBtn.Spacing = -1 then - newHeight := BitBtn.Height - 10 - else - newHeight := TextSize.cy + BitmapInfo.bmHeight + BitBtn.Spacing; - if BitmapHandle <> 0 then + XDestBitmap := (DrawRect.Right + DrawRect.Left - srcWidth) shr 1; + XDestText := (DrawRect.Right + DrawRect.Left - TextSize.cx) shr 1; + + newHeight := TextSize.cy + srcHeight; + + if BitBtn.Spacing <> -1 then + newHeight := newHeight + BitBtn.Spacing; + + if srcHeight <> 0 then inc(newHeight, 2); - XDestBitmap := (newWidth - srcWidth) shr 1; - XDestText := (newWidth - TextSize.cx) shr 1; + case BitBtnLayout of - blGlyphTop: + blGlyphTop: begin - YDestBitmap := 0; - YDestText := BitmapInfo.bmHeight; - if BitBtn.Spacing = -1 then - inc(YDestText, (newHeight - BitmapInfo.bmHeight - TextSize.cy) div 2) - else - inc(YDestText, BitBtn.Spacing); + YDestBitmap := (DrawRect.Top + DrawRect.Bottom - newHeight) div 2; + YDestText := YDestBitmap + srcHeight; end; - blGlyphBottom: + blGlyphBottom: begin - YDestBitmap := newHeight - BitmapInfo.bmHeight; - YDestText := YDestBitmap - TextSize.cy; - if BitBtn.Spacing = -1 then - dec(YDestText, (newHeight - BitmapInfo.bmHeight - TextSize.cy) div 2) - else - dec(YDestText, BitBtn.Spacing); + YDestText := (DrawRect.Top + DrawRect.Bottom - newHeight) div 2; + YDestBitmap := YDestText + TextSize.cy; end; end; end; end; - // create new - BitmapRect.left := 0; - BitmapRect.top := 0; - BitmapRect.right := newWidth; - BitmapRect.bottom := newHeight; - if (newWidth = 0) or (newHeight = 0) then - begin - NewBitmap := 0; - MaskDC := 0; - MaskBmp := 0; - end else begin - NewBitmap := CreateCompatibleBitmap(BitBtnDC, newWidth, newHeight); - // prepare masked bitmap - OldBitmapHandle := SelectObject(hdcNewBitmap, NewBitmap); - MaskDC := CreateCompatibleDC(hdcNewBitmap); - if BitBtn.Glyph.MaskHandleAllocated then - begin - // Create a mask DC - MaskBmp := CreateCompatibleBitmap(hdcNewBitmap, BitmapInfo.bmWidth, BitmapInfo.bmHeight); - OldMaskBmp := SelectObject(MaskDC, MaskBmp); - SrcDC := CreateCompatibleDC(hdcNewBitmap); - OldSrcBmp := SelectObject(SrcDC, BitmapHandle); - FillRect(MaskDC, BitmapRect, BitBtn.Brush.Handle); - TWinCEWidgetSet(WidgetSet).MaskBlt(MaskDC, 0, 0, BitmapInfo.bmWidth, BitmapInfo.bmHeight, SrcDC, - 0, 0, BitBtn.Glyph.MaskHandle, 0, 0); - end else begin - MaskBmp := BitmapHandle; - OldMaskBmp := SelectObject(MaskDC, MaskBmp); - end; - SelectObject(hdcNewBitmap, OldBitmapHandle); - end; - - // destroy previous bitmap, set new bitmap - {if TWinCEWidgetSet(WidgetSet).ThemesActive then - begin - // winxp draws BM_SETIMAGE bitmap with old style button! - // need to use BCM_SETIMAGELIST - if Windows.SendMessage(BitBtnHandle, BCM_GETIMAGELIST, 0, LPARAM(@ButtonImageList)) <> 0 then - if ButtonImageList.himl <> 0 then - ImageList_Destroy(ButtonImageList.himl); - if NewBitmap <> 0 then - begin - ButtonImageList.himl := ImageList_Create(newWidth, newHeight, ILC_COLORDDB or ILC_MASK, 5, 0); - ButtonImageList.margin.left := 5; - ButtonImageList.margin.right := 5; - ButtonImageList.margin.top := 5; - ButtonImageList.margin.bottom := 5; - ButtonImageList.uAlign := BUTTON_IMAGELIST_ALIGN_CENTER; - // for some reason, if bitmap added to imagelist, need to redrawn, otherwise it's black!? - for I := 1 to 6 do - begin - DrawBitmap(XPBitBtn_ImageIndexToState[I]); - ImageList_AddMasked(ButtonImageList.himl, NewBitmap, ColorToRGB(BitBtn.Brush.Color)); - end; - end else begin - ButtonImageList.himl := 0; - end; + DrawBitmap; - Windows.SendMessage(BitBtnHandle, BCM_SETIMAGELIST, 0, LPARAM(@ButtonImageList)); - if NewBitmap <> 0 then - DeleteObject(NewBitmap); - end else }begin - OldBitmap := Windows.SendMessage(BitBtnHandle, BM_GETIMAGE, IMAGE_BITMAP, 0); - if NewBitmap <> 0 then - DrawBitmap(BitBtnEnabledToButtonState[BitBtn.Enabled]); - Windows.SendMessage(BitBtnHandle, BM_SETIMAGE, IMAGE_BITMAP, NewBitmap); - if OldBitmap <> 0 then - DeleteObject(OldBitmap); - end; - SelectObject(hdcNewBitmap, OldFontHandle); - DeleteDC(hdcNewBitmap); - ReleaseDC(BitBtnHandle, BitBtnDC); - if BitBtn.Glyph.MaskHandleAllocated then - begin - SelectObject(SrcDC, OldSrcBmp); - DeleteDC(SrcDC); - DeleteObject(MaskBmp); - end; - if MaskDC <> 0 then - begin - SelectObject(MaskDC, OldMaskBmp); - DeleteDC(MaskDC); - end; - - BitBtn.Invalidate; + SelectObject(DrawStruct^._hDC, OldFontHandle); + FreeMem(ButtonCaption); end; @@ -411,11 +249,11 @@ begin with Params do begin pClassName := @ButtonClsName; - if TCustomBitBtn(AWinControl).Default Then + if TCustomBitBtn(AWinControl).Default then Flags := Flags or BS_DEFPUSHBUTTON else Flags := Flags or BS_PUSHBUTTON; - Flags := Flags or BS_BITMAP; + Flags := Flags or BS_OWNERDRAW; // Draw bitmap on WM_DRAWITEM WindowTitle := nil; end; // create window @@ -461,78 +299,33 @@ begin end; end; -class procedure TWinCEWSBitBtn.SetBounds(const AWinControl: TWinControl; - const ALeft, ATop, AWidth, AHeight: integer); -var - pwCaption : PWideChar; -begin - TWinCEWSWinControl.SetBounds(AWinControl, ALeft, ATop, AWidth, AHeight); - if TCustomBitBtn(AWinControl).Spacing = -1 then - begin - pwCaption := StringToPWideChar(AWinControl.Caption); - DrawBitBtnImage(TCustomBitBtn(AWinControl), pwCaption); - FreeMem(pwCaption); - end; -end; - -class procedure TWinCEWSBitBtn.SetFont(const AWinControl: TWinControl; - const AFont: TFont); -var - pwCaption : PWideChar; -begin - TWinCEWSWinControl.SetFont(AWinControl, AFont); - pwCaption := StringToPWideChar(AWinControl.Caption); - DrawBitBtnImage(TCustomBitBtn(AWinControl), pwCaption); - FreeMem(pwCaption); -end; - class procedure TWinCEWSBitBtn.SetGlyph(const ABitBtn: TCustomBitBtn; const AValue: TButtonGlyph); -var - pwCaption : PWideChar; begin - pwCaption := StringToPWideChar(ABitBtn.Caption); - DrawBitBtnImage(ABitBtn, pwCaption); - FreeMem(pwCaption); + ABitBtn.invalidate; end; class procedure TWinCEWSBitBtn.SetLayout(const ABitBtn: TCustomBitBtn; const AValue: TButtonLayout); -var - pwCaption : PWideChar; begin - pwCaption := StringToPWideChar(ABitBtn.Caption); - DrawBitBtnImage(ABitBtn, pwCaption); - FreeMem(pwCaption); + ABitBtn.invalidate; end; class procedure TWinCEWSBitBtn.SetMargin(const ABitBtn: TCustomBitBtn; const AValue: Integer); -var - pwCaption : PWideChar; begin - pwCaption := StringToPWideChar(ABitBtn.Caption); - DrawBitBtnImage(ABitBtn, pwCaption); - FreeMem(pwCaption); + ABitBtn.invalidate; end; class procedure TWinCEWSBitBtn.SetSpacing(const ABitBtn: TCustomBitBtn; const AValue: Integer); -var - pwCaption : PWideChar; begin - pwCaption := StringToPWideChar(ABitBtn.Caption); - DrawBitBtnImage(ABitBtn, pwCaption); - FreeMem(pwCaption); + ABitBtn.invalidate; end; class procedure TWinCEWSBitBtn.SetText(const AWinControl: TWinControl; const AText: string); -var - pwCaption : PWideChar; begin - pwCaption := StringToPWideChar(AText); - DrawBitBtnImage(TCustomBitBtn(AWinControl), pwCaption); - FreeMem(pwCaption); + AWinControl.invalidate; end; diff --git a/lcl/interfaces/wince/wincewsextctrls.pp b/lcl/interfaces/wince/wincewsextctrls.pp index 248c688b52..16783cadb9 100644 --- a/lcl/interfaces/wince/wincewsextctrls.pp +++ b/lcl/interfaces/wince/wincewsextctrls.pp @@ -299,12 +299,6 @@ begin FinishCreateWindow(AWinControl, Params, false); // return window handle Result := Params.Window; - if TWinCEWidgetSet(WidgetSet).ThemesActive then - with Params.WindowInfo^ do - begin - needParentPaint := true; - isTabPage := true; - end; end; class procedure TWinCEWSCustomPage.DestroyHandle(const AWinControl: TWinControl);