Files
wxWidgets/src/msw/ownerdrw.cpp
Maarten Bent 7f0d7ef520 Fix several build errors in WXQT
Move declaration of wxOwnerDrawnBase::ms_defaultMargin to correct file.
Do not include headers when wxUSE_UIACTIONSIMULATOR is disabled.
Add guards for wxUSE_DRAG_AND_DROP.
Use a different wxFont constructor in printing sample, which is also available in WXQT.
2018-09-30 17:23:58 +02:00

140 lines
4.3 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: src/msw/ownerdrw.cpp
// Purpose: implementation of wxOwnerDrawn class
// Author: Vadim Zeitlin
// Modified by: Marcin Malich
// Created: 13.11.97
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_OWNER_DRAWN
#include "wx/ownerdrw.h"
#include "wx/msw/dc.h"
#include "wx/msw/private.h"
#include "wx/msw/private/dc.h"
#include "wx/msw/wrapcctl.h" // for HIMAGELIST
// ============================================================================
// implementation of wxOwnerDrawn class
// ============================================================================
// draw the item
bool wxOwnerDrawn::OnDrawItem(wxDC& dc, const wxRect& rc,
wxODAction, wxODStatus stat)
{
// we do nothing if item isn't ownerdrawn
if ( !IsOwnerDrawn() )
return true;
wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl();
HDC hdc = GetHdcOf(*impl);
RECT rect;
wxCopyRectToRECT(rc, rect);
{
// set the font and colors
wxFont font;
GetFontToUse(font);
wxColour colText, colBack;
GetColourToUse(stat, colText, colBack);
SelectInHDC selFont(hdc, GetHfontOf(font));
wxMSWImpl::wxTextColoursChanger textCol(hdc, colText, colBack);
wxMSWImpl::wxBkModeChanger bkMode(hdc, wxBRUSHSTYLE_TRANSPARENT);
AutoHBRUSH hbr(wxColourToPalRGB(colBack));
SelectInHDC selBrush(hdc, hbr);
::FillRect(hdc, &rect, hbr);
// using native API because it recognizes '&'
wxString text = GetName();
SIZE sizeRect;
::GetTextExtentPoint32(hdc, text.c_str(), text.length(), &sizeRect);
int flags = DST_PREFIXTEXT;
if ( (stat & wxODDisabled) && !(stat & wxODSelected) )
flags |= DSS_DISABLED;
if ( (stat & wxODHidePrefix) )
flags |= DSS_HIDEPREFIX;
int x = rc.x + GetMarginWidth();
int y = rc.y + (rc.GetHeight() - sizeRect.cy) / 2;
int cx = rc.GetWidth() - GetMarginWidth();
int cy = sizeRect.cy;
::DrawState(hdc, NULL, NULL, wxMSW_CONV_LPARAM(text),
text.length(), x, y, cx, cy, flags);
} // reset to default the font, colors and brush
if (stat & wxODHasFocus)
::DrawFocusRect(hdc, &rect);
return true;
}
// ----------------------------------------------------------------------------
// global helper functions implemented here
// ----------------------------------------------------------------------------
BOOL wxDrawStateBitmap(HDC hDC, HBITMAP hBitmap, int x, int y, UINT uState)
{
// determine size of bitmap image
BITMAP bmp;
if ( !::GetObject(hBitmap, sizeof(BITMAP), &bmp) )
return FALSE;
BOOL result;
switch ( uState )
{
case wxDSB_NORMAL:
case wxDSB_SELECTED:
{
// uses image list functions to draw
// - normal bitmap with support transparency
// (image list internally create mask etc.)
// - blend bitmap with the background colour
// (like default selected items)
HIMAGELIST hIml = ::ImageList_Create(bmp.bmWidth, bmp.bmHeight,
ILC_COLOR32 | ILC_MASK, 1, 1);
::ImageList_Add(hIml, hBitmap, NULL);
UINT fStyle = uState == wxDSB_SELECTED ? ILD_SELECTED : ILD_NORMAL;
result = ::ImageList_Draw(hIml, 0, hDC, x, y, fStyle);
::ImageList_Destroy(hIml);
}
break;
case wxDSB_DISABLED:
result = ::DrawState(hDC, NULL, NULL, (LPARAM)hBitmap, 0, x, y,
bmp.bmWidth, bmp.bmHeight,
DST_BITMAP | DSS_DISABLED);
break;
default:
wxFAIL_MSG( wxT("DrawStateBitmap: unknown wxDSBStates value") );
result = FALSE;
}
return result;
}
#endif // wxUSE_OWNER_DRAWN