1. Dialog相關
1.1 將MFC的dialog封裝成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();
}