1 如果控件相互遮挡,则可通过传递消息的方式来响应操作
SendMessage消息
::SendMessage(hwnd, WM_SETTEXT, 0, "hello ")
GetParent()->SendMessage(WM_LBUTTONUP, (WPARAM)this->m_hWnd); //发送消息至父窗口
2 对话框指针传递
//得到主对话框指针(在子对话框类中取得)
CMyDlg *pMainDlg = (CmyDlg *)AfxGetMainWnd();
//得到主对话框中非模态对话框指针
CChildDlg *pChildDlg = pMainDlg->m.dlg;
//得到列表控件指针
CListCtrl *plistCtrl = (ClistCtrl*)pChildDlg->GetDlgItem(IDC_LIST1);
3 修改标题栏和AfxmessageBox标题栏
Resources的String Table中AFX_IDS_APP_TITLE就是AfxMessageBox标题栏的要显示的标题,
可以直接修改里面的字符串就可以了.
4 对失去焦点的指定控件进行处理
//处理消息
BOOL CBMotorsettingdlg::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
//对控件ID进行判断
switch(nID)
{
case IDC_ORG_U:
if(nCode == EN_SETFOCUS || nCode == EN_KILLFOCUS)//失去焦点
UpdateData();
return true;
default:
break;
}
return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
5 TAB键切换属性页对话框无效
经过检查,属性页对话框的基类为CPropertyPage ,改为CDialog即可
6 避免在属性页对话框中按回车或ESC也会响应退出
Esc键也可以触发对OnCancel函数的调用。
它将导致控制从对话框中退出。
不过可以像对OK按钮一样处理,通过设置一个无效的OnCancel函数来
防止这一情况的出现。
7 获得对话框的背景色
GetSysColor(COLOR_BTNFACE)
8 右上角关闭按钮响应函数处理
void CPrinterUpdateDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0)==SC_CLOSE)
{
OnClose();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
9 同时响应多个ID的菜单消息
ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnApplicationLook)
ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnUpdateApplicationLook)
10 只显示对话框的一部分
在OnInitDialog中加入
CRect smallRect;
GetWindowRect(&smallRect);
CRect bottomRect;
GetDlgItem(IDC_SEPRATOR)->GetWindowRect(&bottomRect);
smallRect.bottom = bottomRect.bottom;
SetWindowPos(NULL, 0, 0, smallRect.Width(), smallRect.Height(), SWP_NOMOVE | SWP_NOZORDER);
11 手动添加的菜单响应方法
手动添加的菜单通过一般的响应方法是没有回应的,必须自己操作
CMenu* pMenu = GetMenu()->GetSubMenu(1);
pMenu->CheckMenuItem(ID_SCHINESE, m_iLanguage == LAN_SCHINESE ? MF_CHECKED : MF_UNCHECKED);
12 非模态对话框居中显示
在初始化对话框时加入 centerWindow()
未完待续...