欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MFC 常用功能总结

程序员文章站 2022-03-27 21:07:50
目录 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}

本文持续更新中...