古老的MFC,你還會用嗎?

你們好,我是Sean!
最近基於MFC作了個小軟件,在此記錄一下MFC的一些知識點。ide

建立基於對話框的一個應用

關鍵步驟如上述截圖,後面點擊下一步知道完成便可。函數

關於MFC界面控件的使用

經過左側資源視圖能夠找到Dialog、Menu、Icon等文件,
咱們能夠往Dialog中添加控件,如按鈕、編輯框。添加完控件以後,能夠經過修改屬性修改控件的ID及其餘屬性,並能夠經過右鍵添加事件處理程序(回調函數),添加變量到對話框類當中。this

Button 普通按鈕

按鈕事件處理程序,這個比較簡單,通常就用單擊或雙擊回調函數
(BN_CLICKED BN_DOUBLECLICKED)

具體點擊後的邏輯在回調函數中實現便可:spa

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

Edit Control 普通文本編輯框

普通文本編輯框事件處理程序,我使用了EN_CHANGE,當編輯框中的內容有變化的時候,觸發回調。

經常使用代碼操做以下:code

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 靜態文本

這個在設置屬性的時候直接把內容填寫好就好了。blog

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_SELCHANGEip

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);
    }
}

今天就分享到這裏啦!感謝各位的閱讀!碼字不易,若是本文對你有幫助的話,幫忙點個贊吧~資源

相關文章
相關標籤/搜索