系统提供的MessageBox各按钮上的文本不便改变,但是在我们开发过程中,需要各种各样的提示,如果一律用Yes/No之类的提示,界面不太友好。比如按关闭按钮,弹出一个MessageBox提示"退出还是最小化?",用"退出","最小化" 两个按钮供用户作选择,就比用"是",“否”友好.
我在网上看到很多人遇到这样需求的时候,是用对话框取代MessageBox,如果你的顶目够大,那需要这样提示的地方会很多,难道你就做N个对话框来解决?为什么不自己做一个MessageBox,来替代系统的MessageBox呢?
自己要做一个通用的MessageBox,你必须要考虑到MessageBox排版的问题,每次提示,提示文本,按钮个数,按钮文本都可能是不一样的。你能不能做出每次弹出的不同内容的MessageBox跟系统提供的MessageBox一样美观?如果做到了这一点,你的MessageBox就实现了.下面提供相关源码,供有需要的朋友参考.
//调用SA_MsgBox跟调用MessageBox一样方便.对于我而言,甚至更方便,因为是我自己写的,我为uType定义了一种SA_MB_RESOURCE,这样szText/szTitle还可以传递字符串资源进来,不用外面每处调用都分配内存了.最多可以支持5个按钮,按钮的文本由pBtnText传进来.MessageBox有的SA_MsgBox都有
sa_int SA_MsgBox( HWND hWnd, sa_char szText[], sa_char szTitle[], UINT uType,sa_int nBtnCnt,sa_char* pBtnText[])
{
sa_int type=0;
MsgBoxData_T * pMsgBoxData = NULL;
sa_int i=0;
sa_char szBuf[MAX_LOADSTRING];
if (hWnd==NULL)
{
hWnd = ::GetActiveWindow();
if (hWnd != NULL)
{
hWnd = ::GetLastActivePopup(hWnd);
}
}
//SA_MALLOC是被重定义的内存分配,在它里面随便用0把内存块初始化了一下
pMsgBoxData = (MsgBoxData_T *)SA_MALLOC(sizeof(MsgBoxData_T));
pMsgBoxData->uType = uType;
if((uType&SA_MB_BTN_MASK) == SA_MB_CUSTOM) //自定义风格
{
//对于自定义风格,SA_MsgBox将使用nBtnCnt/pBtnText[]定义的按钮个数和各按钮文本
if (nBtnCnt>MSGBOX_BTN_MAXCNT)//MSGBOX_BTN_MAXCNT被定义成5,最多支持5个
{
pMsgBoxData->nBtnCnt =MSGBOX_BTN_MAXCNT;
DEG_ASSERT(pBtnText!=NULL);
}
else if (nBtnCnt>0)
{
DEG_ASSERT(pBtnText!=NULL);
pMsgBoxData->nBtnCnt =nBtnCnt;
}
for (i=0;i<pMsgBoxData->nBtnCnt;i++)
{
DEG_ASSERT(pBtnText[i]!=NULL);
pMsgBoxData->pBtnText[i] = (sa_char*)SA_MALLOC(strlen(pBtnText[i])+1);
strcpy(pMsgBoxData->pBtnText[i],pBtnText[i]);
}
}
else if ((uType&SA_MB_BTN_MASK) == SA_MB_OK) //即MessageBox的MB_OK风格,我给它戴了个帽,后面类推
{
pMsgBoxData->nBtnCnt =1;
LoadString(SA_Get_Instance(), IDS_CONFIRM, szBuf, sizeof(szBuf));
pMsgBoxData->pBtnText[0]= (sa_char*)SA_MALLOC(strlen(szBuf)+1);
strcpy(pMsgBoxData->pBtnText[0],szBuf);
}
else if ((uType&SA_MB_BTN_MASK) == SA_MB_OKCANCEL)
{
pMsgBoxData->nBtnCnt =2;
LoadString(SA_Get_Instance(), IDS_CONFIRM, szBuf, sizeof(szBuf));
pMsgBoxData->pBtnText[0]= (sa_char*)SA_MALLOC(strlen(szBuf)+1);
strcpy(pMsgBoxData->pBtnText[0],szBuf);
LoadString(SA_Get_Instance(), IDS_CANCEL, szBuf, sizeof(szBuf));
pMsgBoxData->pBtnText[1]= (sa_char*)SA_MALLO