用到MessageBox时,必须鼠标点击之后,才能继续执行后面的程序。但是有时,只需要给出一个提示,在不需要点击按钮的情况下继续执行后面的操作,用到了非模态对话框去模拟一个MessageBox。 并且,在外部调用非模态对话框,并在文本框中输出文字。
自定义一个非模态对话框,样式与MessageBox差不多就行,ID号为 IDD_QUERYING 。
对话框中文本控件,显示提示语,ID号为 IDC_TEXT_QUERY。
// 1、创建非模态对话框,居中。
CDialog *pQueryDlg=new CDialog;
pQueryDlg->Create(IDD_QUERYING);
pQueryDlg->CenterWindow();
// 2、获取控件dc,这里需要用到对话框指针
CDC *pdc=(pQueryDlg->GetDlgItem(IDC_TEXT_QUERY))->GetDC();
// 这里GetDlgItem()只能用于子窗口,须通过父窗口指针获取控件指针
// 3、创建字体,根据字体情况设置参数
CFont font;
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = -12; // 高度(该参数已足够)
lf.lfWeight = FW_NORMAL; // 磅数
lf.lfClipPrecision = CLIP_LH_ANGLES; //剪贴精度
strcpy(lf.lfFaceName, "宋体");// 字体名称
font.CreateFontIndirect(&lf);
CFont *pOldFont = pdc->SelectObject(&font);
// 4、字体输出。
CRect rect = CRect(20, 30, 200, 200);
CString strQuery = "ABC....123.....";
pdc->DrawText((LPCTSTR)strQuery, &rect, DT_LEFT);
//pdc->TextOutA(20, 30, strQuery); //2选1
//可以直接设置相对于控件的坐标输出,或者利用控件Rect操作
// 5、释放资源,中间可执行其他程序。
pdc->SelectObject(pOldFont);
font.DeleteObject();
CWnd::ReleaseDC(pdc);
//这里可以处理其他程序
if(pQueryDlg)
pQueryDlg->DestroyWindow(); //若未点击关闭窗口,手动释放
有关上面非模态对话框,及其控件,其他操作。
1、获取窗口控件的句柄
// 获得窗口的控件句柄
HANDLE hdl = ::GetDlgItem(QueryDlg.m_hWnd,IDC_TEXT_QUERY);
2、获取控件指针,控件rect
CStatic *ptrQuery = (CStatic *)(pQueryDlg-> GetDlgItem(IDC_TEXT_QUERY));
CRect rect;
ptrQuery->GetClientRect(&rect);
以上为学习中遇到的问题,试验正确之后发布,用于加深学习和回顾。有问题,可共同探讨。