程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 應用程序類對象實例初始操作的分析

應用程序類對象實例初始操作的分析

編輯:vc教程

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] 下一頁

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved