你們好,我是Sean!
最近基於MFC作了個小軟件,在此記錄一下MFC的一些知識點。ide
關鍵步驟如上述截圖,後面點擊下一步知道完成便可。函數
經過左側資源視圖能夠找到Dialog、Menu、Icon等文件,
咱們能夠往Dialog中添加控件,如按鈕、編輯框。添加完控件以後,能夠經過修改屬性修改控件的ID及其餘屬性,並能夠經過右鍵添加事件處理程序(回調函數),添加變量到對話框類當中。this
按鈕事件處理程序,這個比較簡單,通常就用單擊或雙擊回調函數
(BN_CLICKED BN_DOUBLECLICKED)
具體點擊後的邏輯在回調函數中實現便可:spa
void CVisionFastInputDlg::OnBnClickedAddButton() { // code ... }
普通文本編輯框事件處理程序,我使用了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); }
這個在設置屬性的時候直接把內容填寫好就好了。blog
這個屬性設置要講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();
這個是個下拉菜單,添加回調函數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(); }
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); } }
今天就分享到這裏啦!感謝各位的閱讀!碼字不易,若是本文對你有幫助的話,幫忙點個贊吧~資源