共计 4495 个字符,预计需要花费 12 分钟才能阅读完成。
大家好,我是 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::string
std::string v = CT2A(value);
// std::string 转 CString
m_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();}
杂项
- 禁用 / 启用按钮
m_btn.EnableWindow(TRUE);
m_btn.EnableWindow(FALSE);
- 设置对话框题目
SetWindowText(_T("Amazing Application"));
- 给按钮增加提醒内容
CToolTipCtrl m_ToolTip;
m_ToolTip.Create(this);
m_ToolTip.AddTool(&m_btn, _T("This is my button"));
- 注册、登记热键
// 监听热键音讯
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);
- 最小化到托盘区及托盘区图标销毁
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);
}
- 托盘区的操作
// 监听音讯
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);// 显示菜单并获取选项 ID
if (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;
}
- 提示框
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);
}
- 程序单例
void My_Dlg::SingletonInstance()
{
HWND hPreWnd;
if (hPreWnd = ::FindWindow(NULL, _T("Application")))
{::ShowWindow(hPreWnd, SW_SHOW);
::SetForegroundWindow(hPreWnd);
ExitProcess(0);
}
}
明天就分享到这里啦!感激各位的浏览!码字不易,如果本文对你有帮忙的话,帮忙点个赞吧~
正文完