C语言MessageBox简介

这个函数很实用,来自Windows.h.
它会产生一个对话框。
原型:

int WINAPI MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
int WINAPI MessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);

HWND hWnd:窗口句柄,没有就填NULL.
LPCSTR lpText:对话框的提示内容
LPCSTR lpCaption:对话框的标题
(注意:
若使用了UNICODE,则二、三参数类型为LPCWSTR,需用TEXT()或_T()括起来。
当然,上面两个AW肯定是_mingw_unicode里__MINGW_NAME_AW宏出来的,直接写MessageBox即可。)
着重讲最后一个参数:
UINT uType:对话框的风格
1.按钮

uType 意义
MB_OK 默认,“确定”
MB_OKCANCEL “确定”“取消”
MB_YESNO "是“”否“
MB_YESNOCANCEL "是”“否”“取消”
MB_RETRYCANCEL “重试”“取消”
MB_ABORTRETRYIGNORE "终止”“重试”“忽略”

2.图案

uType 意义
MB_ICONHAND / MB_ICONERROR / MB_ICONSTOP 一个红叉,错误标志
MB_ICONEXCLAMATION / MB_ICONWARNING 黄色的警告标志,就是“注意安全”标志
MB_ICONINFORMATION / MB_ICONASTERISK 信息标志
MB_ICONQUESTION 问号标志

其他繁琐的就不讲了。
用的时候可以用|(按位或)分隔,以表示“和”。
示例:

MessageBox(NULL,"你确定要退出吗?","提示",MB_OKCANCEL|MB_ICONQUESTION);

下面是另外几个例子。
1.整人小程序

#include <stdlib.h>
#include <Windows.h> 
int main()
{
 int ch0,ch1,ch2;
 ShowWindow(GetConsoleWindow(),SW_HIDE);
 begin:
    ch0 = MessageBox(NULL,"你是猪吗?","问题",MB_ICONQUESTION|MB_YESNO);
    if(ch0 == IDYES)
    {
     MessageBox(NULL,"知道就好。","不错",MB_ICONINFORMATION|MB_OK);
     return 1;
 }else{ //IDNO || IDCLOSE
  ch1 = MessageBox(NULL,"你在骗我吗?","质问",MB_ICONEXCLAMATION|MB_YESNO);
  if(ch1 == IDYES)
  {
   ch2 = MessageBox(NULL,"好吧,我给你一次重试的机会。","提示",MB_ICONINFORMATION|MB_RETRYCANCEL);
   if(ch2 == IDRETRY)
   {
    goto begin;
   }else{ //IDCANCEL || IDCLOSE
    return 0;
   }
  }else{ //IDNO || IDCLOSE
   MessageBox(NULL,"不,你是在骗我。\n你完了。","警告",MB_ICONEXCLAMATION|MB_OK);
   MessageBox(NULL,"系统即将关机!","喜报",MB_ICONHAND|MB_OK);
   system("shutdown -s -t 60 -c 教你不诚实!");
   return -1;
  }
 }
}

哈哈哈,闹着玩的,真要关机了在运行里输 shutdown -a 就可以了!
这里提到了返回值:
它返回的是int,包含下面几个:
IDYES , IDNO , IDCLOSE(点了右上角的叉) , IDRETRY , IDOK , IDCANCEL , IDIGNORE , IDABORT , IDHELP等等。
2.一连出现多个对话框
这个一直是我困惑的问题。MessageBox必须按了按钮才会执行下一条;
我想到了两个办法:
一是使用线程。不过这个太麻烦了,弄得程序太乱;
二是使用vbs.这里稍微扯一点,但还是有用的:
vbs中msgbox用法:
MsgBox(prompt[, buttons][, title][, helpfile, context])
prompt:字符串
buttons:按钮风格
title:标题字符串
最后两个就别管了,很少用。
然后我做了一个以C写Vbs的转化函数:

VOID VBSMsgbox(LPCSTR text,LPCSTR title,UINT uType=MB_OK)
//警告!不要使用vbs没有的宏!!! 
{
  FILE *fp;
  UINT btn=0;
  if(uType >> 12 == 1  /*MB_SYSTEMMODAL DEC 4096== 0x 1000 ==B 1 0000 0000 0000*/) 
  {
   btn |= 4096;
   uType -= 4096; //-= B 1 0000 0000 0000
  }
  
   if(uType >> 8 == 1 /*MB_DEFBUTTON2 DEC 256 ==0x 100 == B 1 0000 0000*/)
   {
      btn |= 256;
      uType -= 256;
 } 
 else if(uType >> 9 == 1 /**MB_DEFBUTTON3 DEC 512 ==0x 200 == B 10 0000 0000*/)
   {
      btn |= 512;
      uType -= 512;
 } 
 else if(uType >> 8 == 3 /**MB_DEFBUTTON4 DEC 768 ==0x 300 == B 11 0000 0000*/)
   {
      btn |= 768;
      uType -= 768;
 } 
  
  if(uType >> 4 == 3 /*MB_ICONEXCLAMATION DEC 30== 0x 030==B 11 0000*/)
  {
    btn |= 48;
    uType -= 48;
   }
  else if(uType >> 4 == 1  /*MB_ICONHAND 0x 010 == 1 0000*/)
  {
   btn |= 16;
   uType -= 16;
   } 
   else if(uType >> 6 == 1  /*MB_ICONINFORMATION 0x 040 ==100 0000*/)
  {
   btn |= 64;
   uType -= 64;
   } 
  else if(uType >> 5 == 1 /* MB_ICONQUESTION 0x 020 ==10 0000*/)
  {
    btn |= 32;
    uType -= 32;
   }
  
  if(uType >> 2 == 1/*MB_YESNO 0x 004 ==B 0100*/) btn |= 4;
  else if(uType == 3/*MB_YESNOCANCEL 0x 003 ==B 0011*/) btn |= 3;
  else if(uType == 1/*MB_OKCANCEL 0x 001 ==B 0001*/) btn |= 1;
  else if(uType == 5/*MB_RETRYCANCEL 0x 005 ==B 0005*/) btn |= 5;
  else if(uType == 2/*MB_ABORTRETRYIGNORE 0x 002 ==B 0002*/) btn |= 2;
  
  fp=fopen("vbsmsgbox.vbs","w");
  fprintf(fp,"msgbox\"%s\",%d,\"%s\"",text,btn,title);
  fclose(fp);
 ShellExecute(0,"open","wscript.exe","\"vbsmsgbox.vbs\"","",SW_SHOW);
  //system("del vbsmsgbox.vbs");
 }

这个就像削苹果,一层一层削数字,真有趣。
我想了很久才弄出来的,毕竟我对按位运算不熟。。。这时就可以用此函数为所欲为了,调用它不会等待点按钮,直接下一条语句。
写完这个函数,我发现了C的宏与VBS的宏值完全相等!!!!
然后我就崩溃了(废话)。
直接代进去不就得了!!!!!!!如下:

VOID VBSMsgbox(LPCSTR text,LPCSTR title,UINT uType=MB_OK)
{
  FILE *fp;
  fp=fopen("vbsmsgbox.vbs","w");
  fprintf(fp,"msgbox\"%s\",%d,\"%s\"",text,uType,title);
  fclose(fp);
 ShellExecute(0,"open","wscript.exe","\"vbsmsgbox.vbs\"","",SW_SHOW);
 }

ε=(´ο`*)))唉…白费了。就这样吧!!

发布了11 篇原创文章 · 获赞 5 · 访问量 5073

猜你喜欢

转载自blog.csdn.net/cjz2005/article/details/104438660