MFC函数----对话框
根据给定的信息,我们将深入探讨MFC中与对话框相关的各个功能点,包括但不限于字体对话框、颜色对话框、文件对话框等,并详细介绍其他与GUI交互相关的组件。 ### 一、字体对话框 #### 1. 在点击字体对话框时 在MFC中,字体对话框是一个非常实用的功能,它允许用户选择不同的字体样式、大小和颜色。在代码示例中,`On32781()` 函数被调用来响应字体对话框的触发事件: ```cpp void CMess::On32781() { // 弹出字体对话框 CFontDialog dlg; if (IDOK == dlg.DoModal()) { LOGFONT Font; // 定义存储字体的结构体 // 获得当前设置的字体信息 dlg.GetCurrentFont(&Font); // 通过字体信息来创建字体句柄 m_hFont = CreateFontIndirect(&Font); } this->Invalidate(); } ``` #### 2. 在 On_Paint 消息下 在 `On_Paint` 消息处理函数中,我们可以更新字体以反映用户在对话框中的选择: ```cpp // 在 On_Paint 消息下 dc.SelectObject(m_hFont); ``` ### 二、颜色对话框 #### 1. 在点击颜色对话框时 颜色对话框允许用户选择特定的颜色用于文本或其他图形元素。当用户点击颜色对话框时,以下代码会被执行: ```cpp void CnewDialog2::On32774() { // 当点击颜色对话框时 CColorDialog dlg; if (IDOK == dlg.DoModal()) { m_Color = dlg.GetColor(); // 获取画笔的颜色 // m_Color 为 COLORREF 类型,用来记录画笔颜色 } this->Invalidate(); } ``` #### 2. 在 On_Paint 消息下 在 `On_Paint` 消息处理函数中,可以将选择的颜色应用到文本或其他图形元素上: ```cpp // 在 On_Paint 消息下 dc.SetTextColor(m_Color); // 改变文本颜色 ``` ### 三、文件对话框 #### 1. 在点击文件对话框(打开)时 文件对话框是用户选择文件的重要工具,如打开文件对话框: ```cpp void CnewDialog2::On32776() { // 当点击文件对话框(打开)时 CFileDialog dlg(TRUE, NULL, NULL, OFN_READONLY, "图片文件(*.bmp)|*.bmp||"); if (IDOK == dlg.DoModal()) { CString strImage; // 用来储存读入图片的名字 strImage.Empty(); // 清空字符串 strImage = dlg.GetFileName(); // 获取读入文件的名字 if (m_Bitmap != NULL) { // 当存储读入图片的文图句柄不为空,先删除 DeleteObject(m_Bitmap); // 删除已有的位图 } m_Bitmap = (HBITMAP)LoadImage(NULL, strImage, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // 加载位图 } this->Invalidate(); } ``` #### 2. 在 On_Paint 消息下 在 `On_Paint` 消息处理函数中,可以显示所选文件的内容: ```cpp // 在 On_Paint 消息下 ((CStatic*)GetDlgItem(IDC_TuPian))->ModifyStyle(0, SS_BITMAP, SWP_DRAWFRAME); ((CStatic*)GetDlgItem(IDC_TuPian))->SetBitmap(m_Bitmap); ``` ### 四、ListControl #### 1. 初始化和删除(得到前台操作 ListControl 的视图指针) 对于 ListControl 的初始化和删除,可以采用以下步骤: 1. **初始化**: ```cpp // 初始化 CListCtrl* pListCtrl = new CListCtrl; pListCtrl->Create(...); ``` 2. **删除**: ```cpp // 删除 delete pListCtrl; ``` #### 2. 数据库读取 从数据库读取数据并填充到 ListControl 中: ```cpp // 数据库读取 // 假设已建立数据库连接 m_dbConn SQLStatement stmt("SELECT * FROM myTable", m_dbConn); while (stmt.FetchNextRow()) { int nColIndex = 0; for (int i = 0; i < stmt.GetColumnCount(); ++i) { CString strData = stmt.GetString(i); pListCtrl->InsertItem(nColIndex++, strData); } } ``` #### 3. ListControl 加载图标 为了在 ListControl 中显示图标,可以采用以下方式: ```cpp // ListControl 加载图标 // 先创建图像列表 CImageList imageList; imageList.Create(...); pListCtrl->SetImageList(imageList, LVSIL_SMALL); ``` #### 4. 删除数据库的选定内容 删除 ListControl 中对应数据库项的方法: ```cpp // 删除数据库的选定内容 int index = pListCtrl->GetNextItem(-1, LVNI_SELECTED); if (index != -1) { CString strData = pListCtrl->GetItemText(index, 0); SQLStatement stmt("DELETE FROM myTable WHERE id=?", m_dbConn); stmt.SetString(1, strData); stmt.Execute(); pListCtrl->DeleteItem(index); } ``` #### 5. 添加数据库的内容(以及自动排序 ID) 向数据库添加内容,并自动排序 ID: ```cpp // 添加数据库的内容 SQLStatement stmt("INSERT INTO myTable(id, name) VALUES(?, ?)", m_dbConn); int nextId = GetNextIdFromDatabase(); // 假设已实现此函数 stmt.SetInt(1, nextId); stmt.SetString(2, "New Item"); stmt.Execute(); pListCtrl->InsertItem(nextId, "New Item"); ``` #### 6. 更改数据库信息 更新数据库中已存在的信息: ```cpp // 更改数据库信息 int index = pListCtrl->GetNextItem(-1, LVNI_SELECTED); if (index != -1) { CString strData = pListCtrl->GetItemText(index, 0); SQLStatement stmt("UPDATE myTable SET name=? WHERE id=?", m_dbConn); stmt.SetString(1, "Updated Item"); stmt.SetInt(2, _ttoi(strData)); stmt.Execute(); pListCtrl->SetItemText(index, 0, "Updated Item"); } ``` ### 五、非模态弹出对话框 非模态对话框允许用户与其他窗口交互,可以在后台运行。实现方法如下: ```cpp // 非模态弹出对话框 CDialog* pDialog = new CMyDialog; pDialog->Create(IDD_DIALOG_MYDIALOG, pParentWnd); // pParentWnd 为父窗口句柄 pDialog->ShowWindow(SW_SHOW); ``` ### 六、MFC 控件 — 打开网页 / 播放 FLASH #### 1. 打开网页或弹出一个任意的新程序 MFC 中打开网页或启动其他程序的方法: ```cpp // 打开网页或弹出一个任意的新程序 ShellExecute(NULL, "open", "http://www.example.com", NULL, NULL, SW_SHOWNORMAL); ``` #### 2. 播放 FLASH 在 MFC 中播放 Flash 文件通常需要使用 ActiveX 控件,例如 Adobe Flash Player 控件: ```cpp // 播放 FLASH CActiveXCtrl* pFlashCtrl = new CActiveXCtrl(_T("{D27CDB6E-AE6D-11cf-96B8-444553540000}")); pFlashCtrl->Create(CSize(320, 240), pParentWnd, IDC_FLASH_CTRL); CComVariant varURL("http://www.example.com/example.swf"); pFlashCtrl->InvokeMethod("loadMovie", &varURL); ``` ### 七、实现可扩大可变小的对话框 实现对话框大小可调整的功能: ```cpp // 实现可扩大可变小的对话框 CResizableDialog* pResizableDialog = new CResizableDialog; pResizableDialog->AddAnchor(IDC_STATIC, TOP_LEFT); // 设置控件锚点 pResizableDialog->DoModal(); ``` ### 八、菜单加载位图和状态栏显示时间 在 MFC 中,可以通过以下方式为菜单加载位图并在状态栏中显示时间: ```cpp // 菜单加载位图 HICON hIcon = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU_ICON), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); m_Menu.SetIcon(hIcon); // 状态栏显示时间 CStatusBar* pStatusBar = GetDlgItem(IDC_STATUS_BAR); CRect rect; pStatusBar->GetClientRect(rect); pStatusBar->SetText(_T("当前时间: ") + GetTimeAsString(), 1); ``` ### 九、目录树 TreeControl #### 1. 目录树属性 目录树控件(TreeControl)用于展示层次结构的数据: ```cpp // 目录树属性 CTreeCtrl* pTreeCtrl = new CTreeCtrl; pTreeCtrl->Create(...); ``` #### 2. 常用函数(目录树前台操作指针) 目录树控件的一些常用操作函数: ```cpp // 常用函数 HTREEITEM hRoot = pTreeCtrl->InsertItem(_T("Root"), 0, 0, TVI_ROOT, TVI_LAST); HTREEITEM hChild = pTreeCtrl->InsertItem(_T("Child"), 0, 0, hRoot, TVI_LAST); pTreeCtrl->Expand(hRoot, TVE_EXPAND); ``` ### 十、属性表单 属性表单用于展示和编辑对象的属性: ```cpp // 属性表单 CPropertySheet* pPropertySheet = new CPropertySheet; pPropertySheet->AddPage(new CMyPropertyPage); pPropertySheet->DoModal(); ``` ### 十一、滚动条 滚动条用于帮助用户浏览大型文档: #### 1. SliderControl 滑动条控件用于控制数值变化: ```cpp // SliderControl CSliderCtrl* pSlider = new CSliderCtrl; pSlider->Create(...); pSlider->SetRange(0, 100); ``` #### 2. HorizontalScrollBar 和 VerticalScrollBar 水平和垂直滚动条用于文档的水平和垂直滚动: ```cpp // HorizontalScrollBar 和 VerticalScrollBar CScrollBar* pHScrollBar = new CScrollBar; pHScrollBar->Create(...); pHScrollBar->SetScrollRange(0, 100); CScrollBar* pVScrollBar = new CScrollBar; pVScrollBar->Create(...); pVScrollBar->SetScrollRange(0, 100); ``` ### 十二、DLL 连接库 #### 1. 静态连接 静态链接 DLL 的方法: ```cpp // 静态连接 extern "C" void __declspec(dllimport) MyFunction(void); MyFunction(); ``` #### 2. 动态连接 动态链接 DLL 的方法: ```cpp // 动态连接 HINSTANCE hInst = LoadLibrary(_T("mydll.dll")); if (hInst != NULL) { typedef void (__stdcall* PFN_MyFunction)(); PFN_MyFunction pfnMyFunction = (PFN_MyFunction)GetProcAddress(hInst, "MyFunction"); if (pfnMyFunction != NULL) { pfnMyFunction(); } } FreeLibrary(hInst); ``` ### 十三、读出 / 写入 INI 配置文件 #### 1. 写入 将数据写入 INI 文件: ```cpp // 写入 WritePrivateProfileString(_T("Section"), _T("Key"), _T("Value"), _T("path.ini")); ``` #### 2. 读出 从 INI 文件中读取数据: ```cpp // 读出 char buffer[256]; GetPrivateProfileString(_T("Section"), _T("Key"), _T(""), buffer, sizeof(buffer), _T("path.ini")); ``` ### 十四、对话框可大可小 实现对话框大小可调整: ```cpp // 对话框可大可小 CResizableDialog* pResizableDialog = new CResizableDialog; pResizableDialog->AddAnchor(IDC_STATIC, TOP_LEFT); pResizableDialog->DoModal(); ``` ### 十五、Windows 窗口下显示对话框 在 Windows 窗口中显示对话框: ```cpp // Windows 窗口下显示对话框 CDialog* pDialog = new CMyDialog; pDialog->DoModal(); ``` ### 一百、常用方法 #### 1. 右键弹出菜单 实现右键弹出菜单的方法: ```cpp // 右键弹出菜单 CMenu menu; menu.LoadMenu(IDR_CONTEXT_MENU); CPoint point; GetCursorPos(&point); menu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN, point.x, point.y, this); ``` #### 2. 获得控件信息(文本内容,选择哪一个…) 获取控件上的信息: ```cpp // 获得控件信息 // ListBox CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST_BOX); int nCurSel = pListBox->GetCurSel(); CString strSelected; pListBox->GetText(nCurSel, strSelected); // ComboBox CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_BOX); nCurSel = pComboBox->GetCurSel(); pComboBox->GetLBText(nCurSel, strSelected); // Edit CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT); pEdit->GetWindowText(strSelected); ``` #### 3. 获得鼠标位置 获取鼠标当前位置: ```cpp // 获得鼠标位置 CPoint point; GetCursorPos(&point); ``` #### 4. 加载图片 加载图片到 MFC 应用中: ```cpp // 加载图片 CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); ``` #### 5. 对话框刷新回刷 对对话框进行刷新操作: ```cpp // 对话框刷新回刷 Invalidate(); UpdateWindow(); ``` #### 6. 获取列表 (ListControl) 行数 获取 ListControl 的行数: ```cpp // 获取列表 (ListControl) 行数 int nItemCount = pListCtrl->GetItemCount(); ``` #### 7. MessBox 显示消息框: ```cpp // MessBox AfxMessageBox(_T("Hello, World!")); ``` #### 8. 隐藏对话框 隐藏对话框: ```cpp // 隐藏对话框 ShowWindow(SW_HIDE); ``` #### 9. 改变窗口位置 / 大小 改变窗口的位置和大小: ```cpp // 改变窗口位置 / 大小 CRect rect; GetWindowRect(rect); SetWindowPos(NULL, rect.left, rect.top, rect.Width() + 100, rect.Height() + 100, SWP_NOZORDER); ``` #### 10. 获取窗口大小 / 位置 CRect 存储 获取窗口的大小和位置,并使用 `CRect` 存储: ```cpp // 获取窗口大小 / 位置 CRect 存储 CRect rect; GetWindowRect(rect); ``` #### 11. 记录系统时间 记录当前系统时间: ```cpp // 记录系统时间 SYSTEMTIME st; GetSystemTime(&st); ``` #### 12. 关闭对话框 关闭对话框: ```cpp // 关闭对话框 EndDialog(IDOK); ``` #### 13. 加载音乐(仅支持 .wav 格式音乐) 加载音频文件: ```cpp // 加载音乐(仅支持 .wav 格式音乐) mciSendString(_T("open \"music.wav\" alias myMusic"), NULL, 0, NULL); mciSendString(_T("play myMusic"), NULL, 0, NULL); ``` #### 14. 非模态弹出对话框在别的类中定义的类指针需强转 在其他类中定义的非模态对话框需要进行类型转换: ```cpp // 非模态弹出对话框在别的类中定义的类指针需强转 CMyDialog* pDialog = (CMyDialog*)AfxGetMainWnd()->GetDlgItem(IDD_DIALOG_MYDIALOG); pDialog->ShowWindow(SW_SHOW); ``` #### 15. 格式化字符串 使用 MFC 提供的格式化字符串功能: ```cpp // 格式化字符串 CString str; str.Format(_T("Hello, %s!"), _T("World")); ``` #### 16. 释放句柄 / DC 释放设备上下文 (DC) 或其他资源句柄: ```cpp // 释放句柄 / DC ReleaseDC(); ``` #### 17. 退出单文档对话框 退出单文档对话框: ```cpp // 退出单文档对话框 PostMessage(WM_CLOSE); ``` #### 18. 通过对话框的 ID 号获得所对应的句柄 通过对话框的 ID 号获取句柄: ```cpp // 通过对话框的 ID 号获得所对应的句柄 HWND hWnd = GetDlgItem(IDC_STATIC); ``` 以上内容涵盖了 MFC 中对话框及其相关功能的广泛使用场景和技术要点,希望对你有所帮助。





























- 粉丝: 88
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 西门子S7-1200 PLC控制5轴伺服项目 · PLC编程
- 公司工资管理系统程序设计报告(1).doc
- 拓斯达自动化整体解决方案在包装机械行业应用案例(1).doc
- 专题资料2021-2022年GNGSQLJM005技术改造国产设备投资抵免企业所得税统计表 (1)(1).doc
- 网站服务合同(标准版)(1).docx
- 企业信息化战略解决方案课件(1).pptx
- 软件质量保证计划编写规范样本 (1)(1).doc
- 计算机网络课后习题答案(1).docx
- 2022年计算机二级VF模拟试题及答案(1).docx
- 互联网教育项目创业计划书-教育app创业计划书(1).docx
- 完整word版提高仓储管理信息化水平(1).doc
- Excel表格的基本操作技巧(1).doc
- 中国湿地数据库数据资源釆集与-指南(1).pdf
- cadence原理图快捷键一览表可编辑范本(1).doc
- 自动化专责B岗位说明书样本(1).doc
- 广数简易编程与操作(1).docx


