找到App类的InitInstance方法,该方法代表了windows应用程序在启动时的初始化任务。用命令行信息类CCommandLineInfo修改程序启动时的命令实现。
// 分析标准 shell 命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
// ParseCommandLine(cmdInfo);
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
2、MDI启动时子窗口最大化
要修改子窗口的风格,在CChildFrame类的PreCreateWindow函数中实现函数原型为
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
参数cs是要创建窗口的结构信息,对cs进行修改即可。在MDI中cs.style的默认值为WS_CHILD|FWS_ADDTOTITLE|WS_OVERLAPPEDWINDOW。修改方法如下
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
if( !CMDIChildWnd::PreCreateWindow(cs) )
return FALSE;
cs.style = cs.style | WS_MAXIMIZE | WS_VISIBLE; //MDI启动时窗口最大化
return TRUE;
}
3、MDI启动时主窗口最大化
找到App类的InitInstance函数,修改以下信息
// 主窗口已初始化,因此显示它并对其进行更新
// pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->ShowWindow(SW_MAXIMIZE);
pMainFrame->UpdateWindow();
4、创建带滚动条的窗体
可以通过修改窗体创建时的style值实现,但实际上MFC有一个继承自CView类的CSrcollView类可以方便的实现带滚动条的窗口。
首先在View.h和View.cpp文件中Ctrl+H将CView全部替换成CScrollView。
然后修改View类的OnInitialUpdate函数,没有的话打开类向导添加这个函数。
在打开图像时也可以继续重载CalWindowRect和OnActivateView使图像适合视图窗口
CalWindowsRect 基于工作区的大小计算窗口大小
GetDocSize是从图像中获得的大小
void CDIPDemoView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sz;
sz.cx = sz.cy = 1000; //设置滚动条的大小
SetScrollSizes(MM_TEXT, sz);
}
void CDIPDemoView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
}
void CDIPDemoView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
CScrollView::OnInitialUpdate();
ASSERT(GetDocument() != NULL);
SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
}
void CDIPDemoView::OnActivateView(BOOL bActivate, CView* pActivateView,
CView* pDeactiveView)
{
CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
if (bActivate)
{
ASSERT(pActivateView == this);
Invalidate(); //激活该视图时进行重绘
}
}
5、重载OnOpenDocument时改变对话框过滤后缀名
其实这点原理也没搞得太懂,就是在MDI程序中对FileOpen添加消息处理函数时,用这种方法并不能打开多个文件,而实际上OnOpenDocument函数已经实现了多文档打开,但是打开对话框上只能显示如下
自己写CFileDialog改变参数不起作用。
后来找到方法就是修改.rc的stringtable中的IDR_XXXTYPE宏,XXX是工程名
stringtable有三项 ID 值 标题
IDR_XXXTYPE的标题是\nXXX\nXXX\n\n\nXXX.Document\nXXX.Document
再第3个\n添加显示文本,在第4个\n添加后缀名即可。
比如\nXXX\nXXX\n文本文档(*.txt)\n.txt\nXXX.Document\nXXX.Document
后来查了下发现其实关键还是在App::InitInstance()里
找到
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_BMPTYPE,
RUNTIME_CLASS(CDIPDemoDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CDIPDemoView));
IDR_BMPTYPE是在stringtable里新建的一个对象,对应标题为\nXXX\nXXX\nBMP图像(*.bmp)\n.bmp\nXXX.Document\nXXX.Document
原理部分不是弄得很清楚,找时间看看《深入浅出MFC》
此处见http://hi.baidu.com/ecoiboblpwbijye/item/dd05129bab4375f028164733