大家好,我是Sean!
最近基于MFC做了个小软件,在此记录一下MFC的一些知识点。

创建基于对话框的一个应用

关键步骤如上述截图,后面点击下一步知道完成即可。

关于MFC界面控件的使用

通过左侧资源视图可以找到Dialog、Menu、Icon等文件,
我们可以往Dialog中添加控件,如按钮、编辑框。添加完控件之后,可以通过修改属性修改控件的ID及其他属性,并可以通过右键添加事件处理程序(回调函数),添加变量到对话框类当中。

Button 普通按钮

按钮事件处理程序,这个比较简单,一般就用单击或双击回调函数
(BN_CLICKED BN_DOUBLECLICKED)

具体点击后的逻辑在回调函数中实现即可:

void CVisionFastInputDlg::OnBnClickedAddButton()
{// code ...
}

Edit Control 普通文本编辑框

普通文本编辑框事件处理程序,我使用了EN_CHANGE,当编辑框中的内容有变化的时候,触发回调。

常用代码操作如下:

void My_Dlg::OnEnChangeTextValueEdit()
{// 获取文本框内容CString value;GetDlgItemText(IDC_TEXT_VALUE_EDIT, value);// CString转std::stringstd::string v = CT2A(value);// std::string转CStringm_value = v.c_str();// 获取光标位置POINT cp = m_value_edit.GetCaretPos();// 设置光标位置SetCaretPos(cp);ShowCaret();// 更新数据,FALSE代表从代码中的变量更新到界面,TRUE代表从界面更新到代码中的变量UpdateData(FALSE);
}

Static Text 静态文本

这个在设置属性的时候直接把内容填写好就行了。

List Control 表格

这个属性设置要讲View设置为Report,这样才能是表格样式,并通过右键添加变量将其添加到界面类中,这个控件有些初始化的操作,回调函数常用NM_DBLCLK、NM_CLICK,及单击双击回调,单击回调可以用来刷新index,双击回调可以用来触发新的对话框。

常用代码如下:

  // 头文件中控件变量CListCtrl m_list;// 添加表头CString colums[] = {TEXT("No"), TEXT("Name"), TEXT("Sex")};// 添加列并设置宽度m_list.InsertColumn(0, colums[0], LVCFMT_LEFT, 200);m_list.InsertColumn(1, colums[1], LVCFMT_LEFT, 800);m_list.InsertColumn(2, colums[2], LVCFMT_LEFT, 200);// 最后一列自适应宽度m_list.SetColumnWidth(2, LVSCW_AUTOSIZE_USEHEADER);// 设置属性,单行选中m_list.SetExtendedStyle(m_shortcut_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES );// 添加第一行数据m_list.InsertItem(0, TEXT("1001"));m_list.SetItemText(0, 1, TEXT("Henry Ha"));m_list.SetItemText(0, 2, TEXT("Male"));// 添加第二行数据m_list.InsertItem(1, TEXT("1002"));m_list.SetItemText(2, 1, TEXT("Marry Li"));m_list.SetItemText(3, 2, TEXT("Male"));// 删除所有行m_list.DeleteAllItems();

Combo-box Control 下拉选择框

这个是个下拉菜单,添加回调函数ON_CBN_SELCHANGE

CComboBox m_cbx;
// 添加选项
m_cbx.InsertString(0, _T("Red"));
m_cbx.InsertString(1, _T("Black"));
// 设置程序启动默认显示第0个
m_cbx.SetCurSel(0);ON_CBN_SELCHANGE(IDC_DATASOURCE, &CVisionFastInputDlg::OnCbnSelchange)void My_Dlg::OnCbnSelchange()
{// TODO: 在此添加控件通知处理程序代码int index = m_cbx.GetCurSel();
}

杂项

  1. 禁用/启用按钮
m_btn.EnableWindow(TRUE);
m_btn.EnableWindow(FALSE);
  1. 设置对话框标题
SetWindowText(_T("Amazing Application"));
  1. 给按钮添加提示内容
CToolTipCtrl m_ToolTip;
m_ToolTip.Create(this);
m_ToolTip.AddTool(&m_btn, _T("This is my button"));
  1. 注册、注销热键
// 监听热键消息
ON_MESSAGE(WM_HOTKEY, &My_Dlg::OnHotKey);// 声明
afx_msg LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);// 自定义一个热键数值 WM_HOTEKY_SAVE,注册热键Ctrl + Shift + S
bool ret = ::RegisterHotKey(this->GetSafeHwnd(), WM_HOTEKY_SAVE, MOD_CONTROL | MOD_SHIFT, 'S');
ret = UnregisterHotKey(GetSafeHwnd(), WM_HOTEKY_SAVE);
  1. 最小化到托盘区及托盘区图标销毁
void My_Dlg::CloseAndHide()
{//接收到关闭消息时主窗口隐藏 NOTIFYICONDATA m_nid;m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);m_nid.hWnd = this->m_hWnd;m_nid.uID = IDR_MAINFRAME;m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;m_nid.uCallbackMessage = WM_SHOWTASK;//自定义的消息名称  wcscpy_s(m_nid.szTip, _T("Application"));m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));Shell_NotifyIcon(NIM_ADD, &m_nid);//在托盘区添加图标  ShowWindow(SW_HIDE);//隐藏主窗口 UnHotKey();
}void My_Dlg::DeleteTray()//销毁托盘图标
{Shell_NotifyIcon(NIM_DELETE, &m_nid);
}
  1. 托盘区的操作
// 监听消息
ON_MESSAGE(WM_SHOWTASK, &My_Dlg::OnShowTask)// 声明
afx_msg LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);LRESULT My_Dlg::OnShowTask(WPARAM wParam, LPARAM lParam)
{//wParam接收的是图标的ID,而lParam接收的是鼠标的行为 if (wParam != IDR_MAINFRAME) return 1;switch (lParam){case WM_LBUTTONUP://左键单击显示主界面{SetHotKey();this->ShowWindow(SW_SHOW);SetForegroundWindow();DeleteTray();}break;case WM_RBUTTONUP://右击弹出菜单{LPPOINT lpoint = new tagPOINT;::GetCursorPos(lpoint);//得到鼠标位置CMenu menu;menu.CreatePopupMenu();menu.AppendMenuW(MFT_STRING, IDR_SHOW, _T("Open"));menu.AppendMenuW(MFT_STRING, IDR_TRIGER, _T("Disable"));menu.AppendMenuW(MFT_STRING, IDR_TRIGER, _T("Enable"));menu.AppendMenuW(MFT_STRING, IDR_EXIT, _T("Exit"));SetForegroundWindow();int xx = TrackPopupMenu(menu, TPM_RETURNCMD, lpoint->x, lpoint->y, NULL, this->m_hWnd, NULL);//显示菜单并获取选项IDif (xx == IDR_SHOW){SetHotKey();this->ShowWindow(SW_SHOW);SetForegroundWindow();DeleteTray();}else if (xx == IDR_TRIGER){}else if (xx == IDR_EXIT) { DeleteTray();HMENU hmenu = menu.Detach();menu.DestroyMenu();delete lpoint;ExitProcess(0); }HMENU hmenu = menu.Detach();menu.DestroyMenu();delete lpoint;}break;case WM_LBUTTONDBLCLK:{//双击不处理}break;}return 0;
}
  1. 提示框
HWND hPreWnd;
if (hPreWnd = ::FindWindow(NULL, _T("Application")))
{// MB_SYSTEMMODAL为阻塞模式bool ret = ::MessageBox(hPreWnd, _T("Are you sure to delete all!"), _T("Warning!"), MB_YESNO | MB_SYSTEMMODAL);
}
  1. 程序单例
void My_Dlg::SingletonInstance()
{HWND hPreWnd;if (hPreWnd = ::FindWindow(NULL, _T("Application"))){::ShowWindow(hPreWnd, SW_SHOW);::SetForegroundWindow(hPreWnd);ExitProcess(0);}
}

今天就分享到这里啦!感谢各位的阅读!码字不易,如果本文对你有帮助的话,帮忙点个赞吧~

古老的MFC,你还会用吗?相关推荐

  1. 什么是ATL? (与COM的关系,及MFC与COM的关系)

    什么是ATL (与COM的关系,及MFC与COM的关系) 自从1993年Microsoft首次公布了COM技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列软件组件化技术 ...

  2. 【MFC】Windows样式

    00. 目录 文章目录 00. 目录 01. 概述 02. Windows常用样式 03. Windows样式示例 04. Windows位置 05. Windows大小 06. Windows尺寸 ...

  3. 【转】MFC与.NET的区别

    1.     MFC是在API的基础上封装出来的一个类库,给C++程序员在Windows上快速开发用的. .Net类库是在Windows非托管API的基础上封装出来的一个托管类库,给程序员在各种Win ...

  4. MFC 教程【10_内存分配方式和调试机制 】

    内存分配方式和调试机制 M内存分配 内存分配函数 MFCWin32或者C语言的内存分配API,有四种内存分配API可供使用. Win32的堆分配函数 每一个进程都可以使用堆分配函数创建一个私有的堆── ...

  5. MFC真的过时了吗?C++是否真的适合做GUI界面?

    1.前言   这几天在论坛看到一个有趣的问题:新人入职公司做C++开发,发现公司用的界面GUI还是微软古老的MFC框架,想问大家MFC是不是已经过时了?是否还有深入学习的必要? 其实,个人觉得在讨论这 ...

  6. 现就本人在初学MFC中遇到的问题以及解决方法做一下总结,软件环境为VS2008

    1.当Picture Control控件作为处理结果显示区域时,最开始背景颜色的设置.     Picture Control控件的Type属性中一共有8个选项:   (1)Frame:显示一个没有填 ...

  7. 初学者学习MFC的资源汇总

    写作目的 楼主最近在整理百度网盘资源,由于空间不足需要腾出一些空间以存储当前以及对未来有用的资源.于是有好多自我感觉没用的计算机资源都要进行清理.在整理的过程中,看到了我以前学习过的MFC资源.提到M ...

  8. fortran语言和python语言_fortran语言还有人用吗

    fortran语言还有人用吗? Fortran还是有人用的,不过一般是科学计算方面用得多一些. 它是世界上最早出现的计算机高级程序设计语言,广泛复应用于科学和工程计算领域.毕竟一个语言的存在自然有它的 ...

  9. 动手学MFC之八——鼠标和键盘

    对于程序员来说,懒惰是一种美. 鼠标和键盘是我们计算机的两大输入设备,所以我们必须要掌握他们的用法,你是不是乐了,鼠标和键盘我早就会用了,还用你教?且慢,我说的是获取鼠标和键盘的事件,也就是鼠标点击了 ...

最新文章

  1. c语言程序能够在不同的操作系统下运行,这说明c语言具有很好的,程序设计(C)作业一(有答案)...
  2. 使用network管理DD恢复全库操作步骤
  3. python学习day06--01
  4. 速成pytorch学习——11天. 使用GPU训练模型
  5. 2021-2025年中国地下装载机行业市场供需与战略研究报告
  6. UDP数据包最大传输长度
  7. J2ME,与你有缘无分。
  8. 似然比和p值不同的原因_二代P值:传统P值的升级 | 社论前沿
  9. 02 SVN 与 Git 的优缺点
  10. Spring Boot Spring Cloud 区分 开发环境 测试环境 预发布环境(灰度环境) 正式环境
  11. 计算网格中直线经过的格子
  12. springboot项目打jar包跳过单元测试test
  13. php h5 调用摄像头_利用html5调用本地摄像头拍照上传图片
  14. 基于matlab了光纤模式图,基于matlab光纤的模式图模拟
  15. 【转载】JSP开发工具的选择
  16. jCore中文本地化工作札记 - 1
  17. QML和C++之间的数据类型转换
  18. 云计算虚拟机实验2020
  19. 人工智能在医疗行业的影响是怎样的?
  20. FPGA实例06——FPGA驱动超声波模块

热门文章

  1. 未来教育计算机一级一本通光盘,未来教育·全国计算机等级考试笔试·上机一本通:三级网络技术(2011年考试专用)(附CD光盘1张)...
  2. TCP/UDP/SOCKET/HTTP浅谈
  3. Termux 安装openSsh
  4. 【GoCN酷Go推荐】Html解析利器-goquery库
  5. Dell戴尔灵越Inspiron 15 3511原装出厂系统恢复原厂系统
  6. 输出个人信息 java_Java:输出个人信息(类和对象)
  7. 模板引擎替换拼接字符串(1)
  8. 锁存器 触发器 寄存器 区别
  9. 第六讲 典型相关性分析
  10. 个人站点网页设计html,响应式网页设计的快速教程(适合个人站点)