|
|
1.1 root 1: // This is a part of the Microsoft Foundation Classes C++ library.
2: // Copyright (C) 1992 Microsoft Corporation
3: // All rights reserved.
4: //
5: // This source code is only intended as a supplement to the
6: // Microsoft Foundation Classes Reference and Microsoft
7: // QuickHelp documentation provided with the library.
8: // See these sources for detailed information regarding the
9: // Microsoft Foundation Classes product.
10:
11:
12: #include "afxwin.h"
13: #pragma hdrstop
14:
15: #ifdef AFX_CORE_SEG
16: #pragma code_seg(AFX_CORE_SEG)
17: #endif
18:
19: #ifdef _DEBUG
20: #undef THIS_FILE
21: static char BASED_CODE THIS_FILE[] = __FILE__;
22: #define new DEBUG_NEW
23: #endif
24:
25: /////////////////////////////////////////////////////////////////////////////
26: // CBitmapButton
27:
28: IMPLEMENT_DYNAMIC(CBitmapButton, CButton)
29:
30: // LoadBitmaps will load in the two bitmaps
31: BOOL CBitmapButton::LoadBitmaps(LPCSTR lpBitmapResource,
32: LPCSTR lpBitmapResourceSel, LPCSTR lpBitmapResourceFocus /* = NULL */)
33: {
34: m_bitmap.DeleteObject();
35: if (!m_bitmap.LoadBitmap(lpBitmapResource))
36: {
37: TRACE("Failed to load bitmap for normal image\n");
38: return FALSE;
39: }
40: if (lpBitmapResourceSel != NULL)
41: {
42: m_bitmapSel.DeleteObject();
43: if (!m_bitmapSel.LoadBitmap(lpBitmapResourceSel))
44: {
45: TRACE("Failed to load bitmap for selected image\n");
46: return FALSE;
47: }
48: }
49: if (lpBitmapResourceFocus != NULL)
50: {
51: m_bitmapFocus.DeleteObject();
52: if (!m_bitmapFocus.LoadBitmap(lpBitmapResourceFocus))
53: {
54: TRACE("Failed to load bitmap for focused image\n");
55: return FALSE;
56: }
57: }
58: return TRUE;
59: }
60:
61: // SizeToContent will resize the button to the size of the bitmap
62: void CBitmapButton::SizeToContent()
63: {
64: ASSERT(m_bitmap.m_hObject != NULL);
65: CSize bitmapSize;
66: BITMAP bmInfo;
67: VERIFY(m_bitmap.GetObject(sizeof(bmInfo), &bmInfo) == sizeof(bmInfo));
68: VERIFY(SetWindowPos(NULL, -1, -1, bmInfo.bmWidth, bmInfo.bmHeight,
69: SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE));
70: }
71:
72: // Autoload will load the bitmap resources based on the text of
73: // the button
74: // Using suffices "U", "D" and "F" for up/down/focus (must have all three)
75: BOOL CBitmapButton::AutoLoad(UINT nID, CWnd* pParent)
76: {
77: // first attach the CBitmapButton to the dialog control
78: if (!SubclassDlgItem(nID, pParent))
79: return FALSE;
80:
81: CString buttonName;
82: GetWindowText(buttonName);
83: ASSERT(!buttonName.IsEmpty()); // must provide a title
84:
85: if (!LoadBitmaps(buttonName + "U", buttonName + "D", buttonName + "F"))
86: return FALSE;
87:
88: // size to content
89: SizeToContent();
90: return TRUE;
91: }
92:
93: // Draw the appropriate bitmap
94: void CBitmapButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
95: {
96: // must have at least the first bitmap loaded before calling DrawItem
97: ASSERT(m_bitmap.m_hObject != NULL); // required
98:
99: // use the main bitmap for up, the selected bitmap for down
100: CBitmap* pBitmap = &m_bitmap;
101: if ((lpDIS->itemState & ODS_SELECTED) && m_bitmapSel.m_hObject != NULL)
102: pBitmap = &m_bitmapSel;
103: else if ((lpDIS->itemState & ODS_FOCUS) && m_bitmapFocus.m_hObject != NULL)
104: pBitmap = &m_bitmapFocus; // third image for focused
105:
106: if (lpDIS->itemAction & (ODA_DRAWENTIRE|ODA_SELECT|ODA_FOCUS))
107: {
108: // draw the whole button
109: CDC* pDC = CDC::FromHandle(lpDIS->hDC);
110: CDC memDC;
111: memDC.CreateCompatibleDC(pDC);
112: CBitmap* pOld = memDC.SelectObject(pBitmap);
113: if (pOld == NULL)
114: return; // destructors will clean up
115:
116: CRect rect;
117: rect.CopyRect(&lpDIS->rcItem);
118: pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
119: &memDC, 0, 0, SRCCOPY);
120: memDC.SelectObject(pOld);
121: // will delete memDC
122: }
123: }
124:
125: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.