关于SegmentFault:古老的MFC你还会用吗

26次阅读

共计 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();}

杂项

  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);// 显示菜单并获取选项 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;
}
  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);
    }
}

明天就分享到这里啦!感激各位的浏览!码字不易,如果本文对你有帮忙的话,帮忙点个赞吧~

正文完
 0