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

GDI/图象编程

开发平台:

Visual C++

  1. // DrawSetDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "GandyDraw.h"
  5. #include "DrawSetDlg.h"
  6. // CDrawSetDlg 对话框
  7. IMPLEMENT_DYNAMIC(CDrawSetDlg, CDialog)
  8. CDrawSetDlg::CDrawSetDlg(CWnd* pParent /*=NULL*/)
  9. : CDialog(CDrawSetDlg::IDD, pParent)
  10. , m_iPenStyle(0)
  11. , m_iDrawStyle(0)
  12. , m_iHatchStyle(0)
  13. , m_BmpPathName(_T(""))
  14. , m_iPenWidth(0)
  15. , m_ComboIndex(0)
  16. , m_DrawRadio(0)
  17. , m_bIsFill(false)
  18. , m_iBrushStyle(0)
  19. , m_iBruStyle(0)
  20. , m_iBruHatchStyle(0)
  21. {
  22. ///CBitmap m_Bmp = new CBitmap();
  23. m_Bmp.LoadBitmapW(IDB_BITMAP_MM);
  24. CheckRadioButton(IDC_RADIO2,IDC_RADIO8,IDC_RADIO2);
  25. CheckRadioButton(IDC_RADIO12,IDC_RADIO15,IDC_RADIO12);
  26. }
  27. CDrawSetDlg::~CDrawSetDlg()
  28. {
  29. }
  30. void CDrawSetDlg::DoDataExchange(CDataExchange* pDX)
  31. {
  32. CDialog::DoDataExchange(pDX);
  33. DDX_Text(pDX, IDC_PEN_WIDTH, m_iPenWidth);
  34. DDV_MinMaxInt(pDX, m_iPenWidth, 1, 100);
  35. DDX_CBIndex(pDX, IDC_PEN_STYLE_COMBO, m_ComboIndex);
  36. DDX_Radio(pDX, IDC_RADIO2, m_DrawRadio);
  37. DDX_Check(pDX, IDC_CHECK_FILL, m_bIsFill);
  38. DDX_Radio(pDX, IDC_RADIO12, m_iBruStyle);
  39. DDX_CBIndex(pDX, IDC_BRUSH_STR_COMBO, m_iBruHatchStyle);
  40. }
  41. BEGIN_MESSAGE_MAP(CDrawSetDlg, CDialog)
  42. ON_WM_PAINT()
  43. ON_BN_CLICKED(IDC_PEN_COLOR, &CDrawSetDlg::OnBnClickedPenColor)
  44. ON_BN_CLICKED(IDC_BRUSH_COLOR, &CDrawSetDlg::OnBnClickedBrushColor)
  45. ON_BN_CLICKED(IDOK, &CDrawSetDlg::OnBnClickedOk)
  46. END_MESSAGE_MAP()
  47. // CDrawSetDlg 消息处理程序
  48. void CDrawSetDlg::ShowImg(UINT ID, HBITMAP hBmp)
  49. {
  50. CWnd* pWnd = GetDlgItem(ID);
  51. CDC* pDC = pWnd->GetDC();
  52. CRect rect; 
  53. pWnd->GetClientRect(&rect);
  54. pDC->FillSolidRect(&rect,RGB(128,128,128));
  55. pWnd->Invalidate();
  56. pWnd->UpdateWindow();
  57. BITMAP bs;
  58. GetObject(hBmp, sizeof(bs), &bs);
  59. CDC dc;
  60. if(dc.CreateCompatibleDC(pDC)) {
  61. int x0, y0, w, h;
  62. float rx = (float)bs.bmWidth / rect.right, 
  63. ry = (float)bs.bmHeight / rect.bottom;
  64. if (rx >= ry) {
  65. x0 = 0; w = rect.right;
  66. h = (int)(bs.bmHeight / rx + 0.5);
  67. y0 = (rect.bottom - h) / 2;
  68. }
  69. else {
  70. y0 = 0; h = rect.bottom;
  71. w = (int)(bs.bmWidth / ry + 0.5);
  72. x0 = (rect.right - w) / 2;
  73. }
  74. ::SelectObject(dc.GetSafeHdc(), hBmp);
  75. pDC->SetStretchBltMode(HALFTONE);
  76. pDC->StretchBlt(x0, y0, w, h, &dc, 0, 0, bs.bmWidth, bs.bmHeight, SRCCOPY);
  77. SetDlgItemInt(IDC_BRUSH_BMP_WIDTH, bs.bmWidth);
  78. SetDlgItemInt(IDC_BRUSH_BMP_HEIGHT, bs.bmHeight);
  79. }
  80. }
  81. void CDrawSetDlg::FillColor(UINT ID, COLORREF col)
  82. {
  83. CWnd* pWnd = GetDlgItem(ID);
  84. CDC* pDC = pWnd->GetDC();
  85. pDC->SelectObject(new CPen(PS_SOLID, 1, RGB(0, 0, 0)));
  86. pDC->SelectObject(new CBrush(col));
  87. CRect rect; 
  88. pWnd->GetClientRect(&rect);
  89. pWnd->Invalidate();
  90. pWnd->UpdateWindow();
  91. pDC->RoundRect(&rect, CPoint(8, 8));
  92. }
  93. void CDrawSetDlg::OnPaint()
  94. {
  95. CPaintDC dc(this); // device context for painting
  96. // TODO: 在此处添加消息处理程序代码
  97. // 不为绘图消息调用 CDialog::OnPaint()
  98. FillColor(IDC_PEN_COLOR, m_PenColor);
  99. FillColor(IDC_BRUSH_COLOR, m_BrushColor);
  100. if(m_BmpPathName)
  101. {
  102. HBITMAP hBmp = (HBITMAP)LoadImage(NULL, m_BmpPathName, 
  103. IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | 
  104. LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
  105. if (hBmp != NULL) {
  106. BITMAP bm;
  107. GetObject(hBmp, sizeof(bm), &bm);
  108. long cb = bm.bmBitsPixel * bm.bmHeight * bm.bmWidthBytes;
  109. bm.bmBits = new char[cb];
  110. GetBitmapBits(hBmp, cb, bm.bmBits);
  111. m_Bmp.CreateBitmapIndirect(&bm);
  112. }
  113. }
  114. ShowImg(IDC_SHOWIMG,m_Bmp);
  115. }
  116. void CDrawSetDlg::OnBnClickedPenColor()
  117. {
  118. // TODO: 在此添加控件通知处理程序代码
  119. CColorDialog colDlg(m_PenColor);
  120. if (colDlg.DoModal() == IDOK) {
  121. m_PenColor = colDlg.GetColor();
  122. Invalidate();
  123. UpdateWindow();
  124. }
  125. }
  126. void CDrawSetDlg::OnBnClickedBrushColor()
  127. {
  128. // TODO: 在此添加控件通知处理程序代码
  129. CColorDialog colDlg(m_BrushColor);
  130. if (colDlg.DoModal() == IDOK) {
  131. m_BrushColor = colDlg.GetColor();
  132. Invalidate();
  133. UpdateWindow();
  134. }
  135. }
  136. void CDrawSetDlg::OnBnClickedOk()
  137. {
  138. /*switch(m_ComboIndex)
  139. {
  140. case 0:
  141. m_iPenStyle = PS_SOLID;
  142. break;
  143. case 1:
  144. m_iPenStyle = PS_DASH;
  145. break;
  146. case 2:
  147. m_iPenStyle = PS_DOT;
  148. break;
  149. case 3:
  150. m_iPenStyle = PS_DASHDOT;
  151. break;
  152. case 4:
  153. m_iPenStyle = PS_DASHDOTDOT;
  154. break;
  155. default:
  156. break;
  157. }*/
  158.       m_iPenStyle = m_ComboIndex;
  159.   Invalidate();
  160.   UpdateData(true);
  161.   if(m_bIsFill)  //根据复选项在确定是否是实心
  162.   {
  163. m_iBrushStyle = 1;
  164.   }
  165.   else
  166.   {
  167. m_iBrushStyle = 0;
  168.   }
  169. OnOK();
  170. }
  171. BOOL CDrawSetDlg::OnInitDialog()
  172. {
  173. CDialog::OnInitDialog();
  174. // TODO:  在此添加额外的初始化
  175. CComboBox* pCB = (CComboBox*)GetDlgItem(IDC_PEN_STYLE_COMBO);
  176. pCB->AddString(L"实线");
  177. pCB->AddString(L"点线");
  178. pCB->AddString(L"虚线");
  179. pCB->AddString(L"虚点线");
  180. pCB->AddString(L"虚点点线");
  181. pCB->SetCurSel(m_ComboIndex);
  182. if(m_iBrushStyle == 1)
  183. {
  184. CheckDlgButton(IDC_CHECK_FILL, 1);
  185. }
  186. CComboBox* pCB1 = (CComboBox*)GetDlgItem(IDC_BRUSH_STR_COMBO);
  187.     pCB1->AddString(L"水平线");
  188. pCB1->AddString(L"垂直线");
  189. pCB1->AddString(L"正斜线");
  190. pCB1->AddString(L"反斜线");
  191. pCB1->AddString(L"十字线");
  192. pCB1->AddString(L"斜十字线");
  193. pCB1->SetCurSel(m_iBruHatchStyle);
  194. return TRUE;  // return TRUE unless you set the focus to a control
  195. // 异常: OCX 属性页应返回 FALSE
  196. }