以 Crystal Edit 為例將 MDI 改成 SDI

因為要切割視窗,沒想到 MDI 要切割 MainFrm 實作過程會相當複雜

找了幾篇論壇都說不建議這麼做,那要怎麼辦呢,當下想到的方式是將 Crystal Edit 改成 SDI

再塞到 CSplitterWnd 裡面,最後樣子是出來了,不過竟然無法開新檔案

也就是轉換失敗冏,後來就嘗試了其他的方式,不過還是紀錄一下轉換的過程好了

2013-06-30

 

[實作過程]

1. 先把 ChildFrm.cpp 和 ChildFrm.h 刪掉

2. 修改 Sample.cpp 中的 BOOL CSampleApp::InitInstance();

註解掉下面的程式

// CMultiDocTemplate* pDocTemplate;

// ......

// pMainFrame->UpdateWindow();

改成

CDocument *aDOC;
CSingleDocTemplate *aDocTemplate;

//Create SDI Frame
aDocTemplate = new CSingleDocTemplate(
	       IDR_MAINFRAME,
	       RUNTIME_CLASS(CSampleDoc),
	       RUNTIME_CLASS(CMainFrame),
	       RUNTIME_CLASS(CSampleView));

//Add the SDI Frame to the application object
AddDocTemplate(aDocTemplate);

//Create Document object
aDOC = aDocTemplate->CreateNewDocument();

//Create Frame object
CFrameWnd *Frame = aDocTemplate->CreateNewFrame(aDOC, NULL);

//Create the Application's Frame object 
m_pMainWnd = Frame;
	
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
	
if (!ProcessShellCommand(cmdInfo))
	return FALSE;

//Initial View Object
aDocTemplate->InitialUpdateFrame(Frame, aDOC);

//Show Frame
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();

3. 修改 MainFrm.cpp 和  MainFrm.h 下面這兩行,以及把 CMDIFrameWnd 都改成 CFrameWnd

// IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

//DECLARE_DYNAMIC(CMainFrame)
DECLARE_DYNCREATE(CMainFrame)

這樣應該就可以看到 SDI 架構畫面囉!!