]>
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
);
81 SetFont(* GetParent()->GetFont());
83 SetSize(x
, y
, width
, height
);
87 void wxStaticBitmap::SetSize(int x
, int y
, int width
, int height
, int sizeFlags
)
89 int currentX
, currentY
;
90 GetPosition(¤tX
, ¤tY
);
94 if (x
== -1 || (sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
96 if (y
== -1 || (sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
99 AdjustForParentClientOrigin(x1
, y1
, sizeFlags
);
101 int actualWidth
= width
;
102 int actualHeight
= height
;
107 // If we're prepared to use the existing width, then...
108 if (width
== -1 && ((sizeFlags
& wxSIZE_AUTO_WIDTH
) != wxSIZE_AUTO_WIDTH
))
110 else actualWidth
= width
;
112 // If we're prepared to use the existing height, then...
113 if (height
== -1 && ((sizeFlags
& wxSIZE_AUTO_HEIGHT
) != wxSIZE_AUTO_HEIGHT
))
115 else actualHeight
= height
;
117 MoveWindow((HWND
) GetHWND(), x1
, y1
, actualWidth
, actualHeight
, TRUE
);
120 void wxStaticBitmap::SetBitmap(const wxBitmap
& bitmap
)
122 m_messageBitmap
= bitmap
;
129 rect
.left
= x
; rect
.top
= y
; rect
.right
= x
+ w
; rect
.bottom
= y
+ h
;
132 MoveWindow((HWND
) GetHWND(), x
, y
, bitmap
.GetWidth(), bitmap
.GetHeight(),
135 InvalidateRect((HWND
) GetParent()->GetHWND(), &rect
, TRUE
);
138 bool wxStaticBitmap::MSWOnDraw(WXDRAWITEMSTRUCT
*item
)
140 long style
= GetWindowLong((HWND
) GetHWND(), GWL_STYLE
);
142 if ((style
& 0xFF) == SS_BITMAP
)
144 // Should we call Default() here?
147 // Let default procedure draw the bitmap, which is defined
148 // in the Windows resource.
153 LPDRAWITEMSTRUCT lpDIS
= (LPDRAWITEMSTRUCT
) item
;
155 wxBitmap
* bitmap
= &m_messageBitmap
;
159 HDC hDC
= lpDIS
->hDC
;
160 HDC memDC
= ::CreateCompatibleDC(hDC
);
162 HBITMAP old
= (HBITMAP
) ::SelectObject(memDC
, (HBITMAP
) bitmap
->GetHBITMAP());
167 RECT rect
= lpDIS
->rcItem
;
169 int x
= lpDIS
->rcItem
.left
;
170 int y
= lpDIS
->rcItem
.top
;
171 int width
= lpDIS
->rcItem
.right
- x
;
172 int height
= lpDIS
->rcItem
.bottom
- y
;
174 // Centre the bitmap in the control area
175 int x1
= (int) (x
+ ((width
- bitmap
->GetWidth()) / 2));
176 int y1
= (int) (y
+ ((height
- bitmap
->GetHeight()) / 2));
178 ::BitBlt(hDC
, x1
, y1
, bitmap
->GetWidth(), bitmap
->GetHeight(), memDC
, 0, 0, SRCCOPY
);
180 ::SelectObject(memDC
, old
);
187 long wxStaticBitmap::MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
)
189 // Ensure that static items get messages. Some controls don't like this
190 // message to be intercepted (e.g. RichEdit), hence the tests.
191 if (nMsg
== WM_NCHITTEST
)
192 return (long)HTCLIENT
;
194 return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
);