📄 dialog.c
字号:
/*运行对话框*/
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 + -