DlgAfxMessage.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:8k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // DlgAfxMessage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "testbt.h"
  5. #include "DlgAfxMessage.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. int AfxMessageBoxEx(LPCTSTR lpszText, UINT nType)
  12. {
  13. CDlgAfxMessage dlg(lpszText, nType);
  14. return dlg.DoModal();
  15. }
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CDlgAfxMessage dialog
  18. CDlgAfxMessage::CDlgAfxMessage(LPCTSTR lpszText, UINT nType, CWnd* pParent /*=NULL*/)
  19. : CDialog(CDlgAfxMessage::IDD, pParent)
  20. {
  21. //{{AFX_DATA_INIT(CDlgAfxMessage)
  22. // NOTE: the ClassWizard will add member initialization here
  23. //}}AFX_DATA_INIT
  24. m_strText = lpszText;
  25. m_nType = nType;
  26. m_cyIcon = m_cxIcon = 32;
  27. m_hIcon = 0;
  28. }
  29. void CDlgAfxMessage::DoDataExchange(CDataExchange* pDX)
  30. {
  31. CDialog::DoDataExchange(pDX);
  32. //{{AFX_DATA_MAP(CDlgAfxMessage)
  33. DDX_Control(pDX, IDNO, m_btnNo);
  34. DDX_Control(pDX, IDCANCEL, m_btnCancel);
  35. DDX_Control(pDX, IDOK, m_btnOK);
  36. //}}AFX_DATA_MAP
  37. }
  38. BEGIN_MESSAGE_MAP(CDlgAfxMessage, CDialog)
  39. //{{AFX_MSG_MAP(CDlgAfxMessage)
  40. ON_WM_PAINT()
  41. ON_BN_CLICKED(IDNO, OnNo)
  42. //}}AFX_MSG_MAP
  43. END_MESSAGE_MAP()
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CDlgAfxMessage message handlers
  46. BOOL CDlgAfxMessage::OnInitDialog() 
  47. {
  48. CDialog::OnInitDialog();
  49. m_font.CreateFont(-13, 0, 0, 0, 400, 0, 0, 0, 134, 0, 0, 0, 2, "宋体");
  50. //
  51. // Create BitmapList
  52. //
  53. HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
  54. MAKEINTRESOURCE(IDB_BITMAP_DLG_ICONS),
  55. IMAGE_BITMAP,
  56. 0,0, // cx,cy
  57. LR_CREATEDIBSECTION); // | LR_LOADMAP3DCOLORS );
  58. CBitmap bm;
  59. bm.Attach(hbm);
  60. m_ctlImage.Create(16,15, ILC_COLOR8|ILC_MASK, 3, 4);
  61. m_ctlImage.SetBkColor(RGB(255, 255,255)); 
  62. m_ctlImage.Add(&bm, (COLORREF)RGB(255,0,255));
  63. //
  64. // set ok cancel button image.
  65. //
  66. // m_btnBrowseDir.Create(m_ctlImage.ExtractIcon(2), true, "选择保存路径");
  67. m_btnOK.Create(m_ctlImage.ExtractIcon(0));
  68. m_btnCancel.Create(m_ctlImage.ExtractIcon(1));
  69. m_btnNo.Create(m_ctlImage.ExtractIcon(1));
  70. //
  71. // Set dialog text
  72. //
  73. SetWindowText(AfxGetApp()->m_pszAppName);
  74. //
  75. // compute the size
  76. //
  77. int iButtonWidth = 100, iButtonHeight = 30;
  78. int iImageWidth = m_cyIcon + 20;
  79. int iEdge = 10;
  80. int iWidth = 200, iHeight = 0;
  81. const int iCaptionHeight = ::GetSystemMetrics(SM_CYCAPTION);
  82. if ((m_nType&0xf) == MB_OK)
  83. {
  84. m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION);
  85. iWidth = iButtonWidth + iEdge * 10;
  86. }
  87. else if ((m_nType&0xf) == MB_OKCANCEL)
  88. {
  89. m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_QUESTION);
  90. iWidth = iButtonWidth * 2 + iEdge * 12;
  91. }
  92. else if ((m_nType&0xf) == MB_YESNO)
  93. {
  94. m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_QUESTION);
  95. iWidth = iButtonWidth * 2 + iEdge * 12;
  96. }
  97. else if ((m_nType&0xf) == MB_YESNOCANCEL)
  98. {
  99. m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_QUESTION);
  100. iWidth = iButtonWidth * 3 + iEdge * 13;
  101. }
  102. else
  103. {
  104. ASSERT(FALSE);
  105. return FALSE;
  106. }
  107. //
  108. // compute the image rect.
  109. //
  110. m_rcImage.top = iEdge;
  111. m_rcImage.bottom = m_rcImage.top + m_cyIcon;
  112. m_rcImage.left = iEdge;
  113. m_rcImage.right = m_rcImage.left + m_cxIcon;
  114. //
  115. // compute the text rect.
  116. //
  117. CClientDC dc(this);
  118. // select font.
  119. CFont* poldFont = dc.SelectObject(&m_font);
  120. int iTextWidth = 0;
  121. CString strTemp = m_strText;
  122. CSize sizeTextExtent = CSize(0, 0);
  123. while (!strTemp.IsEmpty())
  124. {
  125. int iRet = strTemp.Find("rn");
  126. if (iRet == -1) 
  127. {
  128. sizeTextExtent = dc.GetTextExtent(strTemp);
  129. if (iTextWidth < sizeTextExtent.cx)
  130. iTextWidth = sizeTextExtent.cx;
  131. break;
  132. }
  133. CString strLeft = strTemp.Left(iRet);
  134. strTemp = strTemp.Right(strTemp.GetLength() - iRet - 2);
  135. sizeTextExtent = dc.GetTextExtent(strLeft);
  136. if (iTextWidth < sizeTextExtent.cx)
  137. iTextWidth = sizeTextExtent.cx;
  138. }
  139. if (iTextWidth > (iWidth - iImageWidth  - iEdge * 3))
  140. iWidth = iTextWidth  + iImageWidth  + iEdge * 3;
  141. ASSERT(iWidth > iTextWidth);
  142. m_rcText.left = iImageWidth + iEdge * 2; 
  143. m_rcText.top = iEdge * 2;
  144. m_rcText.right = m_rcText.left + iTextWidth;
  145. m_rcText.bottom = m_rcText.top + sizeTextExtent.cy;
  146. dc.DrawText(m_strText, m_rcText, DT_LEFT|DT_VCENTER|DT_CALCRECT);
  147. // realease font.
  148. dc.SelectObject(poldFont);
  149. //
  150. // compute button rect.
  151. //
  152. CRect rcButton;
  153. rcButton.top = m_rcText.bottom + 20;
  154. rcButton.bottom = rcButton.top + iButtonHeight;
  155. if ((m_nType&0xf) == MB_OK)
  156. {
  157. rcButton.left = (iWidth - iButtonWidth) / 2 ;
  158. rcButton.right = rcButton.left + iButtonWidth;
  159. GetDlgItem(IDOK)->MoveWindow(rcButton);
  160. GetDlgItem(IDCANCEL)->ShowWindow(false);
  161. GetDlgItem(IDNO)->ShowWindow(false);
  162. }
  163. else if ((m_nType&0xf) == MB_YESNO)
  164. {
  165. rcButton.left = iWidth / 2 - iButtonWidth - iEdge;
  166. rcButton.right = rcButton.left + iButtonWidth;
  167. GetDlgItem(IDOK)->MoveWindow(rcButton);
  168. GetDlgItem(IDOK)->SetWindowText("是");
  169. rcButton.OffsetRect(iButtonWidth + iEdge*2, 0);
  170. GetDlgItem(IDCANCEL)->MoveWindow(rcButton);
  171. GetDlgItem(IDCANCEL)->SetWindowText("否");
  172. GetDlgItem(IDNO)->ShowWindow(false);
  173. }
  174. else if ((m_nType&0xf) == MB_OKCANCEL)
  175. {
  176. rcButton.left = iWidth / 2 - iButtonWidth - iEdge;
  177. rcButton.right = rcButton.left + iButtonWidth;
  178. GetDlgItem(IDOK)->MoveWindow(rcButton);
  179. rcButton.OffsetRect(iButtonWidth + iEdge*2, 0);
  180. GetDlgItem(IDCANCEL)->MoveWindow(rcButton);
  181. GetDlgItem(IDNO)->ShowWindow(false);
  182. }
  183. else if ((m_nType&0xf) == MB_YESNOCANCEL)
  184. {
  185. rcButton.left = iWidth / 2 - iButtonWidth - iEdge * 2 - iButtonWidth/2;
  186. rcButton.right = rcButton.left + iButtonWidth;
  187. GetDlgItem(IDOK)->MoveWindow(rcButton);
  188. GetDlgItem(IDOK)->SetWindowText("是(&Y)");
  189. rcButton.OffsetRect(iButtonWidth + iEdge*2, 0);
  190. GetDlgItem(IDCANCEL)->MoveWindow(rcButton);
  191. GetDlgItem(IDCANCEL)->SetWindowText("否(&N)");
  192. rcButton.OffsetRect(iButtonWidth + iEdge*2, 0);
  193. GetDlgItem(IDNO)->MoveWindow(rcButton);
  194. GetDlgItem(IDNO)->SetWindowText("取消");
  195. }
  196. else
  197. {
  198. ASSERT(FALSE);
  199. }
  200. iHeight = rcButton.bottom + 20 + iCaptionHeight;
  201. //
  202. // position the window pos.
  203. //
  204. CPoint pt(0, 0);
  205. if (AfxGetMainWnd())
  206. {
  207. CRect rc;
  208. AfxGetMainWnd()->GetWindowRect(rc);
  209. pt.x = rc.left + rc.Width()/2 - iWidth/2;
  210. pt.y = rc.top + rc.Height()/2 - iHeight/2;
  211. }
  212. MoveWindow(pt.x, pt.y, iWidth, iHeight);
  213. if (m_nType & MB_DEFBUTTON2 )
  214. {
  215. GetDlgItem(IDCANCEL)->SetFocus();
  216. }
  217. else
  218. {
  219. GetDlgItem(IDOK)->SetFocus();
  220. }
  221. return FALSE;
  222. }
  223. void CDlgAfxMessage::OnOK() 
  224. {
  225. if (!UpdateData(TRUE))
  226. {
  227. TRACE0("UpdateData failed during dialog termination.n");
  228. // the UpdateData routine will set focus to correct item
  229. return;
  230. }
  231. if ((m_nType&0xf) ==  MB_YESNO)
  232. {
  233. EndDialog(IDYES);
  234. }
  235. else if ((m_nType&0xf) ==  MB_YESNOCANCEL)
  236. {
  237. EndDialog(IDYES);
  238. }
  239. else
  240. {
  241. ASSERT(((m_nType&0xf) == MB_OK) || ((m_nType&0xf) == MB_OKCANCEL) );
  242. EndDialog(IDOK);
  243. }
  244. }
  245. void CDlgAfxMessage::OnCancel() 
  246. {
  247. if ((m_nType&0xf) == MB_YESNO)
  248. {
  249. EndDialog(IDNO);
  250. }
  251. else if ((m_nType&0xf) ==  MB_YESNOCANCEL)
  252. {
  253. EndDialog(IDNO);
  254. }
  255. else
  256. {
  257. ASSERT((m_nType&0xf) == MB_OKCANCEL);
  258. EndDialog(IDCANCEL);
  259. }
  260. }
  261. void CDlgAfxMessage::OnNo() 
  262. {
  263. ASSERT((m_nType&0xf) == MB_YESNOCANCEL);
  264. EndDialog(IDCANCEL);
  265. }
  266. void CDlgAfxMessage::OnPaint() 
  267. {
  268. if (!m_hIcon) return;
  269. CPaintDC dc(this); // device context for painting
  270. CFont* poldFont = dc.SelectObject(&m_font);
  271. dc.SetBkMode(TRANSPARENT);
  272. int iRet = dc.DrawText(m_strText, m_rcText, DT_LEFT | DT_VCENTER);
  273. dc.SelectObject(poldFont);
  274. DrawTheIcon(&dc, m_rcImage);
  275. }
  276. void CDlgAfxMessage::DrawTheIcon(CDC* pDC, RECT* rcItem)
  277. {
  278. if (!m_hIcon) 
  279. {
  280. ASSERT(FALSE);
  281. return;
  282. }
  283. CRect iconRect = rcItem;
  284. iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
  285. // Center the icon vertically
  286. iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
  287. iconRect.right = iconRect.left + m_cxIcon;
  288. iconRect.bottom += iconRect.bottom + m_cyIcon;
  289.     
  290. pDC->DrawState(iconRect.TopLeft(), 
  291. iconRect.Size(), 
  292. m_hIcon, 
  293. DSS_NORMAL,
  294. // (IsDisabled ? DSS_DISABLED : DSS_NORMAL), 
  295. (CBrush*)NULL);
  296. } // End of DrawTheIcon