開新檔案/開啓舊檔/存檔/另存新檔,四大天王
¶開新檔案/開啓舊檔/存檔/另存新檔,四大天王
原文連結: https://darkblack01.blogspot.com/2012/08/blog-post_14.html
移植時的最後更新日期: 2012-08-14T17:28:50.216+08:00
- 開新檔案
- 開啓舊檔
- 存檔
- 另存新檔
這四個是(SDI或MDI)很常見的程式段。
但是常見到網路上找不到,很多細節又…還是找不到。
所以貼一貼好了!
藍色部份為自己打的code。
黑色部份為系統生成code。
其它色彩為相對應呼叫的結構。
Sample Code:
開新檔案(3個副程式)
//開啓程式,第一個執行的檔案初始化(只執行一次)
BOOL CColorEyeIDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
//第一次執行時會執行這個
NewOmdData();
return TRUE;
}
//開新檔案的檔案初始化,按「開新檔案」時執行
void CColorEyeIDoc::OnFileNew()
{
// TODO: Add your command handler code here
//開新檔案
SetPathName(" "); //不可以丟空字串,會產生錯誤,看了Source Code才明白
delete f_Omd;
NewOmdData(); //叫新的Omd
UpdateAllViews(NULL); //更新畫面
}
void CColorEyeIDoc::NewOmdData()
{
SetTitle(“新的Omd檔”);
vChain1.clear(); //清空記憶體空間vChain1
f_Omd = new COmdFile1; //新增Omd檔(刪掉會開不了)
}
開啟舊檔(1個副程式)
void CColorEyeIDoc::OnFileOpen()
{
// TODO: Add your command handler code here
CFileDialog aFileDialog (TRUE, NULL, NULL, OFN_SHAREAWARE | OFN_OVERWRITEPROMPT, m_strFilter);
int nID = aFileDialog.DoModal();
if (nID == IDOK)
{
RestructureVector();
if(f_Omd->Open(aFileDialog.GetPathName()))
{
SetPathName(aFileDialog.GetPathName());
SetTitle(aFileDialog.GetFileName());
}
}
UpdateAllViews(NULL);
}
存檔和另存新檔(2個副程式)
void CColorEyeIDoc::OnFileSaveAs()
{
// TODO: Add your command handler code here
CFileDialog fSaveDlg (FALSE, “omd”, “*.omd”, OFN_SHAREAWARE, m_strFilter); //存檔會自己加副檔名
int nID = fSaveDlg.DoModal();
if (nID == IDOK)
{
RestructureVector();
if (f_Omd->Save(fSaveDlg.GetPathName()))
{
SetTitle(fSaveDlg.GetFileName());
SetPathName(fSaveDlg.GetPathName());
}
}
}
void CColorEyeIDoc::OnFileSave()
{
// TODO: Add your command handler code here
if (vChain1.empty()) //若開了新檔
OnFileSaveAs(); //就另存新檔
else
f_Omd->Save(GetPathName());
}
另外將vector放進Omd裡
void CColorEyeIDoc::RestructureVector()
{
if (!vChain2.empty())
{
//在這時
//vChain1是舊的
//vChain2是新的
std::vector<Cartridge>::iterator it2, itX;
//remove & cut
//在新的裡面,比對舊的,代表重覆
//重覆量測去除掉
for (it2 = vChain2.begin(); it2 != vChain2.end(); ++it2)
{
itX = std::remove(vChain1.begin(), vChain1.end(), *it2);
vChain1.erase(itX, vChain1.end());
}
//將舊的掛在新的後面(讓空的放在第一個)
//整串變成舊的那一串
//放回Omd檔
vChain2.insert(vChain2.end(), vChain1.begin(), itX);
vChain1 = vChain2;
}
else if (vChain1.empty())
{
Cartridge x;
vChain1.push_back(x);
}
f_Omd->SetMsrData(vChain1);
}
發表於
tags:
{ WIN32 API/MFC }