+++ /dev/null
-// TortoiseSVN - a Windows shell extension for easy version control\r
-\r
-// Copyright (C) 2003-2008 - TortoiseSVN\r
-\r
-// This program is free software; you can redistribute it and/or\r
-// modify it under the terms of the GNU General Public License\r
-// as published by the Free Software Foundation; either version 2\r
-// of the License, or (at your option) any later version.\r
-\r
-// This program is distributed in the hope that it will be useful,\r
-// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-// GNU General Public License for more details.\r
-\r
-// You should have received a copy of the GNU General Public License\r
-// along with this program; if not, write to the Free Software Foundation,\r
-// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
-//\r
-#include "StdAfx.h"\r
-//#include "resource.h" //if you defined some IDS_MSGBOX_xxxx this include is needed!\r
-#include "messagebox.h"\r
-#include ".\messagebox.h"\r
-\r
-\r
-CMessageBox::CMessageBox(void)\r
-{\r
- m_hIcon = NULL;\r
- m_uButton1Ret = 1;\r
- m_uButton2Ret = 2;\r
- m_uButton3Ret = 3;\r
- m_uCancelRet = 0;\r
- m_bShowCheck = FALSE;\r
- m_bDestroyIcon = FALSE;\r
-}\r
-\r
-CMessageBox::~CMessageBox(void)\r
-{\r
- if (m_bDestroyIcon)\r
- ::DestroyIcon(m_hIcon);\r
-}\r
-\r
-UINT CMessageBox::ShowCheck(HWND hWnd, UINT nMessage, UINT nCaption, int nDef, LPCTSTR icon, UINT nButton1, UINT nButton2, UINT nButton3, LPCTSTR lpRegistry, UINT nCheckMessage/* = NULL*/)\r
-{\r
- CString sButton1;\r
- CString sButton2;\r
- CString sButton3;\r
- CString sMessage;\r
- CString sCaption;\r
- CString nCheckMsg;\r
- sButton1.LoadString(nButton1);\r
- sButton2.LoadString(nButton2);\r
- sButton3.LoadString(nButton3);\r
- sMessage.LoadString(nMessage);\r
- sCaption.LoadString(nCaption);\r
- nCheckMsg.LoadString(nCheckMessage);\r
- return CMessageBox::ShowCheck(hWnd, sMessage, sCaption, nDef, icon, sButton1, sButton2, sButton3, lpRegistry, nCheckMsg);\r
-}\r
-\r
-UINT CMessageBox::ShowCheck(HWND hWnd, LPCTSTR lpMessage, LPCTSTR lpCaption, int nDef, LPCTSTR icon, LPCTSTR lpButton1, LPCTSTR lpButton2, LPCTSTR lpButton3, LPCTSTR lpRegistry, LPCTSTR lpCheckMessage/* = NULL*/)\r
-{\r
- //check the registry if we have to show the box or just return with the last used return value\r
- //this would be the case if the user pressed "do not show again".\r
- DWORD dwRetVal;\r
- HKEY hKey;\r
- CString path;\r
-#ifdef XMESSAGEBOX_APPREGPATH\r
- path = XMESSAGEBOX_APPREGPATH;\r
-#else\r
- path = "Software\\";\r
- path += AfxGetAppName();\r
-#endif\r
- if (RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_EXECUTE, &hKey)==ERROR_SUCCESS)\r
- {\r
- int size = sizeof(dwRetVal);\r
- DWORD type;\r
- if (RegQueryValueEx(hKey, lpRegistry, NULL, &type, (BYTE*) &dwRetVal,(LPDWORD) &size)==ERROR_SUCCESS)\r
- {\r
- ASSERT(type==REG_DWORD);\r
- RegCloseKey(hKey);\r
- return (UINT)dwRetVal; //return with the last saved value\r
- }\r
- else\r
- {\r
- RegCloseKey(hKey);\r
- }\r
- }\r
-\r
- CMessageBox box;\r
- box.m_bShowCheck = TRUE;\r
- box.m_sRegistryValue = lpRegistry;\r
- if (lpCheckMessage == NULL)\r
- {\r
-#ifndef IDS_MSGBOX_DONOTSHOWAGAIN\r
- box.m_sCheckbox = _T("do not show again");\r
-#else\r
- CString m_i18l;\r
- m_i18l.LoadString(IDS_MSGBOX_DONOTSHOWAGAIN);\r
- box.m_sCheckbox = m_i18l;\r
-#endif\r
- }\r
- else\r
- box.m_sCheckbox = lpCheckMessage;\r
- box.m_sButton1 = lpButton1;\r
- box.m_sButton2 = lpButton2;\r
- box.m_sButton3 = lpButton3;\r
- box.m_hIcon = (HICON)::LoadImage(AfxGetResourceHandle(), icon, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);\r
- if (box.m_hIcon == NULL)\r
- box.m_hIcon = (HICON)::LoadImage(NULL, icon, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);\r
- else\r
- box.m_bDestroyIcon = TRUE;\r
- if (!IsWindow(hWnd))\r
- hWnd = NULL;\r
- return box.GoModal(CWnd::FromHandle(hWnd), lpCaption, lpMessage, nDef); \r
-}\r
-\r
-UINT CMessageBox::Show(HWND hWnd, LPCTSTR lpMessage, LPCTSTR lpCaption, int nDef, LPCTSTR icon, LPCTSTR lpButton1, LPCTSTR lpButton2/* = NULL*/, LPCTSTR lpButton3/* = NULL*/)\r
-{\r
- CMessageBox box;\r
- box.m_sButton1 = lpButton1;\r
- box.m_sButton2 = lpButton2;\r
- box.m_sButton3 = lpButton3;\r
- box.m_hIcon = (HICON)::LoadImage(AfxGetResourceHandle(), icon, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);\r
- if (box.m_hIcon == NULL)\r
- box.m_hIcon = (HICON)::LoadImage(NULL, icon, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);\r
- else\r
- box.m_bDestroyIcon = TRUE;\r
- if (!IsWindow(hWnd))\r
- hWnd = NULL;\r
- return box.GoModal(CWnd::FromHandle(hWnd), lpCaption, lpMessage, nDef);\r
-}\r
-\r
-UINT CMessageBox::Show(HWND hWnd, UINT nMessage, UINT nCaption, int nDef, LPCTSTR icon, UINT nButton1, UINT nButton2, UINT nButton3)\r
-{\r
- CString sButton1;\r
- CString sButton2;\r
- CString sButton3;\r
- CString sMessage;\r
- CString sCaption;\r
- sButton1.LoadString(nButton1);\r
- sButton2.LoadString(nButton2);\r
- sButton3.LoadString(nButton3);\r
- sMessage.LoadString(nMessage);\r
- sCaption.LoadString(nCaption);\r
- return CMessageBox::Show(hWnd, sMessage, sCaption, nDef, icon, sButton1, sButton2, sButton3);\r
-}\r
-\r
-\r
-UINT CMessageBox::ShowCheck(HWND hWnd, UINT nMessage, UINT nCaption, UINT uType, LPCTSTR lpRegistry, UINT nCheckMessage)\r
-{\r
- CString sMessage;\r
- CString sCaption;\r
- CString sCheckMsg;\r
- sMessage.LoadString(nMessage);\r
- sCaption.LoadString(nCaption);\r
- sCheckMsg.LoadString(nCheckMessage);\r
- return CMessageBox::ShowCheck(hWnd, sMessage, sCaption, uType, lpRegistry, sCheckMsg);\r
-}\r
-\r
-UINT CMessageBox::ShowCheck(HWND hWnd, LPCTSTR lpMessage, LPCTSTR lpCaption, UINT uType, LPCTSTR lpRegistry, LPCTSTR lpCheckMessage)\r
-{\r
- //check the registry if we have to show the box or just return with the last used return value\r
- //this would be the case if the user pressed "do not show again".\r
- DWORD dwRetVal;\r
- HKEY hKey;\r
- CString path;\r
-#ifdef XMESSAGEBOX_APPREGPATH\r
- path = XMESSAGEBOX_APPREGPATH;\r
-#else\r
- path = "Software\\";\r
- path += AfxGetAppName();\r
-#endif\r
- if (RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_EXECUTE, &hKey)==ERROR_SUCCESS)\r
- {\r
- int size = sizeof(dwRetVal);\r
- DWORD type;\r
- if (RegQueryValueEx(hKey, lpRegistry, NULL, &type, (BYTE*) &dwRetVal,(LPDWORD) &size)==ERROR_SUCCESS)\r
- {\r
- ASSERT(type==REG_DWORD);\r
- RegCloseKey(hKey);\r
- return (UINT)dwRetVal; //return with the last saved value\r
- }\r
- else\r
- {\r
- RegCloseKey(hKey);\r
- }\r
- }\r
-\r
- CMessageBox box;\r
- box.m_bShowCheck = TRUE;\r
- box.m_sRegistryValue = lpRegistry;\r
- if (lpCheckMessage == NULL)\r
- {\r
-#ifndef IDS_MSGBOX_DONOTSHOWAGAIN\r
- box.m_sCheckbox = _T("do not show again");\r
-#else\r
- CString m_i18l;\r
- m_i18l.LoadString(IDS_MSGBOX_DONOTSHOWAGAIN);\r
- box.m_sCheckbox = m_i18l;\r
-#endif\r
- }\r
- else\r
- box.m_sCheckbox = lpCheckMessage;\r
- if (!IsWindow(hWnd))\r
- hWnd = NULL;\r
- return box.GoModal(CWnd::FromHandle(hWnd), lpCaption, lpMessage, box.FillBoxStandard(uType));\r
-}\r
-\r
-UINT CMessageBox::Show(HWND hWnd, UINT nMessage, UINT nCaption, UINT uType, LPCTSTR sHelpPath)\r
-{\r
- CString sMessage;\r
- CString sCaption;\r
- sMessage.LoadString(nMessage);\r
- sCaption.LoadString(nCaption);\r
- return CMessageBox::Show(hWnd, sMessage, sCaption, uType, sHelpPath);\r
-}\r
-\r
-UINT CMessageBox::Show(HWND hWnd, LPCTSTR lpMessage, LPCTSTR lpCaption, UINT uType, LPCTSTR sHelpPath)\r
-{\r
- CMessageBox box;\r
- \r
- if (!IsWindow(hWnd))\r
- hWnd = NULL;\r
- if (sHelpPath)\r
- box.SetHelpPath(sHelpPath);\r
- return box.GoModal(CWnd::FromHandle(hWnd), lpCaption, lpMessage, box.FillBoxStandard(uType));\r
-}\r
-\r
-UINT CMessageBox::Show(HWND hWnd, UINT nMessage, UINT nCaption, UINT uType, UINT nHelpID)\r
-{\r
- CMessageBox box;\r
- CString sMessage;\r
- CString sCaption;\r
- sMessage.LoadString(nMessage);\r
- sCaption.LoadString(nCaption);\r
-\r
- if (!IsWindow(hWnd))\r
- hWnd = NULL;\r
- box.SetHelpID(nHelpID);\r
-\r
- return box.GoModal(CWnd::FromHandle(hWnd), sCaption, sMessage, box.FillBoxStandard(uType));\r
-}\r
-\r
-int CMessageBox::FillBoxStandard(UINT uType)\r
-{\r
- int ret = 1;\r
- m_uType = uType;\r
- m_uCancelRet = IDCANCEL;\r
- //load the icons according to uType\r
- switch (uType & 0xf0)\r
- {\r
- case MB_ICONEXCLAMATION:\r
- m_hIcon = (HICON)::LoadImage(NULL, IDI_EXCLAMATION, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);\r
- ::MessageBeep(MB_ICONEXCLAMATION);\r
- break;\r
- case MB_ICONASTERISK:\r
- m_hIcon = (HICON)::LoadImage(NULL, IDI_ASTERISK, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);\r
- ::MessageBeep(MB_ICONASTERISK);\r
- break;\r
- case MB_ICONQUESTION:\r
- m_hIcon = (HICON)::LoadImage(NULL, IDI_QUESTION, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);\r
- ::MessageBeep(MB_ICONQUESTION);\r
- break;\r
- case MB_ICONHAND:\r
- m_hIcon = (HICON)::LoadImage(NULL, IDI_HAND, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE);\r
- ::MessageBeep(MB_ICONHAND);\r
- break;\r
- }\r
- //set up the button texts\r
- switch (uType & 0xf)\r
- {\r
- case MB_ABORTRETRYIGNORE:\r
-#ifndef IDS_MSGBOX_ABORT\r
- m_sButton1 = "Abort";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_ABORT);\r
- m_sButton1 = m_i18l;\r
-#endif\r
- m_uButton1Ret = IDABORT;\r
-#ifndef IDS_MSGBOX_RETRY\r
- m_sButton2 = "Retry";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_RETRY);\r
- m_sButton2 = m_i18l;\r
-#endif\r
- m_uButton2Ret = IDRETRY;\r
-#ifndef IDS_MSGBOX_IGNORE\r
- m_sButton3 = "Ignore";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_IGNORE);\r
- m_sButton3 = m_i18l;\r
-#endif\r
- m_uButton3Ret = IDIGNORE;\r
- break;\r
- case MB_CANCELTRYCONTINUE:\r
-#ifndef IDS_MSGBOX_CANCEL\r
- m_sButton1 = "Cancel";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_CANCEL);\r
- m_sButton1 = m_i18l;\r
-#endif\r
- m_uButton1Ret = IDCANCEL;\r
-#ifndef IDS_MSGBOX_TRYAGAIN\r
- m_sButton2 = "Try Again";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_TRYAGAIN);\r
- m_sButton2 = m_i18l;\r
-#endif\r
- m_uButton2Ret = IDTRYAGAIN;\r
-#ifndef IDS_MSGBOX_CONTINUE\r
- m_sButton3 = "Continue";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_CONTINUE);\r
- m_sButton3 = m_i18l;\r
-#endif\r
- m_uButton3Ret = IDCONTINUE;\r
- break;\r
- case MB_OKCANCEL:\r
-#ifndef IDS_MSGBOX_OK\r
- m_sButton1 = "Ok";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_OK);\r
- m_sButton1 = m_i18l;\r
-#endif\r
- m_uButton1Ret = IDOK;\r
-#ifndef IDS_MSGBOX_CANCEL\r
- m_sButton2 = "Cancel";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_CANCEL);\r
- m_sButton2 = m_i18l;\r
-#endif\r
- m_uButton2Ret = IDCANCEL;\r
- break;\r
- case MB_RETRYCANCEL:\r
-#ifndef IDS_MSGBOX_RETRY\r
- m_sButton1 = "Retry";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_RETRY);\r
- m_sButton1 = m_i18l;\r
-#endif\r
- m_uButton1Ret = IDRETRY;\r
-#ifndef IDS_MSGBOX_CANCEL\r
- m_sButton2 = "Cancel";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_CANCEL);\r
- m_sButton2 = m_i18l;\r
-#endif\r
- m_uButton2Ret = IDCANCEL;\r
- break;\r
- case MB_YESNO:\r
-#ifndef IDS_MSGBOX_YES\r
- m_sButton1 = "Yes";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_YES);\r
- m_sButton1 = m_i18l;\r
-#endif\r
- m_uButton1Ret = IDYES;\r
-#ifndef IDS_MSGBOX_NO\r
- m_sButton2 = "No";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_NO);\r
- m_sButton2 = m_i18l;\r
-#endif\r
- m_uButton2Ret = IDNO;\r
- break;\r
- case MB_YESNOCANCEL:\r
-#ifndef IDS_MSGBOX_YES\r
- m_sButton1 = "Yes";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_YES);\r
- m_sButton1 = m_i18l;\r
-#endif\r
- m_uButton1Ret = IDYES;\r
-#ifndef IDS_MSGBOX_NO\r
- m_sButton2 = "No";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_NO);\r
- m_sButton2 = m_i18l;\r
-#endif\r
- m_uButton2Ret = IDNO;\r
-#ifndef IDS_MSGBOX_CANCEL\r
- m_sButton3 = "Cancel";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_CANCEL);\r
- m_sButton3 = m_i18l;\r
-#endif\r
- m_uButton3Ret = IDCANCEL;\r
- break;\r
- case MB_OK:\r
- default:\r
-#ifndef IDS_MSGBOX_OK\r
- m_sButton1 = "Ok";\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_OK);\r
- m_sButton1 = m_i18l;\r
-#endif\r
- }\r
- //now set the default button\r
- switch (uType & 0xf00)\r
- {\r
- case MB_DEFBUTTON2:\r
- ret = 2;\r
- break;\r
- case MB_DEFBUTTON3:\r
- ret = 3;\r
- break;\r
- }\r
- // do we need to add a help button?\r
- if (uType & MB_HELP)\r
- {\r
- CString sHelpText;\r
-#ifndef IDS_MSGBOX_HELP\r
- sHelpText = _T("Help");\r
-#else\r
- m_i18l.LoadString(IDS_MSGBOX_HELP);\r
- sHelpText = m_i18l;\r
-#endif\r
- if (m_sButton2.IsEmpty())\r
- {\r
- m_sButton2 = sHelpText;\r
- m_uButton2Ret = IDHELP;\r
- }\r
- else if (m_sButton3.IsEmpty())\r
- {\r
- m_sButton3 = sHelpText;\r
- m_uButton3Ret = IDHELP;\r
- }\r
- }\r
- return ret;\r
-}\r
-\r
-UINT CMessageBox::GoModal(CWnd * pWnd, const CString& title, const CString& msg, int nDefaultButton)\r
-{\r
- NONCLIENTMETRICS ncm;\r
- memset(&ncm,0,sizeof(NONCLIENTMETRICS));\r
- ncm.cbSize = sizeof(NONCLIENTMETRICS);\r
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);\r
- \r
- memcpy(&m_LogFont, &(ncm.lfMessageFont), sizeof(LOGFONT));\r
-\r
- //the problem with the LOGFONT lfHeight is that it is not in pixels,\r
- //but the dialog template needs the height in pixels.\r
- //We need to convert those values first:\r
- CDC * pDC;\r
- if (pWnd)\r
- pDC = pWnd->GetDC();\r
- else\r
- pDC = GetDesktopWindow()->GetDC();\r
- int pix = -MulDiv(m_LogFont.lfHeight, 72, GetDeviceCaps(pDC->m_hDC, LOGPIXELSY));\r
- CDlgTemplate dialogTemplate = CDlgTemplate(title, WS_CAPTION | DS_CENTER,\r
- 0, 0, 0, 0, m_LogFont.lfFaceName, pix);\r
- dialogTemplate.AddButton(_T("Button1"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON | ((nDefaultButton == 1) ? BS_DEFPUSHBUTTON : 0), 0,\r
- 2 + 3, 62, 56, 13, IDC_MESSAGEBOX_BUTTON1);\r
- dialogTemplate.AddButton(_T("Button2"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON | ((nDefaultButton == 2) ? BS_DEFPUSHBUTTON : 0), 0,\r
- 2 + 3, 62, 56, 13, IDC_MESSAGEBOX_BUTTON2);\r
- dialogTemplate.AddButton(_T("Button3"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON | ((nDefaultButton == 3) ? BS_DEFPUSHBUTTON : 0), 0,\r
- 2 + 3, 62, 56, 13, IDC_MESSAGEBOX_BUTTON3);\r
- dialogTemplate.AddButton(_T("Checkbox"), WS_CHILD | WS_TABSTOP | BS_AUTOCHECKBOX, 0,\r
- 0, 0, 0, 0, IDC_MESSAGEBOX_CHECKBOX);\r
- \r
- m_nDefButton = nDefaultButton;\r
- m_sMessage = msg;\r
- InitModalIndirect(dialogTemplate, pWnd);\r
-\r
- return (UINT)DoModal();\r
-}\r
-\r
-void CMessageBox::SetRegistryValue(const CString& sValue, DWORD value)\r
-{\r
- CString path;\r
-#ifdef XMESSAGEBOX_APPREGPATH\r
- path = XMESSAGEBOX_APPREGPATH;\r
-#else\r
- path = "Software\\";\r
- path += AfxGetAppName();\r
-#endif\r
- DWORD disp;\r
- HKEY hKey;\r
- if (RegCreateKeyEx(HKEY_CURRENT_USER, path, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &disp)!=ERROR_SUCCESS)\r
- {\r
- return;\r
- }\r
- RegSetValueEx(hKey, sValue, 0, REG_DWORD,(const BYTE*) &value, sizeof(value));\r
- RegCloseKey(hKey);\r
-}\r
-\r
-CSize CMessageBox::GetTextSize(const CString& str)\r
-{\r
- CRect rect;\r
- GetWindowRect(&rect);\r
-\r
- CDC * pDC = GetDC();\r
-\r
- CDC memDC;\r
- CBitmap bitmap;\r
- memDC.CreateCompatibleDC(pDC);\r
- bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());\r
- CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);\r
-\r
- //get the minimum size of the rectangle of the tooltip\r
- CSize sz = DrawHTML(&memDC, rect, str, m_LogFont, TRUE);\r
-\r
- memDC.SelectObject(pOldBitmap);\r
- memDC.DeleteDC();\r
- bitmap.DeleteObject();\r
-\r
- ReleaseDC(pDC);\r
-\r
- return sz;\r
-}\r
-\r
-CSize CMessageBox::GetIconSize(HICON hIcon)\r
-{\r
- ICONINFO ii;\r
- CSize sz (0, 0);\r
-\r
- if (hIcon != NULL)\r
- {\r
- //get icon dimensions\r
- ::SecureZeroMemory(&ii, sizeof(ICONINFO));\r
- if (::GetIconInfo(hIcon, &ii))\r
- {\r
- sz.cx = (DWORD)(ii.xHotspot * 2);\r
- sz.cy = (DWORD)(ii.yHotspot * 2);\r
- //release icon mask bitmaps\r
- if(ii.hbmMask)\r
- ::DeleteObject(ii.hbmMask);\r
- if(ii.hbmColor)\r
- ::DeleteObject(ii.hbmColor);\r
- }\r
- }\r
- m_szIcon = sz;\r
- return sz;\r
-}\r
-\r
-CSize CMessageBox::GetButtonSize()\r
-{\r
- CSize sz;\r
- int nButtons = 0; //number of buttons - 1\r
-\r
- SetDlgItemText(IDC_MESSAGEBOX_BUTTON1, m_sButton1);\r
- SetDlgItemText(IDC_MESSAGEBOX_BUTTON2, m_sButton2);\r
- //GetDlgItem(IDC_MESSAGEBOX_BUTTON2)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, 1);\r
- SetDlgItemText(IDC_MESSAGEBOX_BUTTON3, m_sButton3);\r
- SetDlgItemText(IDC_MESSAGEBOX_CHECKBOX, m_sCheckbox);\r
- \r
- CSize sz1 = GetTextSize(m_sButton1);\r
- CSize sz2 = GetTextSize(m_sButton2);\r
- CSize sz3 = GetTextSize(m_sButton3);\r
-\r
- sz1.cx += 2*MESSAGEBOX_BUTTONX;\r
- sz1.cy += 2*MESSAGEBOX_BUTTONY;\r
-\r
- if (sz2.cx)\r
- {\r
- sz2.cx += 2*MESSAGEBOX_BUTTONX;\r
- sz2.cy += 2*MESSAGEBOX_BUTTONY;\r
- nButtons++;\r
- }\r
- if (sz3.cx)\r
- {\r
- sz3.cx += 2*MESSAGEBOX_BUTTONX;\r
- sz3.cy += 2*MESSAGEBOX_BUTTONY;\r
- nButtons++;\r
- }\r
- \r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON1)->MoveWindow(0, 0, sz1.cx, sz1.cy);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON2)->MoveWindow(0, 0, sz2.cx, sz2.cy);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON3)->MoveWindow(0, 0, sz3.cx, sz3.cy);\r
-\r
-\r
- sz.cx = sz1.cx + sz2.cx + sz3.cx + (nButtons * MESSAGEBOX_BUTTONMARGIN);\r
- sz.cy = max(sz1.cy, sz2.cy);\r
- sz.cy = max(sz.cy, sz3.cy);\r
- m_szButtons = sz;\r
- if (m_bShowCheck)\r
- {\r
- CSize szCheck = GetTextSize(m_sCheckbox);\r
- szCheck.cx += 2*GetSystemMetrics(SM_CXMENUCHECK);\r
- szCheck.cy += 2*MESSAGEBOX_BUTTONY;\r
- sz.cx = max(sz.cx, szCheck.cx);\r
- sz.cy += szCheck.cy + MESSAGEBOX_BUTTONCHECKMARGIN;\r
- GetDlgItem(IDC_MESSAGEBOX_CHECKBOX)->MoveWindow(0, 0, szCheck.cx, szCheck.cy);\r
- }\r
- m_szAllButtons = sz;\r
- return sz;\r
-}\r
-\r
-BEGIN_MESSAGE_MAP(CMessageBox, CDialog)\r
- ON_WM_PAINT()\r
- ON_WM_MOUSEMOVE()\r
- ON_WM_LBUTTONUP()\r
- ON_BN_CLICKED(IDC_MESSAGEBOX_BUTTON1, OnButton1)\r
- ON_BN_CLICKED(IDC_MESSAGEBOX_BUTTON2, OnButton2)\r
- ON_BN_CLICKED(IDC_MESSAGEBOX_BUTTON3, OnButton3)\r
-END_MESSAGE_MAP()\r
-\r
-void CMessageBox::OnPaint()\r
-{\r
- CPaintDC dc(this); // device context for painting\r
-\r
-\r
- CRect rect;\r
- CRect drawrect;\r
- GetClientRect(&rect);\r
- GetClientRect(&drawrect);\r
-\r
- //create a memory device-context. This is done to help reduce\r
- //screen flicker, since we will paint the entire control to the\r
- //off screen device context first.\r
- CDC memDC;\r
- CBitmap bitmap;\r
- memDC.CreateCompatibleDC(&dc);\r
- bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());\r
- CBitmap* pOldBitmap = memDC.SelectObject(&bitmap); \r
- \r
- memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dc, 0,0, SRCCOPY);\r
-\r
- memDC.SetBkMode(TRANSPARENT);\r
- memDC.SetBkColor(GetSysColor(COLOR_WINDOW));\r
- memDC.SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); \r
-\r
- //OnDrawBackground();\r
- drawrect.DeflateRect(MESSAGEBOX_BORDERMARGINX, MESSAGEBOX_BORDERMARGINY);\r
- if (m_hIcon != NULL)\r
- {\r
- DrawIconEx(memDC.m_hDC, drawrect.left, drawrect.top + \r
- ((drawrect.Height() - m_szAllButtons.cy - MESSAGEBOX_TEXTBUTTONMARGIN - m_szIcon.cy) / 2), \r
- m_hIcon, m_szIcon.cx, m_szIcon.cy, 0, NULL, DI_NORMAL);\r
-\r
- drawrect.left += m_szIcon.cx + MESSAGEBOX_ICONMARGIN; \r
- }\r
-\r
-\r
- DrawHTML(&memDC, drawrect, m_sMessage, m_LogFont);\r
- \r
-\r
- //Copy the memory device context back into the original DC.\r
- dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0,0, SRCCOPY);\r
- \r
- //Cleanup resources.\r
- memDC.SelectObject(pOldBitmap);\r
- memDC.DeleteDC();\r
- bitmap.DeleteObject(); \r
-\r
-\r
-}\r
-\r
-void CMessageBox::OnMouseMove(UINT nFlags, CPoint point)\r
-{\r
- if (IsPointOverALink(point))\r
- {\r
- m_Cursor.SetCursor(IDC_HAND);\r
- }\r
- else\r
- {\r
- m_Cursor.Restore(); \r
- }\r
-\r
- __super::OnMouseMove(nFlags, point);\r
-}\r
-\r
-void CMessageBox::OnLButtonUp(UINT nFlags, CPoint point)\r
-{\r
- if (IsPointOverALink(point))\r
- {\r
- CString url = GetLinkForPoint(point);\r
- ShellExecute(NULL, _T("open"), url, NULL,NULL, 0);\r
- }\r
-\r
- __super::OnLButtonUp(nFlags, point);\r
-}\r
-\r
-void CMessageBox::OnButton1()\r
-{\r
- if (GetDlgItem(IDC_MESSAGEBOX_CHECKBOX)->SendMessage(BM_GETCHECK, 0, 0)==BST_CHECKED)\r
- SetRegistryValue(m_sRegistryValue, m_uButton1Ret);\r
- EndDialog(m_uButton1Ret);\r
-}\r
-\r
-void CMessageBox::OnButton2()\r
-{\r
- if (GetDlgItem(IDC_MESSAGEBOX_CHECKBOX)->SendMessage(BM_GETCHECK, 0, 0)==BST_CHECKED)\r
- SetRegistryValue(m_sRegistryValue, m_uButton2Ret);\r
- if ((m_uButton2Ret == IDHELP)&&(!m_sHelpPath.IsEmpty()))\r
- {\r
- typedef HWND (WINAPI* FPHH)(HWND, LPCWSTR, UINT, DWORD);\r
- FPHH pHtmlHelp=NULL; // Function pointer\r
- HINSTANCE hInstHtmlHelp = LoadLibrary(_T("HHCtrl.ocx"));\r
- HWND hHelp = NULL;\r
- if (hInstHtmlHelp != NULL)\r
- {\r
- (FARPROC&)pHtmlHelp = GetProcAddress(hInstHtmlHelp, "HtmlHelpW");\r
- if (pHtmlHelp)\r
- hHelp = pHtmlHelp(m_hWnd, (LPCTSTR)m_sHelpPath, HH_DISPLAY_TOPIC, NULL);\r
- }\r
- if (hHelp == NULL)\r
- ::MessageBox(m_hWnd, _T("could not show help file"), _T("Help"), MB_ICONERROR);\r
- }\r
- else if (m_uButton2Ret == IDHELP)\r
- {\r
- OnHelp();\r
- }\r
- else\r
- EndDialog(m_uButton2Ret);\r
-}\r
-\r
-void CMessageBox::OnButton3()\r
-{\r
- if (GetDlgItem(IDC_MESSAGEBOX_CHECKBOX)->SendMessage(BM_GETCHECK, 0, 0)==BST_CHECKED)\r
- SetRegistryValue(m_sRegistryValue, m_uButton3Ret);\r
- if ((m_uButton3Ret == IDHELP)&&(!m_sHelpPath.IsEmpty()))\r
- {\r
- typedef HWND (WINAPI* FPHH)(HWND, LPCWSTR, UINT, DWORD);\r
- FPHH pHtmlHelp=NULL; // Function pointer\r
- HINSTANCE hInstHtmlHelp = LoadLibrary(_T("HHCtrl.ocx"));\r
- HWND hHelp = NULL;\r
- if (hInstHtmlHelp != NULL)\r
- {\r
- (FARPROC&)pHtmlHelp = GetProcAddress(hInstHtmlHelp, "HtmlHelpW");\r
- if (pHtmlHelp)\r
- hHelp = pHtmlHelp(m_hWnd, (LPCTSTR)m_sHelpPath, HH_DISPLAY_TOPIC, NULL);\r
- }\r
- if (hHelp == NULL)\r
- ::MessageBox(m_hWnd, _T("could not show help file"), _T("Help"), MB_ICONERROR);\r
- }\r
- else if (m_uButton3Ret == IDHELP)\r
- {\r
- OnHelp();\r
- }\r
- else\r
- EndDialog(m_uButton3Ret);\r
-}\r
-\r
-void CMessageBox::OnCancel()\r
-{\r
- if (m_uCancelRet == IDCANCEL)\r
- EndDialog(m_uCancelRet);\r
- //__super::OnCancel();\r
-}\r
-\r
-BOOL CMessageBox::OnInitDialog()\r
-{\r
- __super::OnInitDialog();\r
-\r
- CRect rect(0, 0, 0, 0);\r
-\r
- //determine the required size of the message box\r
- CSize szText = GetTextSize(m_sMessage);\r
- CSize szIcon = GetIconSize(m_hIcon);\r
- CSize szButtons = GetButtonSize();\r
-\r
- CSize szIconText;\r
- szIconText.cx = szText.cx + szIcon.cx + ((szIcon.cx == 0) ? MESSAGEBOX_ICONMARGIN : (2*MESSAGEBOX_ICONMARGIN));\r
- szIconText.cy = max(szIcon.cy, szText.cy);\r
-\r
- rect.right = max(szButtons.cx, szIconText.cx);\r
- rect.right += 2*GetSystemMetrics(SM_CXBORDER);\r
- rect.right += 2*MESSAGEBOX_BORDERMARGINX;\r
- rect.bottom = szIconText.cy;\r
- rect.bottom += szButtons.cy;\r
- rect.bottom += 2*MESSAGEBOX_BORDERMARGINY + MESSAGEBOX_TEXTBUTTONMARGIN;\r
- rect.bottom += GetSystemMetrics(SM_CYCAPTION);\r
- rect.bottom += 2*GetSystemMetrics(SM_CYBORDER);\r
-\r
- MoveWindow(rect);\r
- CenterWindow();\r
- \r
- GetClientRect(rect);\r
- \r
- //now size and position the buttons as we need them\r
- ASSERT(!m_sButton1.IsEmpty()); //at least the first button must be there!\r
- if (m_sButton2.IsEmpty())\r
- {\r
- //only one button\r
- CRect rt;\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON1)->GetWindowRect(rt);\r
- ScreenToClient(rt);\r
- rt.MoveToX(rect.left + ((rect.Width() - m_szButtons.cx)/2));\r
- rt.MoveToY(rect.bottom - MESSAGEBOX_BORDERMARGINY - m_szButtons.cy);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON1)->MoveWindow(rt);\r
- //hide the other two buttons\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON2)->ShowWindow(SW_HIDE);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON3)->ShowWindow(SW_HIDE);\r
- }\r
- else if (m_sButton3.IsEmpty())\r
- {\r
- //two buttons\r
- CRect rt1;\r
- CRect rt2;\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON1)->GetWindowRect(rt1);\r
- ScreenToClient(rt1);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON2)->GetWindowRect(rt2);\r
- ScreenToClient(rt2);\r
- rt1.MoveToX(rect.left + ((rect.Width() - m_szButtons.cx)/2));\r
- rt1.MoveToY(rect.bottom - MESSAGEBOX_BORDERMARGINY - m_szButtons.cy);\r
- rt2.MoveToX(rt1.right + MESSAGEBOX_BUTTONMARGIN);\r
- rt2.MoveToY(rect.bottom - MESSAGEBOX_BORDERMARGINY - m_szButtons.cy);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON1)->MoveWindow(rt1);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON2)->MoveWindow(rt2);\r
- //hide the third button\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON3)->ShowWindow(SW_HIDE);\r
- }\r
- else\r
- {\r
- //three buttons\r
- CRect buttonrect;\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON1)->GetWindowRect(buttonrect);\r
- CRect rt1;\r
- CRect rt2;\r
- CRect rt3;\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON1)->GetWindowRect(rt1);\r
- ScreenToClient(rt1);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON2)->GetWindowRect(rt2);\r
- ScreenToClient(rt2);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON3)->GetWindowRect(rt3);\r
- ScreenToClient(rt3);\r
- rt1.MoveToX(rect.left + ((rect.Width() - m_szButtons.cx)/2));\r
- rt1.MoveToY(rect.bottom - MESSAGEBOX_BORDERMARGINY - m_szButtons.cy);\r
- rt2.MoveToX(rt1.right + MESSAGEBOX_BUTTONMARGIN);\r
- rt2.MoveToY(rect.bottom - MESSAGEBOX_BORDERMARGINY - m_szButtons.cy);\r
- rt3.MoveToX(rt2.right + MESSAGEBOX_BUTTONMARGIN);\r
- rt3.MoveToY(rect.bottom - MESSAGEBOX_BORDERMARGINY - m_szButtons.cy);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON1)->MoveWindow(rt1);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON2)->MoveWindow(rt2);\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON3)->MoveWindow(rt3);\r
- }\r
- if (m_bShowCheck)\r
- {\r
- CRect rt;\r
- GetDlgItem(IDC_MESSAGEBOX_CHECKBOX)->GetWindowRect(rt);\r
- ScreenToClient(rt);\r
- rt.MoveToX(rect.left + MESSAGEBOX_BORDERMARGINX/*+ ((rect.Width() - szButtons.cx)/2)*/);\r
- rt.MoveToY(rect.bottom - MESSAGEBOX_BORDERMARGINY - szButtons.cy);\r
- GetDlgItem(IDC_MESSAGEBOX_CHECKBOX)->MoveWindow(rt);\r
- GetDlgItem(IDC_MESSAGEBOX_CHECKBOX)->ShowWindow(SW_SHOW);\r
- }\r
- else\r
- GetDlgItem(IDC_MESSAGEBOX_CHECKBOX)->ShowWindow(SW_HIDE);\r
-\r
- if (m_nDefButton == 1)\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON1)->SetFocus();\r
- if (m_nDefButton == 2)\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON2)->SetFocus();\r
- if (m_nDefButton == 3)\r
- GetDlgItem(IDC_MESSAGEBOX_BUTTON3)->SetFocus();\r
-\r
- SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);\r
- SetForegroundWindow();\r
- SetFocus(); //Just playing safe\r
-\r
- return FALSE; // return TRUE unless you set the focus to a control\r
- // EXCEPTION: OCX Property Pages should return FALSE\r
-}\r
-\r
-BOOL CMessageBox::PreTranslateMessage(MSG* pMsg)\r
-{\r
- if (pMsg->message == WM_KEYDOWN)\r
- {\r
- switch (pMsg->wParam)\r
- {\r
- case 'C':\r
- case VK_INSERT:\r
- {\r
- if (GetAsyncKeyState(VK_CONTROL)&0x8000)\r
- {\r
- CStringA sClipboard = CStringA(m_sMessage);\r
- if (OpenClipboard())\r
- {\r
- EmptyClipboard();\r
- HGLOBAL hClipboardData;\r
- hClipboardData = GlobalAlloc(GMEM_DDESHARE, sClipboard.GetLength()+1);\r
- char * pchData;\r
- pchData = (char*)GlobalLock(hClipboardData);\r
- strcpy_s(pchData, sClipboard.GetLength()+1, (LPCSTR)sClipboard);\r
- GlobalUnlock(hClipboardData);\r
- SetClipboardData(CF_TEXT,hClipboardData);\r
- CloseClipboard();\r
- }\r
- return TRUE;\r
- }\r
- }\r
- break;\r
- case VK_ESCAPE:\r
- {\r
- switch (m_uType & 0xf)\r
- {\r
- case MB_ABORTRETRYIGNORE:\r
- EndDialog(m_uButton1Ret);\r
- break;\r
- case MB_CANCELTRYCONTINUE:\r
- EndDialog(m_uButton1Ret);\r
- break;\r
- case MB_OKCANCEL:\r
- EndDialog(m_uButton2Ret);\r
- break;\r
- case MB_RETRYCANCEL:\r
- EndDialog(m_uButton2Ret);\r
- break;\r
- case MB_YESNO:\r
- EndDialog(m_uButton2Ret);\r
- break;\r
- case MB_YESNOCANCEL:\r
- EndDialog(m_uButton3Ret);\r
- break;\r
- }\r
- }\r
- break;\r
- }\r
- }\r
-\r
- return __super::PreTranslateMessage(pMsg);\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r