⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messagebox.cpp

📁 eCos1.31版
💻 CPP
字号:
//####COPYRIGHTBEGIN####//                                                                          // ----------------------------------------------------------------------------// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.//// This program is part of the eCos host tools.//// This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 2 of the License, or (at your option) // any later version.// // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for // more details.// // You should have received a copy of the GNU General Public License along with// this program; if not, write to the Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.//// ----------------------------------------------------------------------------//                                                                          //####COPYRIGHTEND####// MessageBox.cpp : implementation file//////===========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): 	sdf// Contact(s):	sdf// Date:		1998/10/06// Version:		0.01// Purpose:	// Description:	This is the implementation of the messagebox class// Requires:	// Provides:	// See also:    // Known bugs:	// Usage:	////####DESCRIPTIONEND####////===========================================================================//#include "stdafx.h"#include "MessageBox.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CMessageBox dialog// Must be global because InitModalIndirect saves the pointerCMessageBox::DLGDATA CMessageBox::DlgData = {	{	DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,		0,		  // No controls yet		0,0,0,0}, // Fix up size and position later		0,0,0};   // Default menu, class and titlevoid CMessageBox::Init(){	m_pFont=CFont::FromHandle(HFONT(GetStockObject(DEFAULT_GUI_FONT)));	m_nFocusButton=-1;	m_nEscapeButton=-1;	m_nJustify=SS_LEFT;	m_nDefaultButton=0;	m_hIcon=NULL;	m_pStaticText=NULL;	m_pStaticIcon=NULL;	m_bTopMost=false;	m_bModeless=false;	m_bDialogCreated=false;	m_pParentNotify=NULL;	m_crText=GetSysColor(COLOR_BTNTEXT);	InitModalIndirect (&DlgData.tmpl,NULL); }CMessageBox::CMessageBox()	: CDialog(){	Init();	m_strCaption=_T("Error");}CMessageBox::CMessageBox(const CString &strText,const CString &strCaption/*=_T("Error")*/,UINT Flag/*=MB_OK*/)	: CDialog(){	Init();	m_strText=strText;	m_strCaption=strCaption;	m_nDefaultButton=((Flag&MB_DEFMASK)>>8);	m_bTopMost=(0!=(Flag&MB_SYSTEMMODAL));	// Use flag to select from amongst standard combinations and	// to select icon.	switch(Flag&MB_TYPEMASK){		case MB_OK:			AddButton(_T("OK"),IDOK);			break;		case MB_OKCANCEL:			AddButton(_T("OK"),IDOK);			AddButton(_T("Cancel"),IDCANCEL);			break;		case MB_ABORTRETRYIGNORE:			AddButton(_T("&Abort"),IDABORT);			AddButton(_T("&Retry"),IDRETRY);			AddButton(_T("&Ignore"),IDIGNORE);			break;		case MB_YESNOCANCEL:			AddButton(_T("&Yes"),IDYES);			AddButton(_T("&No"),IDNO);			AddButton(_T("Cancel"),IDCANCEL);			break;		case MB_YESNO:			AddButton(_T("&Yes"),IDYES);			AddButton(_T("&No"),IDNO);			break;		case MB_RETRYCANCEL:			AddButton(_T("&Retry"),IDRETRY);			AddButton(_T("Cancel"),IDCANCEL);			break;		case MB_YESNOALL: //13			AddButton(_T("&Yes"),IDYES);			AddButton(_T("&No"),IDNO);			AddButton(_T("Yes &All"),IDYESALL);			AddButton(_T("No A&ll"),IDNOALL);			break;		case MB_YESNOALLCANCEL: //14			AddButton(_T("&Yes"),IDYES);			AddButton(_T("&No"),IDNO);			AddButton(_T("Yes &All"),IDYESALL);			AddButton(_T("No A&ll"),IDNOALL);			AddButton(_T("Cancel"),IDCANCEL);			break;		default:			ASSERT(FALSE);	}		if(Flag&MB_HELP){		AddButton(_T("&Help"),IDHELP);	}	switch(Flag&MB_ICONMASK){		case MB_ICONHAND:			m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_HAND);			break;		case MB_ICONQUESTION:			m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_QUESTION);			break;		case MB_ICONEXCLAMATION:			m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION);			break;		case MB_ICONASTERISK:			m_hIcon=AfxGetApp()->LoadStandardIcon(IDI_ASTERISK);			break;		case 0:			break;		default:			ASSERT(FALSE);			break;	}}BEGIN_MESSAGE_MAP(CMessageBox, CDialog)	//{{AFX_MSG_MAP(CMessageBox)	ON_WM_FONTCHANGE()	ON_WM_CTLCOLOR()	ON_WM_CLOSE()	//}}AFX_MSG_MAP	ON_CONTROL_RANGE(BN_CLICKED, 1, 0xFFFF, OnButton)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMessageBox message handlersBOOL CMessageBox::OnInitDialog() {	// Create buttons as required	ASSERT(ButtonCount()>0);	SetWindowText(m_strCaption);	if(-1==m_nEscapeButton||IDCANCEL!=m_arBInfo[m_nEscapeButton].m_id){		// No cancel button		CMenu *pMenu=GetSystemMenu(FALSE);		pMenu->RemoveMenu(SC_CLOSE,MF_BYCOMMAND);	}	CDialog::OnInitDialog();	CDC *pDC=GetDC();	CFont *pOldFont=pDC->SelectObject(m_pFont);	TEXTMETRIC tm;	pDC->GetTextMetrics(&tm);		int cxDLU=tm.tmAveCharWidth;	int cyDLU=tm.tmHeight;	int nButtonWidth= (60*cxDLU)/4;		// width of a button	int nButtonHeight=(14*cyDLU)/8;		// height of a button	int cxButtonSep=   (4*cxDLU)/4;		// horizontal button separation	int cxTextButtonSep=(10*cxDLU)/4;	// horizontal separation between text and icon	int cyTextButtonSep=(10*cyDLU)/8;	// vertical separation between text and buttons	int cxBorder=   (7*cxDLU)/4;		// horizontal separation between buttons and border	int cyBorder=   (7*cyDLU)/8;		// vertical separation between buttons and border	int cxIcon=GetSystemMetrics(SM_CXICON); // width of an icon	int cyIcon=GetSystemMetrics(SM_CYICON); // height of an icon	int nTotalButtonWidth=(ButtonCount()*nButtonWidth)+(ButtonCount()-1)*cxButtonSep;	int cxText=max(50,nTotalButtonWidth-(m_hIcon?(cxIcon+cxTextButtonSep):0));	int cyText=0;	// Size the text control according to the maximum line length	LPCTSTR c=m_strText;	while(*c){		PTCHAR d=_tcsstr(c,_T("\r\n"));		int nCount;		if(d){			*d=_TCHAR('\0');			nCount=d-c;		} else {\			nCount=_tcslen(c);		}		cxText=max(cxText,pDC->GetTextExtent(c,nCount).cx);		cyText+=tm.tmHeight;		if(d){			*d=_TCHAR('\r');			c=d+2;		} else {			break;		}	}		// If vertical extent of text is less than that of the icon, difference between the two	int cyTextExtra= (m_hIcon && cyText<cyIcon)?cyIcon-cyText:0;	pDC->SelectObject(pOldFont);	ReleaseDC(pDC);		// Set dialog box size	{		int cx=(2*cxBorder)+cxText+cxButtonSep+2*GetSystemMetrics(SM_CXDLGFRAME);		if(m_hIcon){			cx+=cxIcon+cxTextButtonSep;		}		int cy=(2*cyBorder)+cyText+cyTextExtra+cyTextButtonSep+nButtonHeight+   			GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYDLGFRAME);		UINT flags=SWP_NOMOVE;		if(!m_bTopMost){			flags|=SWP_NOZORDER;		}		SetWindowPos(&wndTopMost,0,0,cx,cy,flags);	}	// Create a static control for the icon	if(m_hIcon){		m_pStaticIcon=new CStatic;		m_pStaticIcon->Create(NULL,WS_CHILD|WS_VISIBLE|SS_ICON,			CRect(cxBorder,cyBorder,cxBorder+cxIcon,cyBorder+cyIcon), this);		m_pStaticIcon->SetIcon(m_hIcon);	}	// Create a static control for the text	{		int cx=m_hIcon?cxIcon+cxTextButtonSep:0;		m_pStaticText=new CStatic;		m_pStaticText->Create(m_strText,WS_CHILD|WS_VISIBLE|m_nJustify|SS_NOPREFIX,			CRect(cxBorder+cx,cyBorder+cyTextExtra/2,cxBorder+cx+cxText,cyBorder+cyText+cyTextExtra/2), this);		m_pStaticText->SetFont(m_pFont);	}	// Create the buttons	CRect rcClient;	GetClientRect(rcClient);	CRect rect;	rect.left=(rcClient.Width()-nTotalButtonWidth)/2;	rect.right=rect.left+nButtonWidth;	rect.bottom=rcClient.bottom-cyBorder;	rect.top=rect.bottom-nButtonHeight;	ASSERT(m_nDefaultButton<ButtonCount());	for(unsigned i=0;i<ButtonCount();i++){		CButton *pWnd=new CButton;		m_arBInfo[i].m_pWnd=pWnd;		UINT id=m_arBInfo[i].m_id;		UINT style=WS_CHILD|WS_VISIBLE|WS_TABSTOP;		if(!m_arBInfo[i].m_bEnabled){			style|=WS_DISABLED;		}		if(0==i){			style|=WS_GROUP;		}		style|=(m_nDefaultButton==i)?BS_DEFPUSHBUTTON:BS_PUSHBUTTON;					pWnd->Create(m_arBInfo[i].m_strCaption,style,rect,this,id);		pWnd->SetFont(m_pFont);		if(m_nDefaultButton==i){			pWnd->SetFocus();		}		rect.left+=nButtonWidth+cxButtonSep;		rect.right+=nButtonWidth+cxButtonSep;	}	m_nFocusButton=m_nDefaultButton;	m_bDialogCreated=true;	return FALSE;}void CMessageBox::OnButton(UINT id){	if(-1!=IndexOf(id)){		if(m_bModeless){			if(NULL!=m_pParentNotify){				m_pParentNotify->PostMessage(m_nParentNotifcationMessage,MAKEWPARAM(id,m_nParentNotifcationwParamHigh),0);				DestroyWindow();			}		} else {			EndDialog(id);		}	}}BOOL CMessageBox::PreTranslateMessage(MSG* pMsg) {	if(pMsg->message==WM_KEYDOWN){		switch(pMsg->wParam){			case VK_ESCAPE:				if(-1!=m_nEscapeButton){					OnButton(m_arBInfo[m_nEscapeButton].m_id);				}				return TRUE;			default:				break;		}	}    if( IsDialogMessage( pMsg ) )        		return TRUE;    	else        return CDialog::PreTranslateMessage( pMsg );}void CMessageBox::AddButton(const CString & strCaption, UINT id, bool bEnabled/*=true*/){#ifdef _DEBUG	ASSERT(-1==IndexOf(id));	for(unsigned int i=0;i<ButtonCount();i++){		if(0==m_arBInfo[i].m_strCaption.Compare(strCaption)){			ASSERT(FALSE);		}	}#endif	if(bEnabled){		if(IDCANCEL==id || (IDOK==id && -1==m_nEscapeButton)){			m_nEscapeButton=ButtonCount();		} 	}	CButtonInfo info(id,bEnabled,strCaption);	m_arBInfo.Add(info);}CMessageBox::~CMessageBox(){	for(unsigned int i=0;i<ButtonCount();i++){		deleteZ(m_arBInfo[i].m_pWnd);	}	deleteZ(m_pStaticText);	deleteZ(m_pStaticIcon);}void CMessageBox::SetDefaultButton(UINT nIndex){	ASSERT(nIndex<ButtonCount());	m_nDefaultButton=nIndex; }void CMessageBox::OnFontChange() {	CDialog::OnFontChange();		m_pFont=CFont::FromHandle(HFONT(GetStockObject(DEFAULT_GUI_FONT)));		for(unsigned int i=0;i<ButtonCount();i++){		Button(i).SetFont(m_pFont);	}	m_pStaticText->SetFont(m_pFont);}HBRUSH CMessageBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {	HBRUSH hbr=CDialog::OnCtlColor(pDC, pWnd, nCtlColor);	switch(nCtlColor){		case CTLCOLOR_STATIC:			pDC->SetTextColor(m_crText);			break;		default:			break;	}	return hbr;}BOOL CMessageBox::Create(CWnd *pWnd,UINT msg,WORD wParamHigh){	m_bModeless=true;	if(0!=msg){		ASSERT(NULL!=pWnd);		m_pParentNotify=pWnd;		m_nParentNotifcationMessage=msg;		m_nParentNotifcationwParamHigh=wParamHigh;	}	return CreateIndirect (&DlgData.tmpl,pWnd); }int CMessageBox::IndexOf(UINT id){	for(unsigned int i=0;i<ButtonCount();i++){		if(m_arBInfo[i].m_id==id){			return (signed)i;		}	}	return -1;}void CMessageBox::PostNcDestroy() {	if(m_bModeless){		delete this;	} else {		CDialog::PostNcDestroy();	}}void CMessageBox::OnClose() {	OnButton(IDCANCEL);}void CMessageBox::SetCaption (const CString &strCaption) {	m_strCaption=strCaption;	if(m_bDialogCreated){		SetWindowText(strCaption);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -