如何讓DOC VIEW框架不建立新文件

2021-05-25 16:58:34 字數 2702 閱讀 4273

在文件視窗建立的時候 ,它預設總是會新建乙個新文件 , 那麼怎麼讓它不新建文件呢?就這個問題 , 我對文件檢視視窗應用程式啟動時的文件建立機制 , 稍稍的淺淺挖了一下 , 做了乙個詳細的分析 , 希望能夠對初學者有所幫助 . :

ccommandlineinfo  cmdinfo;

parsecommandline(cmdinfo);

if (!processshellcommand(cmdinfo)) return false;

這幾行**是程式啟動時建立新文件的關鍵** .

1: 我們首先來看看讓ccommandlineinfo類是個什麼東西:( 部分源** )

//in afxwin.h

class ccommandlineinfo : public cobject

; 這裡要重點注意enum m_nshellcommand;

這裡聯合型別定義的m_nshellcommand 就是外殼程式執行的命令型別 , 如果m_nshellcommand設定為filenew ,那麼程式就會建立新文件 . 如果想在文件開始時不建立新文件 , 就必須將m_nshellcommand設定為fillenothing .

下面我們再看看ccommandlineinfo的建構函式 .

ccommandlineinfo::ccommandlineinfo()

這裡很明白的看出 , 建構函式中 , 預設將 m_nshellcommand設定為 filenew .

2:再來看看parsecommandline(cmdinfo); 函式.

rcmdinfo.parseparam(pszparam, bflag, blast); }

}可以看出parsecommandline主要是對輸入的命令列引數做一些分析 , 並呼叫parseparam來進行處理 .繼續分析 parseparam函式 , 檢視如下源**:

void ccommandlineinfo::parseparam(const tchar* pszparam,bool bflag,bool blast)

else

parseparamnotflag(pszparam);

parselast(blast); }

其它的函式撇開不看 , 我們重點來分析一下parseparamflag()和parselast()函式 .

void ccommandlineinfo::parseparamflag(const char* pszparam)

else if (lstrcmpia(pszparam, "embedding") == 0)

else if (lstrcmpia(pszparam, "automation") == 0)

}parseparamflag判斷傳過來的字串 ,判斷它的引數型別 , 並根據引數型別做不同的處理 .

void ccommandlineinfo::parselast(bool blast)

}parselast會判斷是否是是filenew開啟新文件 , 如果是開啟新文件 , 並且開啟的文件名不為空的話, 就假定使用者想開啟這個文件 , 把命令設定為fileopen .

最後 , 我們可以總結一下parsecommandline的作用 . parsecommandline的作用主要是

分析命令列引數,如果沒有命令列引數 ,parsecommandline()就假定使用者想新建乙個文件,於是設定乙個filenew命令,如果命令列引數中有乙個檔名,parsecommandline()就假定使用者想開啟該檔案,於是設定乙個fileopen命令。

3: 最後 , 我們來重點看看外殼命令解析的主角 : processshellcommand ();(部分源**)

}**看到這裡 , 一切都很明白了 . processshellcommand分析m_nshellcommand ,並根據m_nshellcommand不同的型別值進行不同的處理 .

再來分析下面兩行**:

ccommandlineinfo cmdinfo;

parsecommandline(cmdinfo);

if (!processshellcommand(cmdinfo)) return false;

1: 當ccommandlineinfo cmdinfo進行定義時 , 首先呼叫建構函式 , 建構函式中m_nshellcommand被設定為filenew

2: 然後執行parsecommandline(cmdinfo);對命令進行分析 .

3: 最後執行processshellcommand (cmdinfo) , processshellcommand ()判斷m_nshellcommand為filenew , 於是呼叫onfilenew()建立了乙個新的文件 .

這也就是建立新文件的來龍去脈 .

最後, 我們看怎麼樣解決不想在應用程式啟動時的建立新文件的問題:

直接在initinstance()函式中用如下**代替原來的幾行即可:

ccommandlineinfo cmdinfo;

cmdinfo.m_nshellcommand = ccommandlineinfo::filenothing;

parsecommandline(cmdinfo);

if (!processshellcommand(cmdinfo)) return false;

Android如何讓EditText不彈出鍵盤

適用於需要在edittext上新增乙個popupwindow的情況 比如做乙個日期選擇器而不是手動輸入 同一頁面的edittext重寫。新增以下方法 this.setonfocuschangelistener newview.onfocuschangelistener public static v...

如何讓struct不位元組對齊

下面我們使用預編譯指令 progma pack value 來告訴編譯器,使用我們指定的對齊值來取代預設的。progma pack 2 指定按2位元組對齊 struct c progma pack 取消指定對齊,恢復預設對齊 sizeof struct c 值是8。不位元組對齊的話 就設定 prog...

如何讓測試不背鍋

今天小組會議覆盤這次驗證測試中發現的乙個問題,小組成員包含需求人員,開發人員,測試人員,專案管理,明明是最開始從開發人員沒有和需求人員確認之後就開發了,然後沒有告知測試人員,最後各種扯皮,來沒有這麼恨過 mo 流淚mo 流淚 工作中難免會出現扯皮的事情。那作為一名專業質量控制人員,如何保證更加高效的...