MFC 使用記錄

1. Dialog相關

1.1 將MFC的dialog封裝成DLL供其他項目使用

【圖解】C++控制檯調用MFC帶自定義界面的dll

https://blog.csdn.net/miko2018/article/details/83865022

找了很久,親身實踐可行 :)

1.2 dialog彈出方式

(一)DoModal()

CCurveDlg mydlg;

mydlg.DoModal();

(二)ShowWindow()

CCurveDlg *newDialog;
newDialog = new CCurveDlg;
newDialog->Create(IDD_DIALOG1, GetDesktopWindow());
newDialog->ShowWindow(SW_SHOW);

(三)獲取dialog相對於屏幕的位置,根據相對位置彈出新的dialog

CCurveDlg *newDialog;
newDialog = new CCurveDlg;
newDialog->Create(IDD_DIALOG1, GetDesktopWindow());
	
//獲取相對於屏幕的位置
CRect rect;
GetWindowRect(rect);
	
//設置新窗口出現的位置
newDialog->MoveWindow(rect.TopLeft().x+50, rect.TopLeft().y+50, rect.Width(), rect.Height());
newDialog->ShowWindow(SW_SHOW);

1.3 關閉父dialog,子dialog不要關閉

 

2. CMenu相關

關於CMenu很好的一篇文章: https://blog.csdn.net/gavingey/article/details/2214086

2.1 動態添加單層Menu (類型:MF_STRING)

        // 假設在ChildFrm中,調用該方法獲得當前的主菜單指針 
	CMenu* mainMenu = AfxGetMainWnd()->GetMenu(); 
	CMenu* subMenu = NULL; 

	// 遍歷主菜單下的各級菜單尋找名爲MainSubMenu1的菜單 
	int menuCount = mainMenu->GetMenuItemCount();
	for(int i = 0; i < menuCount; i++)
	{
		CString menuName;
		if(mainMenu->GetMenuStringW(i,menuName, MF_BYPOSITION)
			&& menuName == "打開")
		{
			subMenu = mainMenu->GetSubMenu(i);
			break;
		}
	} 

	// 移除原有的菜單項 
	/*int subMenu1Count = subMenu->GetMenuItemCount();
	for(int i = subMenu1Count - 1; i >= 0; i--)
	{
		subMenu->DeleteMenu(i, MF_BYPOSITION);
	} */

	// 動態添加Item菜單項
	for(int i = 0; i < 2; i++)
	{
		CString message = _T(""); 
		message.Format(_T("SubSubMenu%i"),i);
		subMenu->AppendMenuW(MF_STRING, ID_BEGIN+i, message);
	}

2.2 動態添加多層Menu (類型:MF_POPUP)

        CMenu* mainMenu = NULL;
	mainMenu = GetMenu();

	if(mainMenu != NULL){
		CMenu* subMenu = NULL;
		subMenu = mainMenu->GetSubMenu(0);
		if(subMenu != NULL) {
			int itemsCnt = subMenu->GetMenuItemCount();
			for (int i=0; i< itemsCnt; i++)
			{
				subMenu->DeleteMenu(0, MF_BYPOSITION);
			}
			
			subMenu->AppendMenuW(MF_STRING, (UINT)subMenu->m_hMenu+0, L"一級菜單0");
			subMenu->AppendMenuW(MF_STRING, (UINT)subMenu->m_hMenu+1, L"一級菜單1");
			subMenu->AppendMenuW(MF_SEPARATOR);


			CMenu* sub2Menu = new CMenu();	//popup
			sub2Menu->CreateMenu();

			if(sub2Menu != NULL){
				sub2Menu->AppendMenu( MF_STRING,(UINT)sub2Menu->m_hMenu+4, L"二級菜單0" );
				sub2Menu->AppendMenu( MF_STRING,(UINT)sub2Menu->m_hMenu+1, L"二級菜單1" );
				sub2Menu->AppendMenu( MF_STRING,(UINT)sub2Menu->m_hMenu+2, L"二級菜單2" );
				sub2Menu->AppendMenu( MF_STRING,(UINT)sub2Menu->m_hMenu+3, L"二級菜單3" );
			}

			subMenu->AppendMenuW(MF_POPUP, (UINT_PTR)sub2Menu->operator HMENU(), L"PopupMenu");
			
		}
	}

2.3 爲菜單動態添加點擊事件

一篇比較好的介紹文章:https://www.cnblogs.com/sitemaker/articles/newbutton.html

我的需求是生成若干個子菜單,用同一個函數響應他們的點擊事件,而後根據Id的不同,做不同的工作。

1.在(對話框).h中聲明響應函數:

2.在(對話框).cpp中完成事件與函數的映射:

(1)在文件中找到BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()

(2)在這兩句話中間寫:

ON_COMMAND_RANGE(ID_STRNG_MYMENUS,ID_STRNG_MYMENUS+1000,OnMuseClick) 

其中“ID_STRNG_MYMENUS”是我的宏定義,用來作爲Muse的Id

#define ID_STRNG_MYMENUS 20000

表示Id在20000~21000之間的控件的點擊事件都用“OnMuseClick()”函數響應

3.在(對話框).cpp中完成實現響應函數:

void CCurveDlg::OnMuseClick(UINT uID){
	AfxMessageBox(path[uID-20000]);
}

3. 必備小知識

3.1 根據Id獲取控件對象

CButton *p_button1 = (CButton *)GetDlgItem(IDC_MAN);

3.2 Edit Control 獲取焦點

GetDlgItem(IDC_EDIT1)-> SetFocus(); 

3.3 枚舉一個目錄下的所有文件和子目錄

void ListFolder(const CString & sPath)
{
    CFileFind ff;   
    BOOL bFound = ff.FindFile(sPath + "\\*.*");
    while(bFound)
    {
        bFound = ff.FindNextFile();
        if(ff.IsDirectory())  //是目錄
        {
            if(!ff.IsDots()) //不是本級目錄或父目錄(.和..)
                ListFolder(ff.GetFilePath()); //遞歸子目錄
        }
        else
        {
            AfxMessageBox(ff.GetFilePath()); //全路徑
            //AfxMessageBox(ff.GetFileTitle());//目錄名
            //AfxMessageBox(ff.GetFileName());//文件名
        }
    }
    ff.Close();
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章