MappedBitmapButton.cpp
上传用户:cskgc_123
上传日期:2007-01-04
资源大小:56k
文件大小:4k
源码类别:

打印编程

开发平台:

Visual C++

  1. // MappedBitmapButton.cpp : implementation file
  2. //
  3. // Draws color-correct buttons
  4. //
  5. // Copyright (c) 1999 Robin J. Leatherbarrow, Erithacus Software Limited
  6. // 
  7. // Use and distribute freely, except: don't remove my name from the
  8. // source or documentation, mark your changes, don't alter
  9. // or remove this notice.
  10. // No warrantee of any kind, express or implied, is included with this
  11. // software; use at your own risk, responsibility for damages (if any) to
  12. // anyone resulting from the use of this software rests entirely with the
  13. // user.
  14. //
  15. // Send bug reports, bug fixes, enhancements, requests, flames, etc.,
  16. // and I'll try to keep a version up to date.  I can be reached at:
  17. //    robin@erithacus.com
  18. //
  19. // Usage -- a replacement for the MFC CBitmapButton
  20. // 1. include an owner-draw button in your dialog
  21. // 2. declare a CMappedBitmapButton member in the CDialog code
  22. // 3. hook in the CMappedBitmapButton using a call to AutoLoad
  23. //
  24. // the bitmap resource specified in AutoLoad must be divisable into
  25. // 4 equally sized images that represent (left to right) the
  26. // up, down, focused and disabled states of the button
  27. #include "stdafx.h"
  28. #include "MappedBitmapButton.h"
  29. IMPLEMENT_DYNAMIC( CMappedBitmapButton, CButton )
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CMappedBitmapButton
  37. CMappedBitmapButton::CMappedBitmapButton()
  38. {
  39. m_idResource = (UINT)-1;
  40. }
  41. CMappedBitmapButton::~CMappedBitmapButton()
  42. {
  43. }
  44. BEGIN_MESSAGE_MAP(CMappedBitmapButton, CButton)
  45. //{{AFX_MSG_MAP(CMappedBitmapButton)
  46. ON_WM_SYSCOLORCHANGE()
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. BOOL CMappedBitmapButton::LoadBitmap( UINT idBitmapResource )
  50. {
  51. m_image.DeleteImageList();
  52. m_idResource = idBitmapResource;
  53. CBitmap bitImage;
  54. if (!bitImage.LoadMappedBitmap( idBitmapResource )) {
  55. ASSERT( FALSE ); // failed to load the bitmap. Does this resource ID exist?
  56. return FALSE;
  57. }
  58. BITMAP bm;
  59. if (0==bitImage.GetBitmap( &bm ))
  60. return FALSE;
  61. // we don't use a mask for the bitmaps in this case
  62. UINT flags = 0;
  63. if (bm.bmBitsPixel <= 4)
  64. flags |= ILC_COLOR4;
  65. else if (bm.bmBitsPixel <= 8)
  66. flags |= ILC_COLOR8;
  67. else if (bm.bmBitsPixel <= 16)
  68. flags |= ILC_COLOR16;
  69. else
  70. flags |= ILC_COLOR24;
  71. // image should contain EXACTLY four subimages
  72. ASSERT( bm.bmWidth % 4 == 0 );
  73. if (!m_image.Create( bm.bmWidth/4, bm.bmHeight, flags, 4, 0 ))
  74. return FALSE;
  75. // the mask bitmap will be ignored here, so use the bitImage for both
  76. if (-1 == m_image.Add( &bitImage, &bitImage ))
  77. return FALSE;
  78. return TRUE;
  79. }
  80. // SizeToContent will resize the button to the size of the bitmap
  81. void CMappedBitmapButton::SizeToContent()
  82. {
  83. ASSERT(m_image.GetImageCount() == 4);
  84. IMAGEINFO info;
  85. VERIFY( m_image.GetImageInfo( 0, &info ) );
  86. VERIFY(SetWindowPos(NULL, -1, -1, info.rcImage.right, info.rcImage.bottom,
  87. SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE));
  88. }
  89. // Autoload will load the bitmap resources
  90. BOOL CMappedBitmapButton::AutoLoad(UINT nID, CWnd* pParent, UINT idBitmapResource)
  91. {
  92. // first attach the CMappedBitmapButton to the dialog control
  93. if (!SubclassDlgItem(nID, pParent))
  94. return FALSE;
  95. if (!LoadBitmap(idBitmapResource))
  96. return FALSE;
  97. // size to content
  98. SizeToContent();
  99. return TRUE;
  100. }
  101. /////////////////////////////////////////////////////////////////////////////
  102. // CMappedBitmapButton message handlers
  103. void CMappedBitmapButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  104. {
  105. ASSERT(lpDrawItemStruct != NULL);
  106. ASSERT(m_image.GetImageCount() == 4);
  107. // images are:
  108. // 0 = up
  109. // 1 = down
  110. // 2 = focused
  111. // 3 = disabled
  112. int image = 0;
  113. UINT state = lpDrawItemStruct->itemState;
  114. if (state & ODS_SELECTED)
  115. image = 1;
  116. else if (state & ODS_FOCUS)
  117. image = 2;   // third image for focused
  118. else if (state & ODS_DISABLED)
  119. image = 3;   // last image for disabled
  120. // draw the whole button
  121. CRect rect;
  122. rect.CopyRect(&lpDrawItemStruct->rcItem);
  123. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  124. VERIFY( m_image.Draw( pDC, image, rect.TopLeft(), ILD_NORMAL ) );
  125. }
  126. void CMappedBitmapButton::OnSysColorChange() 
  127. {
  128. CButton::OnSysColorChange();
  129. if (m_image.GetImageCount() == 4) {
  130. LoadBitmap( m_idResource );
  131. }
  132. Invalidate();
  133. }