1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
bool
wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item)
{
#ifndef __WXWINCE__
long
style = GetWindowLong((
HWND
) GetHWND(), GWL_STYLE);
if
(style & BS_BITMAP)
{
// Let default procedure draw the bitmap, which is defined
// in the Windows resource.
return
false
;
}
#endif
LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item;
HDC
hDC = lpDIS->hDC;
UINT
state = lpDIS->itemState;
bool
isSelected = (state & ODS_SELECTED) != 0;
bool
autoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
// choose the bitmap to use depending on the button state
wxBitmap *bitmap;
if
( isSelected && m_bmpSelected.Ok() )
bitmap = &m_bmpSelected;
else
if
( m_bmpHover.Ok() && IsMouseInWindow() )
bitmap = &m_bmpHover;
else
if
((state & ODS_FOCUS) && m_bmpFocus.Ok())
bitmap = &m_bmpFocus;
else
if
((state & ODS_DISABLED) && m_bmpDisabled.Ok())
bitmap = &m_bmpDisabled;
else
bitmap = &m_bmpNormal;
if
( !bitmap->Ok() )
return
false
;
// centre the bitmap in the control area
int
x = lpDIS->rcItem.left;
int
y = lpDIS->rcItem.top;
int
width = lpDIS->rcItem.right - x;
int
height = lpDIS->rcItem.bottom - y;
int
wBmp = bitmap->GetWidth();
int
hBmp = bitmap->GetHeight();
#if wxUSE_UXTHEME
if
( autoDraw && wxUxThemeEngine::GetIfActive() )
{
<span style=
"color: #ff0000;"
>MSWDrawXPBackground(
this
, item);
//这里会产生xp风格的背景,可以注释掉,就可以创建png不规则透明按钮了。</span>
wxUxThemeHandle theme(
this
, L
"BUTTON"
);
// calculate content area margins
// assuming here that each state is the same size
MARGINS margins;
wxUxThemeEngine::Get()->GetThemeMargins(theme, NULL,
BP_PUSHBUTTON, PBS_NORMAL,
TMT_CONTENTMARGINS, NULL,
&margins);
int
marginX = margins.cxLeftWidth + 1;
int
marginY = margins.cyTopHeight + 1;
int
x1,y1;
if
( m_windowStyle & wxBU_LEFT )
{
x1 = x + marginX;
}
else
if
( m_windowStyle & wxBU_RIGHT )
{
x1 = x + (width - wBmp) - marginX;
}
else
{
x1 = x + (width - wBmp) / 2;
}
if
( m_windowStyle & wxBU_TOP )
{
y1 = y + marginY;
}
else
if
( m_windowStyle & wxBU_BOTTOM )
{
y1 = y + (height - hBmp) - marginY;
}
else
{
y1 = y + (height - hBmp) / 2;
}
// draw the bitmap
wxDCTemp dst((WXHDC)hDC);
dst.DrawBitmap(*bitmap, x1, y1,
true
);
return
true
;
}
#endif // wxUSE_UXTHEME
int
x1,y1;
if
(m_windowStyle & wxBU_LEFT)
x1 = x + (FOCUS_MARGIN+1);
else
if
(m_windowStyle & wxBU_RIGHT)
x1 = x + (width - wBmp) - (FOCUS_MARGIN+1);
else
x1 = x + (width - wBmp) / 2;
if
(m_windowStyle & wxBU_TOP)
y1 = y + (FOCUS_MARGIN+1);
else
if
(m_windowStyle & wxBU_BOTTOM)
y1 = y + (height - hBmp) - (FOCUS_MARGIN+1);
else
y1 = y + (height - hBmp) / 2;
if
( isSelected && autoDraw )
{
x1++;
y1++;
}
// draw the face, if auto-drawing
if
( autoDraw )
{
DrawFace((WXHDC) hDC,
lpDIS->rcItem.left, lpDIS->rcItem.top,
lpDIS->rcItem.right, lpDIS->rcItem.bottom,
isSelected);
}
// draw the bitmap
wxDCTemp dst((WXHDC)hDC);
dst.DrawBitmap(*bitmap, x1, y1,
true
);
// draw focus / disabled state, if auto-drawing
if
( (state & ODS_DISABLED) && autoDraw )
{
DrawButtonDisable((WXHDC) hDC,
lpDIS->rcItem.left, lpDIS->rcItem.top,
lpDIS->rcItem.right, lpDIS->rcItem.bottom,
true
);
}
else
if
( (state & ODS_FOCUS) && autoDraw )
{
DrawButtonFocus((WXHDC) hDC,
lpDIS->rcItem.left,
lpDIS->rcItem.top,
lpDIS->rcItem.right,
lpDIS->rcItem.bottom,
isSelected);
}
return
true
;
}
|
同时button的老爹控件必须重载:EVT_ERASE_BACKGROUND(MyFrame::OnEraseBackground)
new
wxBitmapButton(frame,wxID_ANY,wxBitmap(wxT(
"lastfm-love-focus.png"
),wxBITMAP_TYPE_PNG), wxPoint(100,50));
|
1 void MyFrame::OnEraseBackground(wxEraseEvent & event) 2 { 3 //初始化DC 4 wxClientDC* clientDC = NULL; 5 if (!event.GetDC()) 6 //取得当前DC 7 clientDC = new wxClientDC(this); 8 wxDC* dc = clientDC ? clientDC : event.GetDC() ; 9 //取得用户区域的大小 10 wxSize sz = GetClientSize(); 11 //加载位图 12 wxEffects effects; 13 effects.TileBitmap(wxRect(0, 0, sz.x, sz.y), *dc, m_imgBack); 14 //删除DC 15 if (clientDC) 16 delete clientDC; 17 }
http://www.cnblogs.com/cr0-3/archive/2011/12/07/2279592.html