BOOL CSomeApp::InitInstance()
{
Enable3dControls();
LoadStdProfileSettings();
AddDocTemplate(...) ...... ShowWindow(...);
m_pMainWnd->DragAcceptFiles();
EnableShellOpen();
RegisterShellFileTypes(TRUE);
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdInfo))
return FALSE;
return TRUE;
}
下面對InitInstance中的一些操作及其流程進行分析
1.常規設置
如:
SetDialogBkColor()
Enable3dControls()..
(如果設置了後者,則前者就不必要了)
SetRegistryKey(指定注冊表鍵,替代INI文件)
2.LoadStdProfileSettings()
LoadStdProfileSettings 完成最近文件列表功能,在菜單中添加最近的文件作為菜單項過程:
建立一個CRecentFileList從注冊表或INI文件中讀入最近文件列表;
當菜單建立時,文件列表將添加到菜單中ID_FILE_MRU_FILE*位置;
3.m_pMainWnd->DragAcceptFiles()接收文件拖入
使主窗口能響應文件拖入消息WM_DROPFILES;
當有文件拖入時, 框架窗口的OnDropFiles將處理,以打開這些文件。
void CFrameWnd::OnDropFiles(HDROP hDropInfo)
{
SetActiveWindow(); // activate us first !
UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);
CWinApp* pApp = AfxGetApp();
ASSERT(pApp != NULL);
for (UINT iFile = 0; iFile < nFiles; iFile++)
{
TCHAR szFileName[_MAX_PATH];
::DragQueryFile(hDropInfo, iFile, szFileName, _MAX_PATH);
//應用程序打開拖入文檔
pApp->OpenDocumentFile(szFileName);
}
::DragFinish(hDropInfo);
}
4.EnableShellOpen();
為在Windows中使用外殼操作打開文件作准備
void CWinApp::EnableShellOpen()
{
ASSERT(m_atomApp == NULL && m_atomSystemTopic == NULL); // do once
m_atomApp = ::GlobalAddAtom(m_pszExeName);
m_atomSystemTopic = ::GlobalAddAtom(_T("system"));
}
5.RegisterShellFileTypes
向系統注冊文件類型,以使用外殼操作。
將調用m_pDocManager->RegisterShellFileTypes()
(CDocManager::RegisterShellFileTypes()源碼附後)
要點:將所有文檔模板的類型,外殼命令等寫入注冊表
包括type ID、shellopenddeexec = [open("%1")]、shellprintddeexec = [print("%1")]、shellprinttoddeexec = [printto("%1","%2","%3","%4")]等等。
6.ProcessShellCommand
處理命令行、外殼命令等
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdInfo))
return FALSE;
①先建立CCommandLineInfo對象
②再將命令行參數等分解到cmdInfo;
void CWinApp::ParseCommandLine(CCommandLineInfo& rCmdInfo)
{
for (int i = 1; i < __argc; i++)
{
LPCTSTR pszParam = __targv[i];
BOOL bFlag = FALSE;
BOOL bLast = ((i + 1) == __argc);
if (pszParam[0] == '-' || pszParam[0] == '/')
{
// remove flag specifIEr
bFlag = TRUE;
++pszParam;
}
rCmdInfo.ParseParam(pszParam, bFlag, bLast);
}
}
通過該操作,命令行被轉化為cmdInfo;
命令行的意義
app (新建文件)
app filename(打開文件)
app /p filename(打印文件)
app /pt filename
[1] [2] [3] [4] 下一頁