buttondi.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:11k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // buttondi.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "resource.h"
  22. #include "buttondi.h"
  23. #include "strings.h"
  24. #include "wordpad.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char BASED_CODE THIS_FILE[] = __FILE__;
  28. #endif
  29. #ifndef DS_CONTEXTHELP
  30. #define DS_CONTEXTHELP 0x2000L
  31. #endif
  32. static const int nFontSize = 10;
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CButtonDialog dialog
  35. int CButtonDialog::DisplayMessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption,
  36. LPCTSTR lpszButtons, WORD wStyle, int nDef, int nCancel,
  37. DWORD* pHelpIDs, CWnd* pParentWnd)
  38. {
  39. CButtonDialog dlg(lpszText, lpszCaption, lpszButtons, wStyle, pHelpIDs,
  40. pParentWnd);
  41. dlg.SetDefault(nDef);
  42. dlg.SetCancel(nCancel);
  43. return (int)dlg.DoModal();
  44. }
  45. CButtonDialog::CButtonDialog(LPCTSTR lpszText, LPCTSTR lpszCaption,
  46. LPCTSTR lpszButtons, WORD wStyle, DWORD* pHelpIDs ,
  47. CWnd* pParentWnd) : CCSDialog()
  48. {
  49. ASSERT(lpszText != NULL);
  50. ASSERT(lpszCaption != NULL);
  51. if (HIWORD(lpszText) == NULL)
  52. VERIFY(m_strText.LoadString(LOWORD((DWORD)(DWORD_PTR)lpszText)));
  53. else
  54. m_strText = lpszText;
  55. if (HIWORD(lpszCaption) == NULL)
  56. VERIFY(m_strCaption.LoadString(LOWORD((DWORD)(DWORD_PTR)lpszCaption)));
  57. else
  58. m_strCaption = lpszCaption;
  59. if (lpszButtons != NULL)
  60. AddButtons(lpszButtons);
  61. m_pParentWnd = pParentWnd;
  62. m_nDefButton = 0;
  63. m_nCancel = -1;
  64. m_pButtons = NULL;
  65. m_wStyle = wStyle;
  66. m_nBaseID = nFontSize; // don't use IDOK, IDCANCEL, etc
  67. m_hDlgTmp = NULL;
  68. LOGFONT lf;
  69. MEMCPY_S(&lf, &theApp.m_lf, sizeof(LOGFONT));
  70. lf.lfHeight = -nFontSize;
  71. lf.lfWidth = 0;
  72. lf.lfWeight = FW_NORMAL;
  73. VERIFY(m_font.CreateFontIndirect(&lf));
  74. //  m_font.CreateFont(-nFontSize, 0, 0, 0, FW_NORMAL, FALSE, FALSE,
  75. //      FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
  76. //      DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, szFontName);
  77. m_pHelpIDs = pHelpIDs;
  78. }
  79. CButtonDialog::~CButtonDialog()
  80. {
  81. delete [] m_pButtons;
  82. if (m_hDlgTmp != NULL)
  83. GlobalFree(m_hDlgTmp);
  84. }
  85. BEGIN_MESSAGE_MAP(CButtonDialog, CCSDialog)
  86. //{{AFX_MSG_MAP(CButtonDialog)
  87. ON_WM_CREATE()
  88. //}}AFX_MSG_MAP
  89. END_MESSAGE_MAP()
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CButtonDialog message handlers
  92. int CButtonDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
  93. {
  94. if (m_pHelpIDs != NULL)
  95. {
  96. for (int i=0;i<m_strArray.GetSize();i++)
  97. m_pHelpIDs[i*2] = i+m_nBaseID;
  98. }
  99. if (CCSDialog::OnCreate(lpCreateStruct) == -1)
  100. return -1;
  101. SetWindowText(m_strCaption);
  102. m_pButtons = new CButton[m_strArray.GetSize()];
  103. CRect rect(0, 0, 10, 10);
  104. if (!m_staticIcon.Create(NULL,
  105. SS_ICON | WS_GROUP | WS_CHILD | WS_VISIBLE, rect, this))
  106. {
  107. return -1;
  108. }
  109. m_staticIcon.SetIcon(::LoadIcon(NULL, GetIconID(m_wStyle)));
  110. if (!m_staticText.Create(m_strText, SS_LEFT | SS_NOPREFIX | WS_GROUP |
  111. WS_CHILD | WS_VISIBLE, rect, this))
  112. {
  113. return -1;
  114. }
  115. m_staticText.SetFont(&m_font);
  116. for (int i=0;i<m_strArray.GetSize();i++)
  117. {
  118. if (!m_pButtons[i].Create(m_strArray[i], WS_TABSTOP | WS_CHILD |
  119. WS_VISIBLE | ((i == 0) ? WS_GROUP : 0) |
  120. ((i == m_nDefButton) ? BS_DEFPUSHBUTTON : BS_PUSHBUTTON),
  121. rect, this, i+m_nBaseID))
  122. {
  123. return -1;
  124. }
  125. m_pButtons[i].SetFont(&m_font);
  126. }
  127. PositionControls();
  128. return 0;
  129. }
  130. BOOL CButtonDialog::OnInitDialog()
  131. {
  132. CCSDialog::OnInitDialog();
  133. if (m_pHelpIDs == NULL) // no context help
  134. ModifyStyleEx(WS_EX_CONTEXTHELP, 0); //remove
  135. m_pButtons[m_nDefButton].SetFocus();
  136. return FALSE;  // return TRUE  unless you set the focus to a control
  137. }
  138. /////////////////////////////////////////////////////////////////////////////
  139. // CButtonDialog operations
  140. void CButtonDialog::AddButtons(LPCTSTR lpszButton)
  141. {
  142. CString str, strButtons;
  143. int i=0;
  144. if (HIWORD(lpszButton) == NULL)
  145. strButtons.LoadString(LOWORD((DWORD)(DWORD_PTR)lpszButton));
  146. else
  147. strButtons = lpszButton;
  148. while (AfxExtractSubString(str, strButtons, i++, 'n'))
  149. AddButton(str);
  150. }
  151. #ifndef DS_3DLOOK
  152. #define DS_3DLOOK 0x4
  153. #endif
  154. void CButtonDialog::FillInHeader(LPDLGTEMPLATE lpDlgTmp)
  155. {
  156. USES_CONVERSION;
  157. lpDlgTmp->style = DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE |
  158. WS_CAPTION | WS_SYSMENU;
  159. if (theApp.m_bWin4)
  160. lpDlgTmp->style |= DS_CONTEXTHELP;
  161. lpDlgTmp->dwExtendedStyle = 0;
  162. lpDlgTmp->cdit = 0;
  163. lpDlgTmp->x = 0;
  164. lpDlgTmp->y = 0;
  165. lpDlgTmp->cx = 100;
  166. lpDlgTmp->cy = 100;
  167. LPWSTR lpStr = (LPWSTR)(lpDlgTmp + 1); /* Move ptr to the variable fields */
  168. *lpStr++ = 0;  /* No Menu resource for Message Box */
  169. *lpStr++ = 0;  /* No Class name for MessageBox */
  170. int nLen = m_strCaption.GetLength();
  171. #if (_MSC_VER > 1310) // VS2005
  172. wcscpy_s(lpStr, sizeof(DLGTEMPLATE), T2CW(m_strCaption));
  173. #else
  174. wcscpy(lpStr, T2CW(m_strCaption));
  175. #endif
  176. lpStr += nLen+1;
  177. WORD* pWord = (WORD*)lpStr;
  178. *pWord = 10; // 10 pt font
  179. pWord++;
  180. lpStr = (LPWSTR) pWord;
  181. #if (_MSC_VER > 1310) // VS2005
  182. wcscpy_s(lpStr, sizeof(DLGTEMPLATE), T2W(theApp.m_lf.lfFaceName));
  183. #else
  184. wcscpy(lpStr, T2W(theApp.m_lf.lfFaceName));
  185. #endif
  186. }
  187. /////////////////////////////////////////////////////////////////////////////
  188. // CButtonDialog overridables
  189. BOOL CButtonDialog::OnCommand(WPARAM wParam, LPARAM /*lParam*/)
  190. {
  191. if (wParam == IDCANCEL && m_nCancel != -1)
  192. {
  193. EndDialog(m_nCancel);
  194. return TRUE;
  195. }
  196. if (::GetDlgItem(m_hWnd, (int)wParam)==NULL)
  197. return FALSE;
  198. EndDialog((int)wParam-m_nBaseID);
  199. return TRUE;
  200. }
  201. INT_PTR CButtonDialog::DoModal()
  202. {
  203. ASSERT(m_strArray.GetSize() != 0);
  204. if (m_strArray.GetSize() == 0)
  205. return (m_nCancel != -1) ? m_nCancel : 0;
  206. // compute size of header
  207. // Fixed portions of DLG template header = sizeof(DLGTEMPLATE);
  208. // One null byte for menu name and one for class name = 2
  209. // Caption text plus NULL = m_strCaption.GetLength()+1
  210. int nSize = sizeof(DLGTEMPLATE);
  211. nSize += (2 + m_strCaption.GetLength()+1+lstrlen(theApp.m_lf.lfFaceName)+1)*2 +sizeof(WORD);
  212. m_hDlgTmp = GlobalAlloc(GPTR, nSize);
  213. if (m_hDlgTmp == NULL)
  214. return IDCANCEL;
  215. LPDLGTEMPLATE lpDlgTmp = (LPDLGTEMPLATE)GlobalLock(m_hDlgTmp);
  216. FillInHeader(lpDlgTmp);
  217. GlobalUnlock(m_hDlgTmp);
  218. InitModalIndirect(m_hDlgTmp);
  219. return (INT_PTR)CCSDialog::DoModal();
  220. }
  221. /////////////////////////////////////////////////////////////////////////////
  222. // CButtonDialog implementation
  223. void CButtonDialog::PositionControls()
  224. {
  225. CSize sizeBase = GetBaseUnits();
  226. int nButtonHeight = (sizeBase.cy*14)/8;
  227. int nHeight = 0;
  228. int nSep,nLeftMargin,nRightMargin,nTopMargin,nBottomMargin;
  229. int nButtonAdj;
  230. int nWidth = 0;
  231. CRect rectText;
  232. // a) 5/8 screen Width
  233. // b) Caption
  234. // c) nLeftMargin ICON nSep TEXT nRightMargin
  235. // d) nLeftMargin Button1 nSep Button2 ... nRightMargin
  236. // client width is max(b,d, min(c,a))
  237. CSize sizeIcon(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON));
  238. nSep = sizeIcon.cx/2;
  239. nLeftMargin = nSep;
  240. nRightMargin = nSep;
  241. nTopMargin = nSep;
  242. nBottomMargin = nSep;
  243. CClientDC dc(this);
  244. CFont* pOldFont = dc.SelectObject(&m_font);
  245. nButtonAdj = dc.GetTextExtent(_T("XXX"),3).cx; // padding on buttons
  246. int nScreenWidth58 = dc.GetDeviceCaps(HORZRES)*5/8;
  247. int nCaptionWidth = dc.GetTextExtent(m_strCaption, m_strCaption.
  248. GetLength()).cx;
  249. CSize sizeText = dc.GetTextExtent(m_strText,m_strText.GetLength());
  250. int nTextIconWidth = nLeftMargin+sizeIcon.cx+nSep+sizeText.cx+nRightMargin;
  251. int nButtons = (int)m_strArray.GetSize();
  252. int nButtonsWidth = nLeftMargin+nRightMargin+(nButtons-1)*nSep;
  253. int i;
  254. for (i=0;i<nButtons;i++)
  255. {
  256. nButtonsWidth +=
  257. dc.GetTextExtent(m_strArray[i],m_strArray[i].GetLength()).cx+
  258. nButtonAdj*2;
  259. }
  260. nWidth = min(nTextIconWidth,nScreenWidth58);
  261. nWidth = max(nWidth, nCaptionWidth);
  262. nWidth = max(nWidth, nButtonsWidth);
  263. m_staticIcon.SetWindowPos(NULL, nLeftMargin, nTopMargin, sizeIcon.cx,
  264. sizeIcon.cy, SWP_NOZORDER);
  265. if (sizeText.cx > nWidth-nLeftMargin-nRightMargin-sizeIcon.cx-nSep)
  266. {
  267. sizeText.cx = nWidth-nLeftMargin-nRightMargin-sizeIcon.cx-nSep;
  268. //      int nTextWidth = nWidth-nLeftMargin-nRightMargin-sizeIcon.cx-nSep;
  269. //      rectText.SetRect(0, 0, nTextWidth, 32767);
  270. rectText.SetRect(0, 0, sizeText.cx, 32767);
  271. /* Ask DrawText for the right cy */
  272. sizeText.cy = dc.DrawText(m_strText, m_strText.GetLength(), &rectText,
  273. DT_CALCRECT | DT_WORDBREAK | DT_EXPANDTABS | DT_NOPREFIX);
  274. }
  275. m_staticText.SetWindowPos(NULL, nSep+sizeIcon.cx+nSep, nTopMargin,
  276. sizeText.cx, sizeText.cy, SWP_NOZORDER);
  277. sizeText.cy = max(sizeText.cy, sizeIcon.cy); // at least icon height
  278. nHeight = nTopMargin + sizeText.cy + nSep + nButtonHeight + nBottomMargin;
  279. CRect rect;
  280. rect.left = (nWidth - (nButtonsWidth - nLeftMargin - nRightMargin))/2;
  281. rect.top = nTopMargin + sizeText.cy + nSep;
  282. rect.bottom = rect.top + nButtonHeight;
  283. for (i=0;i<m_strArray.GetSize();i++)
  284. {
  285. rect.right = rect.left + dc.GetTextExtent(m_strArray[i],m_strArray[i].GetLength()).cx +
  286. 2*nButtonAdj;
  287. m_pButtons[i].MoveWindow(&rect);
  288. rect.left = rect.right + nSep;
  289. }
  290. rect.SetRect(0,0,nWidth,nHeight);
  291. CalcWindowRect(&rect);
  292. SetWindowPos(NULL, (dc.GetDeviceCaps(HORZRES)-rect.Width())/2,
  293. (dc.GetDeviceCaps(VERTRES)-rect.Height())/2, rect.Width(), rect.Height(),
  294. SWP_NOZORDER|SWP_NOACTIVATE);
  295. if(m_nCancel == -1) // no cancel button
  296. {
  297. //      CMenu* pMenu = GetSystemMenu(FALSE);
  298. //      if (pMenu != NULL)
  299. //          pMenu->DeleteMenu(SC_CLOSE, MF_BYCOMMAND);
  300. }
  301. dc.SelectObject(pOldFont);
  302. }
  303. CSize CButtonDialog::GetBaseUnits()
  304. {
  305. CDisplayIC dc;
  306. CFont* pFont = dc.SelectObject(&m_font);
  307. TEXTMETRIC tm;
  308. VERIFY(dc.GetTextMetrics(&tm));
  309. dc.SelectObject(pFont);
  310. return CSize(tm.tmAveCharWidth, tm.tmHeight);
  311. }
  312. LPCTSTR CButtonDialog::GetIconID(WORD wFlags)
  313. {
  314. LPCTSTR lpszIcon = NULL;
  315. wFlags &= MB_ICONMASK;
  316. if (wFlags == MB_ICONHAND)
  317. lpszIcon = IDI_HAND;
  318. else if (wFlags == MB_ICONQUESTION)
  319. lpszIcon = IDI_QUESTION;
  320. else if (wFlags == MB_ICONEXCLAMATION)
  321. lpszIcon = IDI_EXCLAMATION;
  322. else if (wFlags == MB_ICONASTERISK)
  323. lpszIcon = IDI_ASTERISK;
  324. return lpszIcon;
  325. }