在文件視窗建立的時候 ,它預設總是會新建乙個新文件 , 那麼怎麼讓它不新建文件呢?就這個問題 , 我對文件檢視視窗應用程式啟動時的文件建立機制 , 稍稍的淺淺挖了一下 , 做了乙個詳細的分析 , 希望能夠對初學者有所幫助 . :
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 流淚 工作中難免會出現扯皮的事情。那作為一名專業質量控制人員,如何保證更加高效的...