]>
git.saurik.com Git - wxWidgets.git/blob - src/msw/statbmp.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxStaticBitmap
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "statbmp.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
24 #include "wx/statbmp.h"
28 #include "wx/msw/private.h"
30 #if !USE_SHARED_LIBRARY
31 IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap
, wxControl
)
38 bool wxStaticBitmap::Create(wxWindow
*parent
, wxWindowID id
,
39 const wxBitmap
& bitmap
,
45 m_messageBitmap
= bitmap
;
47 if (parent
) parent
->AddChild(this);
49 m_backgroundColour
= parent
->GetDefaultBackgroundColour() ;
50 m_foregroundColour
= parent
->GetDefaultForegroundColour() ;
53 m_windowId
= (int)NewControlId();
62 if ( width
< 0 && bitmap
.Ok() )
63 width
= bitmap
.GetWidth();
64 if ( height
< 0 && bitmap
.Ok() )
65 height
= bitmap
.GetHeight();
67 m_windowStyle
= style
;
69 // Use an ownerdraw button to produce a static bitmap, since there's
70 // no ownerdraw static.
71 // TODO: perhaps this should be a static item, with style SS_BITMAP.
73 CreateWindowEx(0, "BUTTON", "", BS_OWNERDRAW
| WS_TABSTOP
| WS_CHILD
,
74 0, 0, 0, 0, (HWND
) parent
->GetHWND(), (HMENU
)m_windowId
,
75 wxGetInstance(), NULL
);
76 m_hWnd
= (WXHWND
) static_item
;
78 // Subclass again for purposes of dialog editing mode
79 SubclassWin((WXHWND
) static_item
);
80 SetSize(x
, y
, width
, height
);
84 void wxStaticBitmap::SetSize(int x
, int y
, int width
, int height
, int sizeFlags
)
86 int currentX
, currentY
;
87 GetPosition(¤tX
, ¤tY
);
91 if (x
== -1 || (sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
93 if (y
== -1 || (sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
96 AdjustForParentClientOrigin(x1
, y1
, sizeFlags
);
98 int actualWidth
= width
;
99 int actualHeight
= height
;
104 // If we're prepared to use the existing width, then...
105 if (width
== -1 && ((sizeFlags
& wxSIZE_AUTO_WIDTH
) != wxSIZE_AUTO_WIDTH
))
107 else actualWidth
= width
;
109 // If we're prepared to use the existing height, then...
110 if (height
== -1 && ((sizeFlags
& wxSIZE_AUTO_HEIGHT
) != wxSIZE_AUTO_HEIGHT
))
112 else actualHeight
= height
;
114 MoveWindow((HWND
) GetHWND(), x1
, y1
, actualWidth
, actualHeight
, TRUE
);
117 void wxStaticBitmap::SetBitmap(const wxBitmap
& bitmap
)
119 m_messageBitmap
= bitmap
;
126 rect
.left
= x
; rect
.top
= y
; rect
.right
= x
+ w
; rect
.bottom
= y
+ h
;
129 MoveWindow((HWND
) GetHWND(), x
, y
, bitmap
.GetWidth(), bitmap
.GetHeight(),
132 InvalidateRect((HWND
) GetParent()->GetHWND(), &rect
, TRUE
);
135 bool wxStaticBitmap::MSWOnDraw(WXDRAWITEMSTRUCT
*item
)
137 long style
= GetWindowLong((HWND
) GetHWND(), GWL_STYLE
);
139 if ((style
& 0xFF) == SS_BITMAP
)
141 // Should we call Default() here?
144 // Let default procedure draw the bitmap, which is defined
145 // in the Windows resource.
150 LPDRAWITEMSTRUCT lpDIS
= (LPDRAWITEMSTRUCT
) item
;
152 wxBitmap
* bitmap
= &m_messageBitmap
;
156 HDC hDC
= lpDIS
->hDC
;
157 HDC memDC
= ::CreateCompatibleDC(hDC
);
159 HBITMAP old
= (HBITMAP
) ::SelectObject(memDC
, (HBITMAP
) bitmap
->GetHBITMAP());
164 RECT rect
= lpDIS
->rcItem
;
166 int x
= lpDIS
->rcItem
.left
;
167 int y
= lpDIS
->rcItem
.top
;
168 int width
= lpDIS
->rcItem
.right
- x
;
169 int height
= lpDIS
->rcItem
.bottom
- y
;
171 // Centre the bitmap in the control area
172 int x1
= (int) (x
+ ((width
- bitmap
->GetWidth()) / 2));
173 int y1
= (int) (y
+ ((height
- bitmap
->GetHeight()) / 2));
175 ::BitBlt(hDC
, x1
, y1
, bitmap
->GetWidth(), bitmap
->GetHeight(), memDC
, 0, 0, SRCCOPY
);
177 ::SelectObject(memDC
, old
);
184 long wxStaticBitmap::MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
)
186 // Ensure that static items get messages. Some controls don't like this
187 // message to be intercepted (e.g. RichEdit), hence the tests.
188 if (nMsg
== WM_NCHITTEST
)
189 return (long)HTCLIENT
;
191 return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
);