自己写一个通用的MessageBox(SDK实现)

系统提供的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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`MessageBox` 函数是不支持上下滚动的,因为它只能显示一定数量的文本,如果文本太长,就会被截断。如果你需要一个支持上下滚动的窗口,可以使用 `CreateWindow` 函数创建一个自定义窗口,然后在窗口中添加一个滚动条和一个编辑框,将文本显示在编辑框中,就可以实现上下滚动的效果了。 下面是一个示例程序,它创建了一个大小为 400x300 像素的窗口,窗口中包含一个滚动条和一个编辑框,可以显示较长的文本,并支持上下滚动。 ```c++ #include <Windows.h> LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASS wc = { 0 }; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = "MyWindowClass"; RegisterClass(&wc); // 创建窗口 HWND hwnd = CreateWindow( "MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL); if (hwnd == NULL) { MessageBox(NULL, "窗口创建失败!", "错误", MB_ICONERROR | MB_OK); return 0; } // 创建滚动条 HWND hwndScrollBar = CreateWindow( "SCROLLBAR", "", WS_CHILD | WS_VISIBLE | SBS_VERT, 370, 10, 20, 260, hwnd, NULL, hInstance, NULL); // 设置滚动条范围和页面大小 SetScrollRange(hwndScrollBar, SB_CTL, 0, 100, TRUE); SetScrollPos(hwndScrollBar, SB_CTL, 0, TRUE); SCROLLINFO si = { 0 }; si.cbSize = sizeof(si); si.fMask = SIF_ALL; si.nMin = 0; si.nMax = 100; si.nPage = 10; SetScrollInfo(hwndScrollBar, SB_CTL, &si, TRUE); // 创建编辑框 HWND hwndEdit = CreateWindow( "EDIT", "", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 10, 10, 350, 260, hwnd, NULL, hInstance, NULL); // 向编辑框中添加文本 const char* text = "这是一段较长的文本,可以在编辑框中上下滚动。\r\n"; for (int i = 0; i < 20; i++) { SendMessage(hwndEdit, EM_REPLACESEL, 0, (LPARAM)text); } // 显示窗口 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_VSCROLL: // 处理滚动条消息 switch (LOWORD(wParam)) { case SB_TOP: break; case SB_BOTTOM: break; case SB_LINEUP: break; case SB_LINEDOWN: break; case SB_PAGEUP: break; case SB_PAGEDOWN: break; case SB_THUMBTRACK: break; case SB_THUMBPOSITION: break; } // 更新滚动条位置 SCROLLINFO si = { 0 }; si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo((HWND)lParam, SB_CTL, &si); si.nPos = HIWORD(wParam); SetScrollInfo((HWND)lParam, SB_CTL, &si, TRUE); break; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } ``` 这个程序创建了一个自定义窗口,窗口中包含一个滚动条和一个编辑框。当用户拖动滚动条时,程序会更新编辑框的显示内容,实现上下滚动的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值