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

📄 dialog.c

📁 MinGUI 可视化程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:

  /*运行对话框*/ 
  dlgWndID=WNDPTR(hMessageDlg)->ID;
  while(1)
  {  if(!HandleMessage()) 
     { /*GUI已经关闭*/
        break;
     }
     else if(dlgWndID!=WNDPTR(hMessageDlg)->ID)
     {  /*该对话框已经关闭*/
        /*对于MessageDlg,这种情况不允许出现*/
        hMessageDlg=NULL; 
        break;
     } 
     else 
     { ModuleResult=dlgInfo->ModuleResult;
       if(ModuleResult) break;
     }
  }
  
  
  /*释放命令按钮链表*/
  while(dlgbtns.Next)
  { pbtns=dlgbtns.Next;
    dlgbtns.Next=pbtns->Next;
    FreeMem(pbtns);
  }  
  
  /*递减对话框的嵌套深度*/
  MessageDlgCount--;
  
  /*激活前一个对话框*/
  if(MessageDlgCount>0)
  { EnableWindow(LastDlg,true);
  }

  /*销毁对话框*/
  DestroyWindow(hMessageDlg);

  /*记录当前的对话框*/
  hMessageDlg=LastDlg;
  
  return ModuleResult;
}
//---------------------------------------------------------------------------
int MessageBox(LPCSTR lpText,LPCSTR lpCaption,UINT uStyle)
{ int  j,x,y,BtnAreaWidth,BtnArrayTop,dlgClientWidth,dlgWidth,dlgHeight,dlgClientHeight,btncount,ModuleResult=0;
  HWND LastDlg;
  TDialogInfo *dlgInfo;
  char *dlgBtnCaption[3];
  UINT  dlgBtnTag[3]; 
  HWND  hDlgBtns[3];
  BOOL  NeedCloseBtn;
  TSIZE InfoTextSize;
  DWORD dlgWndID;
  TBitmap *LogoBitmap;
  /*计算客户文本区的长宽尺寸*/
  GetTextSize(NULL,lpText,&InfoTextSize);
     
  /* 确定命令按钮的数目及标题*/
  switch (uStyle&0xf)
  { case  MB_ABORTRETRYIGNORE:
            btncount=3;   
            NeedCloseBtn=false;
            dlgBtnCaption[0]="终止";
            dlgBtnCaption[1]="重试";
            dlgBtnCaption[2]="忽略";
            dlgBtnTag[0]=IDABORT;
            dlgBtnTag[1]=IDRETRY;
            dlgBtnTag[2]=IDIGNORE;            
          break;
    case MB_OKCANCEL:
            btncount=2;  
            NeedCloseBtn=true;
            dlgBtnCaption[0]="确定";
            dlgBtnCaption[1]="取消";
            dlgBtnTag[0]=IDOK;
            dlgBtnTag[1]=IDCANCEL;
         break;     
    case MB_RETRYCANCEL:
            btncount=2;   
            NeedCloseBtn=true;
            dlgBtnCaption[0]="重试";
            dlgBtnCaption[1]="取消";
            dlgBtnTag[0]=IDRETRY;
            dlgBtnTag[1]=IDCANCEL;
         break;
    case MB_YESNO:
            btncount=2;   
            NeedCloseBtn=false;
            dlgBtnCaption[0]="是";
            dlgBtnCaption[1]="否";
            dlgBtnTag[0]=IDYES;
            dlgBtnTag[1]=IDNO;
         break;
    case MB_YESNOCANCEL:
            btncount=3;  
            NeedCloseBtn=true;
            dlgBtnCaption[0]="是";
            dlgBtnCaption[1]="否";
            dlgBtnCaption[2]="取消";
            dlgBtnTag[0]=IDYES;
            dlgBtnTag[1]=IDNO;
            dlgBtnTag[2]=IDCANCEL;
         break;
    default:
            btncount=1;
            NeedCloseBtn=true;
            dlgBtnCaption[0]="确定";
            dlgBtnTag[0]=IDOK;
  }
  

  /*计算命令按钮区的宽度*/
  BtnAreaWidth= (BUTTON_WIDTH_DEFAULT+DLG_BUTTON_SPAN) * btncount - DLG_BUTTON_SPAN;

  /*确定对话框的高度*/
  dlgClientHeight=InfoTextSize.y+DLG_CLIENT_MARGIN+DLG_CMDBTN_HEIGHT;

  /*初步确定对话框的宽度,(宽度至少为高度的4/3)*/
  dlgClientWidth=(dlgClientHeight/3)<<2;

  /*根据按钮区宽度调整对话框宽度*/
  if(BtnAreaWidth>dlgClientWidth)dlgClientWidth=BtnAreaWidth;

  /*判断是否需要醒目图标*/
  LogoBitmap=NULL; 
  if(uStyle&0xf0)
  { BYTE *InfoIcon;
    switch((uStyle>>4)&0xf)
    { case 1: InfoIcon=(BYTE *)MB_Icon1;break;
      case 2: InfoIcon=(BYTE *)MB_Icon2;break;
      case 3: InfoIcon=(BYTE *)MB_Icon3;break;
      case 4: InfoIcon=(BYTE *)MB_Icon4;break;
      default: InfoIcon=NULL;
    }
    if(InfoIcon)
    {  LogoBitmap=CreateBitmap();
       if(LogoBitmap && LoadBitmapFromMem(LogoBitmap,InfoIcon,-1) )
       { LogoBitmap->Transparent=true;
       }
       else
       { if(LogoBitmap)
            DestroyBitmap(LogoBitmap);
         LogoBitmap=NULL;
       }
    }
  }


  /*根据主文本信息宽度以及醒目图标宽度调整对话框宽度*/
  x=InfoTextSize.x; 
  if(LogoBitmap) x+=(LogoBitmap->Width+DLG_CLIENT_MARGIN);
  if(x>dlgClientWidth)dlgClientWidth=x;


  /*根据标题宽度调整对话框宽度*/
  x=strlen(lpCaption)*SYS_FONT_WIDTH+DLG_SYSBTN_WIDTH;
  if(x>dlgClientWidth)dlgClientWidth=x;
 
  /*对话框大小的最后调整*/
  if(LogoBitmap && LogoBitmap->Height>InfoTextSize.y)dlgClientHeight+=(LogoBitmap->Height-InfoTextSize.y);
  dlgClientWidth  += DLG_CLIENT_MARGIN*2;
  dlgClientHeight += DLG_CLIENT_MARGIN*2;
  BtnArrayTop=dlgClientHeight-DLG_CLIENT_MARGIN-DLG_CMDBTN_HEIGHT;

  /*根据对话框嵌套深度决定对话框的坐标位置*/
  dlgWidth=dlgClientWidth+DLG_BORDER_SIZE*2;
  dlgHeight=dlgClientHeight+CAPTION_BAR_HEIGHT+DLG_BORDER_SIZE*2;
  x=(LCD_WIDTH>dlgWidth)?(LCD_WIDTH-dlgWidth)>>1:0;
  y=(LCD_HEIGHT>dlgHeight)?(LCD_HEIGHT-dlgHeight)>>1:0;
  if(MessageDlgCount)
  { x+=MessageDlgCount*DLG_CLIENT_MARGIN;
    y+=MessageDlgCount*DLG_CLIENT_MARGIN;
    if(x+dlgWidth>LCD_WIDTH)x=LCD_WIDTH-dlgWidth;
    if(y+dlgHeight>LCD_HEIGHT)y=LCD_HEIGHT-dlgHeight;
  }
  LastDlg=hMessageDlg;

   /*创建对话框窗体*/
  hMessageDlg=CreateWindow("dialog",lpCaption,WS_CAPTION|WS_ALWAYSONTOP|((NeedCloseBtn)?WS_SYSMENU:0),x,y,dlgWidth,dlgHeight,NULL,0,NULL);
  if(!hMessageDlg)
  { DebugAlert("MessageBox(...) failed!");
    hMessageDlg=LastDlg;
    return 0;
  }
  else
  { /*如果对话框创建成功,并且之前有对话框未关闭,则将其Disable*/
    /*Only allow the latest dialog get the key or mouse focus*/
    dlgInfo=(TDialogInfo *)WndClsBuf(hMessageDlg);
    dlgInfo->ModuleResult=0;  
    if(LastDlg) 
    { EnableWindow(LastDlg,false);
    }
    MessageDlgCount++;
  }

 /*创建醒目图标*/
  if(LogoBitmap)
  { HWND WndLogo=CreateWindow("static",NULL,0,DLG_CLIENT_MARGIN,DLG_CLIENT_MARGIN,LogoBitmap->Width,LogoBitmap->Height,hMessageDlg,0,0);
    SetWindowLogo(WndLogo,LogoBitmap);
  }


  /*创建对话框的客户区文本标签*/ 
  x=(dlgClientWidth-InfoTextSize.x)>>1;
  y=(BtnArrayTop -InfoTextSize.y)>>1;
  if(LogoBitmap)
  { //j=DLG_BORDER_SIZE+DLG_CLIENT_MARGIN+BUTTON_CAPTION_MAXSIZE+DLG_CLIENT_MARGIN;
    //if(j>x)x=j;
	  x=(dlgClientWidth+LogoBitmap->Width-InfoTextSize.x)>>1;
  }
  CreateWindow("static",lpText,0,x,y,InfoTextSize.x,InfoTextSize.y,hMessageDlg,0,0);

  /*创建对话框的命令按钮*/ 
  x=(dlgClientWidth-BtnAreaWidth)>>1; 
  for(j=0;j<btncount;j++)
  { hDlgBtns[j]=CreateWindow("Button",dlgBtnCaption[j],WS_TABSTOP|WS_BORDER,x,BtnArrayTop,BUTTON_WIDTH_DEFAULT,DLG_CMDBTN_HEIGHT,hMessageDlg,0,NULL);
    WNDPTR(hDlgBtns[j])->UserData=dlgBtnTag[j];
    x+=(BUTTON_WIDTH_DEFAULT+DLG_BUTTON_SPAN);
  }
 
  /*设置默认焦点*/ 
  j=(uStyle>>8)&0xf;
  if(j>=3)j=0;
  SetFocus(hDlgBtns[j]);

  /*安装对话框消息钩子,捕捉命令铵钮消息。*/
  InstallHook(hMessageDlg,WM_COMMAND,MessageDialogHook);
  
  /*运行对话框*/ 
  dlgWndID=WNDPTR(hMessageDlg)->ID;
  while(1)
  {  if(!HandleMessage()) 
     { /*GUI已经关闭*/
        break;
     }
     else if(dlgWndID!=WNDPTR(hMessageDlg)->ID)
     {  /*该对话框已经关闭*/
        hMessageDlg=NULL; 
        ModuleResult=IDCANCEL;
        break;
     } 
     else 
     { ModuleResult=dlgInfo->ModuleResult;

⌨️ 快捷键说明

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