ChangeBmp.cpp
上传用户:do_tie
上传日期:2007-11-03
资源大小:1095k
文件大小:3k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // ChangeBmp.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "GandyDraw.h"
  5. #include "ChangeBmp.h"
  6. // CChangeBmp 对话框
  7. IMPLEMENT_DYNAMIC(CChangeBmp, CDialog)
  8. CChangeBmp::CChangeBmp(CWnd* pParent /*=NULL*/)
  9. : CDialog(CChangeBmp::IDD, pParent)
  10. , m_iShowWidth(0)
  11. , m_iShowHeight(0)
  12. , m_BmpPathName(_T(""))
  13. {
  14. m_FileBitmap.LoadBitmapW(IDB_BITMAP_MM);
  15. }
  16. CChangeBmp::~CChangeBmp()
  17. {
  18. }
  19. void CChangeBmp::DoDataExchange(CDataExchange* pDX)
  20. {
  21. CDialog::DoDataExchange(pDX);
  22. DDX_Text(pDX, IDC_SHOW_WIDTH, m_iShowWidth);
  23. DDX_Text(pDX, IDC_SHOW_HEIGHT, m_iShowHeight);
  24. }
  25. BEGIN_MESSAGE_MAP(CChangeBmp, CDialog)
  26. ON_BN_CLICKED(IDC_LOADBMP, &CChangeBmp::OnBnClickedLoadbmp)
  27. ON_WM_PAINT()
  28. END_MESSAGE_MAP()
  29. // CChangeBmp 消息处理程序
  30. void CChangeBmp::OnBnClickedLoadbmp()
  31. {
  32. wchar_t filters[] = L"位图文件(*.bmp)|*.bmp|所有文件(*.*)|*.*||";
  33. CFileDialog fileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filters);
  34. if (fileDlg.DoModal() == IDOK) 
  35. {
  36. HBITMAP hBmp = (HBITMAP)LoadImage(NULL, fileDlg.GetPathName(), 
  37. IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | 
  38. LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
  39. if (hBmp != NULL) {
  40. BITMAP bm;
  41. GetObject(hBmp, sizeof(bm), &bm);
  42. long cb = bm.bmBitsPixel * bm.bmHeight * bm.bmWidthBytes;
  43. bm.bmBits = new char[cb];
  44. GetBitmapBits(hBmp, cb, bm.bmBits);
  45. m_FileBitmap.CreateBitmapIndirect(&bm);
  46. m_BmpPathName = fileDlg.GetPathName();
  47. //m_bBitmapLoaded = true;
  48. }
  49. }
  50. //BITMAP bs;
  51. //m_FileBitmap.GetBitmap(&bs);
  52. //m_iShowWidth = bs.bmWidth;
  53. //m_iShowHeight = bs.bmHeight;
  54. //UpdateData(false);
  55. }
  56. void CChangeBmp::ShowImg(UINT ID, HBITMAP hBmp)
  57. {
  58. CWnd* pWnd = GetDlgItem(ID);
  59. CDC* pDC = pWnd->GetDC();
  60. CRect rect; 
  61. pWnd->GetClientRect(&rect);
  62. pDC->FillSolidRect(&rect,RGB(128,128,128));
  63. pWnd->Invalidate();
  64. pWnd->UpdateWindow();
  65. BITMAP bs;
  66. GetObject(hBmp, sizeof(bs), &bs);
  67. CDC dc;
  68. if(dc.CreateCompatibleDC(pDC)) {
  69. int x0, y0, w, h;
  70. float rx = (float)bs.bmWidth / rect.right, 
  71. ry = (float)bs.bmHeight / rect.bottom;
  72. if (rx >= ry) {
  73. x0 = 0; w = rect.right;
  74. h = (int)(bs.bmHeight / rx + 0.5);
  75. y0 = (rect.bottom - h) / 2;
  76. }
  77. else {
  78. y0 = 0; h = rect.bottom;
  79. w = (int)(bs.bmWidth / ry + 0.5);
  80. x0 = (rect.right - w) / 2;
  81. }
  82. ::SelectObject(dc.GetSafeHdc(), hBmp);
  83. pDC->SetStretchBltMode(HALFTONE);
  84. pDC->StretchBlt(x0, y0, w, h, &dc, 0, 0, bs.bmWidth, bs.bmHeight, SRCCOPY);
  85. SetDlgItemInt(IDC_SHOW_WIDTH, bs.bmWidth);
  86. SetDlgItemInt(IDC_SHOW_HEIGHT, bs.bmHeight);
  87. }
  88. }
  89. void CChangeBmp::OnPaint()
  90. {
  91. CPaintDC dc(this); // device context for painting
  92. // TODO: 在此处添加消息处理程序代码
  93. // 不为绘图消息调用 CDialog::OnPaint()
  94. HBITMAP hBmp = (HBITMAP)LoadImage(NULL, m_BmpPathName, 
  95. IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | 
  96. LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
  97. if (hBmp != NULL) {
  98. BITMAP bm;
  99. GetObject(hBmp, sizeof(bm), &bm);
  100. long cb = bm.bmBitsPixel * bm.bmHeight * bm.bmWidthBytes;
  101. bm.bmBits = new char[cb];
  102. GetBitmapBits(hBmp, cb, bm.bmBits);
  103.     m_FileBitmap.CreateBitmapIndirect(&bm);
  104. }
  105. ShowImg(IDC_SHOWBMP,m_FileBitmap);
  106. }