MFC 常用功能总结
程序员文章站
2022-07-02 22:29:55
目录 1. 获取启动参数2. 调整窗体大小3. 关闭Dialog窗体4. Dialog启动时指定控件为焦点5. Dialog中禁止ESC回车关闭窗体6. 回车后焦点自动跳到下一个控件7. 窗体中某个控件捕获右键菜单8. 窗体上某个控件捕获右键菜单9. 获取指定窗体hWnd下的所有子窗体 1. 获取启 ......
目录
1. 获取启动参数2. 调整窗体大小3. 关闭Dialog窗体4. Dialog启动时指定控件为焦点5. Dialog中禁止ESC回车关闭窗体6. 回车后焦点自动跳到下一个控件7. 窗体中某个控件捕获右键菜单8. 窗体上某个控件捕获右键菜单9. 获取指定窗体hWnd下的所有子窗体
1. 获取启动参数
在XXXApp类的InitInstance函数中通过宏 __argc 与 __targv 即可获取到程序的启动参数. 代码如下:
1BOOL XXXApp::InitInstance()
2{
3 for (int i = 0; i < __argc; i++)
4 {
5 AfxMessageBox(__targv[i]);
6 }
7
8 ...
9
10 return FALSE;
11}
2. 调整窗体大小
使用 SetWindowPos 或 GetWindowRect 均可实现. 代码如下:
1 // SetWindowPos 实现
2 CRect rc1(0, 0, 800, 600);
3 SetWindowPos(NULL, 0, 0, rc1.Width(), rc1.Height(), SWP_NOZORDER | SWP_NOMOVE);
4
5 // MoveWindow 实现
6 CRect rc2;
7 GetWindowRect(&rc2);
8 rc2.bottom += 100;
9 rc2.right += 100;
10 MoveWindow(&rc2);
3. 关闭Dialog窗体
通过 PostMessage 函数发送消息实现. 代码如下:
1// close dialog
2::PostMessage(pDlg->GetSafeHwnd(), WM_CLOSE, 0, 0);
3
4// end dialog with idok
5::PostMessage(pDlg->GetSafeHwnd(), WM_COMMAND, IDOK, 0);
4. Dialog启动时指定控件为焦点
在 OnInitDialog() 中调用 BringWindowToTop(). 代码如下:
1GetDlgItem(IDC_EDIT_XXX)->BringWindowToTop();
5. Dialog中禁止ESC回车关闭窗体
通过在 PreTranslateMessage(…) 中屏蔽对 VK_ESCAPE, VK_RETURN 的处理即可. 代码如下:
1BOOL CDlgXXX::PreTranslateMessage(MSG* pMsg)
2{
3 if (VK_RETURN == pMsg->wParam || VK_ESCAPE == pMsg->wParam)
4 {
5 return TRUE;
6 }
7
8 return CDialogEx::PreTranslateMessage(pMsg);
9}
6. 回车后焦点自动跳到下一个控件
通过在 PreTranslateMessage(…) 中对 WM_KEYDOWN, VK_RETURN 的处理来实现. 代码如下:
1BOOL CDlgXXX::PreTranslateMessage(MSG* pMsg)
2{
3 if (WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
4 {
5 int id = GetFocus()->GetDlgCtrlID();
6 if (id == IDC_EDIT_X1)
7 {
8 // 两种方法都可以重置焦点
9 GotoDlgCtrl(GetDlgItem(IDC_EDIT_X2));
10 // GetDlgItem(IDC_EDIT_X2)->SetFocus();
11 }
12 else if (id == IDC_EDIT_X2)
13 {
14 OnBnClickedBtn();
15 }
16
17 return TRUE;
18 }
19
20 return CDialogEx::PreTranslateMessage(pMsg);
21}
7. 窗体中某个控件捕获右键菜单
处理消息 WM_CONTEXTMENU 来实现. 代码如下:
1void CDlgXXX::OnContextMenu(CWnd* pWnd, CPoint point)
2{
3 if (pWnd->m_hWnd == 控件.m_hWnd)
4 {
5 CMenu m;
6 m.LoadMenu(IDR_MENU);
7
8 CMenu* pPopMenu = menu.GetSubMenu(0);
9 if (!pPopMenu)
10 {
11 return ;
12 }
13
14 pPopMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y);
15 }
16}
8. 窗体上某个控件捕获右键菜单
通过处理消息 WM_CONTEXTMENU 来实现. 代码如下:
1void CDlgXXX::OnContextMenu(CWnd* pWnd, CPoint point)
2{
3 if (pWnd->m_hWnd == 控件.m_hWnd)
4 {
5 CMenu menu;
6 menu.LoadMenu(IDR_MENU);
7
8 CMenu* pPopMenu = menu.GetSubMenu(0);
9 if (!pPopMenu)
10 {
11 return ;
12 }
13
14 pPopMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y);
15 }
16}
9. 获取指定窗体hWnd下的所有子窗体
通过 GetWindow 可以实现, 代码如下:
1HWND hwndChild = ::GetWindow(hWnd, GW_CHILD); //列出所有控件
2while (hwndChild)
3{
4 hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
5}
本文持续更新中...
上一篇: 常见的字符编码
下一篇: unity实现动态排行榜