第一篇:总结几种用于DLL资源模块切换的方法
方法一):
AFX_MANAGE_STATE(AfxGetStaticModuleState());//模块切换方法一
CMyDialog dlg;
dlg.DoModal();
方法二):
HINSTANCE Save_hInstance=AfxGetResourceHandle();//模块切换方法二
AfxSetResourceHandle(theApp.m_hInstance);
CMyDialog dlg;
dlg.DoModal();AfxSetResourceHandle(Save_hInstance);//方法二的模块状态还原
方法三):
HMODULE hDLL=GetModuleHandle(“CMyDialog.dll”);HINSTANCE hEXE=AfxGetResourceHandle();//或者用:GetModuleHandle(NULL)获取EXE模块句柄。
AfxSetResourceHandle((HINSTANCE)hDLL);//设定资源模块句柄,指定为DLL模块。
CMyDialog dlg;
dlg.DoModal();
AfxSetResourceHandle(hEXE);//还原到应用程序(EXE)模块。
其它函数:
<<深入浅出MFC>>P283:
HINSTANCE hInst=AfxFindResourceHandle(lpszMenuName,RT_MENU);//lpszMenuName:为一个指定的菜单名。
HMENU hMenu=::LoadMenu(hInst,lpszMenuName);
《VC开发 典型模块大全》P670
HBITMAP m_hBitmap=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(资源ID号));
《模块大全》P661
HMODULE hMod=LoadLibrary(“SkinDll.dll”)
第二篇:MFC规则DLL总结
MFC规则DLL总结
1、创建MFC规则DLL工程,生成XX.h, XX.cpp, XX.def文件,插入资源(对话框),生成类。
2、在XX.cpp 中添加ShowDlg函数,在该函数中定义对话框,显示对话框,对话框所需要的参数由ShowDlg的形参传递。
3、在XX.def中添加:
EXPORTS
;此处可以是显式导出
ShowDlg @14、编译生成XX.dll文件
5、新建测试工程,在需要调用该DLL处,添加类如下代码:
CString strName=_T(“王朋”);
double dScore=89;
HINSTANCE hdll;
typedef void(*dllfun)(CString,double);
dllfun thefunc;
hdll=LoadLibrary(_T(“RegularMFCDLL.dll”));
if(hdll!=NULL)
{
thefunc=(dllfun)GetProcAddress(hdll,“ShowScore”);
}
else
{
AfxMessageBox(_T(“加载DLL失败!”));return;} thefunc(strName,dScore);FreeLibrary(hdll);
6、静态调用
头文件中添加如下代码:
#pragma comment(lib,“RegularMFCDLL.lib”)
extern void ShowScore(CString,double);
在源文件中需要调用该DLL的函数处添加:
CString strName=_T(“王ª?朋¨®”);
double dScore=90;
ShowScore(strName,dScore);
7、可见,窗口等MFC对象是被定义在一个函数中,再导出这个函数来显示这些资源对象的。
第三篇:matlab生成dll方法的心得体会
将MATLAB函数编译成dll 供VC调用的方法
1简介
1.1 MATLAB简介
MATLAB名字是由MATrix和 LABoratory 两词的前三个字母组合而成。是美国新墨西哥大学计算机科学系主任的Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。
经几年的校际流传,在Little的推动下,由Little、Moler、Steve Bangert合作,于1984年成立了MathWorks公司,并把MATLAB正式推向市场。
目前,MATLAB己经成为应用最广泛的科学工程计算软件,它广泛的应用于自动控制、数学运算、信号分析、图象处理、财务分析等各行各业。用MATLAB编写的数学运算及图像处理等程序十分简单,在MATLAB里有大量的MATLAB库函数,包括初等数学函数、线形代数函数、矩阵操作函数、数值计算函数、特殊数学函数、插值函数等等,还可以利用MATLAB的编译工具将m文件方便的转化为CC++语言、可执行程序(exe)、动态连接库文件(dll)、COM组件等等,并可直接供CC++语言调用。
为什么要用VC与MATLAB接口?
既然MATLAB拥有强大的数值计算功能,利用VC与MATLAB接口可以充分发挥它的数值计算功能,并且可以不依赖MATLAB软件运行,在VC下做出漂亮的界面,把复杂的数据处理交给MATLAB去做。
1.2 MATLAB函数编译为dll与VC之间的通讯方式
1、使用自带的MATLAB Compiler
2、使用MATcom工具
3、在MATLAB下做com组件,在VC中调用com组件(出现了点问题,目前还没找到解决方法,这种方法在m文件较大、用matcom、调用math library或使用mcc方式无法实现的时候,推荐使用)2使用Matcom工具
2.1 MATcom简介
MATcom是MATHworks公司推出的第一个由MATLAB到C++的编译开发软件平台,其最新版本为4.5,集成调试编译环境为MIDEVA。
这个软件可厉害了,他生成的exe可执行文件可以在没有安装MATLAB的地方运行,只是需要几个 dll文件而已。如果用MATLAB的Deployment Tool来生成的exe可执行文件,在没有安装MATLAB的机子上运行时需要安装MCR,而MCR现在有200M 多,所以很不方便。
通过MATcom连接MATLAB m文件 有以下三种方法:
(1)经过简单的设置,由MIDEVA将m源文件转换为C/C++,然后添加到VC工程中。
(2)由MIDEVA直接生成EXE文件,然后在VC中通过Shell调用。这种方法简单方便,但运行时出现一个控制台窗口,而且由于VC和MATLAB之间不能交互,通用性差,仅适用于VC调用MATLAB实现图形显示的场合。
(3)通过Visual MATcom工具条,使用Add-in,这种方法提供了MATLAB和VC直接集成的途径,且可快速集成m文件到VC工程中创建独立的C/C++应用程序、C MEX DLL,在调试过程中可以查看矩阵变量的值,可直接修改m源文件而不是修改生成的C/C++文件。
2.2 MATcom的安装
a)安装之前,首先在matlab的安装目录下建立文件夹:MATLAB7.0bintoolboxmatlabgeneral。matcom4.5在安装时需要你输入口令,Matcom4.5的口令为FREE-4.5-1193046-80295111。
b)之后启动MATLAB,运行以下命令: cd c:matcom45 % MATcom的安装路径 diary mpath matlabpath diary off c)复
制%MATcom45%binusertype.dat文件到%VC%CommonMSDev98bin目录。
d)运行Visual C++,并从菜单中选择Tools->Customize->Add-ins and Macro Files,选择Browse,改变文件类型为
Add-in(.dll),选择%MATcom45%binmvcide.dll文件,确定。
e)在Visual C++的开发环境中可以看到一个Visual MATcom工具条,安装成功。
2.3 Matcom的工作原理
Matcom编译.m文件是先将.m文件按照与Matcom的Cpp库的对应关系,翻译为CPP源代码,然后用对应版本的C编译器将该CPP文件编译为exe或dll文件,所以,在第一次运行时让指定C Complier的路径是必需的,否则将无法编译。指定好的C Complier的信息写在Matcom/bin/matcom.ini文件中。但也有不足之处:比如,对struct等类的支持有缺陷,部分绘图语句无法实现或得不到准确图象,尤其是三维图象。
2.4使用Matcom将.m文件翻译为C++文件
a)在MIDEVA下新建一个.m文件
function Test1()x=-10:0.1:10;y=sin(x);plot(x,y);
在matcom安装路径Debug文件夹下将会产生以下文件:
从这里可以看出,MIDEVA己经将.m文件转化成c++代码,放在Test1.cpp中。
b)在VC中用MFC Wizard(exe)创建一个基于对话框名为Example的工程。在面板上添加一个ID为IDC_BUTTON1按扭。
c)将C:matcom45Debug目录下的Test1.cpp文件的内容拷贝到
void CExamleDlg::OnButton1()下;
d)将C:matcom45lib下的matlib.h 和v4501v文件和C:matcom45debug下的Test1.h文件拷贝到工程Example目录下,然后在VC中将库文件和头文件加入到工程中:工程->添加工程->Files,选择刚刚拷贝到Example目录下的matlib.h、v4501v和Test1.h文件。
e)在ExampleDlg.cpp中加入如下代码: #include “matlib.h” #include “Test1.h” f)
2.5使用Matcom工具编译为dll文件供VC调用
在MIDEVA中新建一个.m文件,然后将其编译为.dll文件,新建工程,File->New Project…,设置组件属性,在“Component name”项中填写组件名称“component”,这时候会自动生成类“component”,在“Class name”项中填写类名称“huatu”,为了便于区分,选中“Classes”中的“component”,点击“remove”按钮,将类component移除,再点击“Add>>”添加新类huatu,结果如图5。点击“OK”,接下来出现一个对话框,选择“Yes”.添加文件:选中左边工作区的“huatu”,点击Project->Add File„,选择已经编辑好的函数文件huatu.m,如图所示。需要注意的是m文件必须是m函数,否则会报错,如果是m脚本文件的话,只需要改为无输入输出参数的m函数即可。
生成 com组件:点击Build->COM Object„,在这里出现了点问题,目前还不知道解决办法。使用MATLAB 自带的Matlab Compiler MATLAB Compiler 是MATLAB自带的一个编译器,它能将m文件转化成 C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。Matlab所使用的编译器包括了MATLAB 的CC++数学库函数以及图形库。
必须保证编译器的正确配置,因为编译器使用了CC++库函数,所以在使用前需要使用 mex-setup 和 mbuild-setup两个命令对编译器进行配置。步骤如下:
1.设置Matlab的编译器,使用外部的VC或者gcc等编译器。2.编译m文件成dll 3.设置VC等的继承环境,设置C需要用到的静态库和动态库 4.编写C调用dll 3.1设置Matlab编译器
首先要安装Matlab 编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。3.1.1 编译环境设置
首先设置系统的环境变量,点击“我的电脑”属性-系统特性--高级-环境变量-添加系统变量Matlab值为Matlab的安装路径:G:matlab7.0binwin32,重启电脑即可。
3.1.2 Matlab7.0 编译器设置
(a)为编译后产生的MEX文件进行预配置
运行 Matlab,在 Matlab 的命令窗口(Command Window)键入“ mex-setup ”命令后,按回车键,安装 Matlab 编译器;
(b)为产生独立外部应用程序进行预配置
对Matlab编译器mbuild应用程序进行设置,运行 Matlab,在 Matlab 的命令窗口(Command Window)键入“ mbuild-setup ”命令后,按回车键,安装 Matlab 编译器;
编写 Matlab文件 huatu_test.m,一个很简单的程序,function [X1,Y1]=huatu_test(x1,x2)x=x1:0.1:x2;y=sin(x);X1=rand(1);Y1=rand(1);plot(x,y,X1,Y1,'*');end
3.2 将Matlab函数转成dll函数
在 Matlab的 Command Window /下输入命令: 命令 1 : mcc-W lib:dlltest-T link:lib huatu_test.m 或
命令 2 : mcc-W cpplib: dlltest-T link:lib huatu_test.m 其中,mcc是matlab提供的编译命令(可以理解为gcc),对于这一点,matlab的帮助说明如下:
-W lib:string link:lib 其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的你写的m函数的名字。生成的文件将会保存在当前目录下,默认的当前目录为:MATLAB根目录work,找到dlltest.h、dlltest.lib和dlltest.dll文件,这三个文件是我们需要的。
3.3 M函数文件编译成DLL文件问题解决
1、Warning: No matching builtin function available for C:MATLAB6.5toolboxsimulinksimulinkset_param.bi 解决方法:
1)将 MATLAB6.5toolboxcompilerdeploymatlabrc.m 中的 81行 set_param(0,'PaperType',defaultpaper);82行 set_param(0,'PaperUnits',defaultunits);注释掉,或者干脆删掉。
2)在 Matlab6.5 的命令窗口运行 rehash toolboxcache 3)重新编译文件后即可运行。
2、mbuild –setup的错误
Error: Could not find the compiler “cl”on the DOS path,use mbuild to configure your environment properly.由于VC安装有误而导致此错误,在安装时必须选择默认路径,否则matlab检测不到VC编译器的物理位置 3.4 dll 文件载入
在VC中新建一个名为ceshi基于对话框的工程,在工程中添加一个名为“测试”的button按钮。将dlltest.h、dlltest.lib和dlltest.dll文件拷贝到当前工程目录下,并通过Project->Add To Project->Files 选择拷贝到当前目录下的三个文件,将文件引入工程。
在ceshiDlg.cpp文件中添加头文件dlltest.h #include “dlltest.h” 打开dlltest.h文件,里面有有关函数的定义,找到其中三个函数:
extern mxArray * mlfHuatu_test(void);extern void dlltestInitialize(void);extern void dlltestTerminate(void);
从函数意思不难知道它们的作用,dlltestInitialize用来初始化dll库,dlltestTerminate用来结束调用dll, mlfHuatu_test为主程序执行函数。将三个函数拷贝到button响应代码中,进行修改:
void CCeshiDlg::OnButton1(){ dlltestInitialize();mlfHuatu_test();dlltestTerminate();} 在MATLAB下做com组件,在VC中调用com组件
COM(Component Object Model)组件对象模型,在Matcom里做 COM组件,步骤如下:
1、在matlab command window 输入如下命令:
>> comtool 出现com编辑界面,两种方法比较
其实两种方法大致思路都一样,但是各自都有局限:
用Matlab 自带的Compiler 将.m文件转换成c++代码功能有很多限制:
1、不能转换脚本m文件,只能转换m函数;
2、不能使用matlab对象;
3、不能用input或者eval操作matlab空间变量;
4、不能动态地命名变量,然后用load或者save命令来操作;
5、不能处理具有嵌套调用其他m文件的m文件;
6、不能使用MATLAB内联函数;
另外用Matlab自带的编译器有版本限制,MATLAB6.5的编译器为3.0版本,MATLAB7.0的编译器为4.0版本,4.0版本的编译器对原编译器进行了很多改进,3.0很多方法都不再使用,如果在7.0版本上使用会出现错误。
问题:在VC6.0下怎样调用Matlab7.0下编译生成的dll文件? 问题:在Matcom里生成了dll文件,在VC中该怎样调用它? 问题:在Matlab7.0下生不成dll组件?
第四篇:任务栏里的中英文切换找不到的方法
输入法图标不见了?
使用电脑中,常常有意想不到的事情发生,比如某天你正想写点什么,突然发现,哎,我的输入法图标哪儿去了?怎么办?
如果你用的还是Windows 98、Windows Me的系统,有时输入法图标不见了,一般可以在输入法设置中找回来。依次单击“开始”→“设置”→“控制面板”,打开控制面板,在控制面板中双击“输入法”图标,在弹出的对话框下部,有一个“启动任务栏上的指示器”的选项,看看它前面的选择框内有没有一个对勾,没有就选上,然后用鼠标单击下方的“确定”按钮,输入法图标就会失而复得了。
如果你用的是Windows XP中,输入法图标也会莫名其妙地丢失,但在控制面板中却没有“输入法”,这时可以按以下方法尝试:
方法1:在任务栏单击鼠标右键,弹出快捷菜单,把鼠标移动到“工具栏”上,会弹出子菜单,看看其中的“语言栏”有没有被选中,如果没有选中,单击选中“语言栏”,一般会显示输入法图标。
方法2:依次单击“开始→设置→控制面板”,打开控制面板,在控制面板中单击“日期、时间、语言和区域设置”,单击“语言和区域设置”,弹出“语言和区域设置”对话框,单击“语言”标签,在“文字服务和输入语言”下单击“详细信息”按钮,弹出“文字服务和输入语言”对话框,单击“高级”标签,在“系统配置”下,把“关闭高级文字服务”前面的对号取消(看到下面的注释了没有,选中“会关闭语言栏”),单击“确定”按钮,输入法图标就回来了。
方法3:点“开始→运行”,键入“msconfig”,单击“确定”或回车,运行“系统配置实用程序”,在“启动”里把“Ctfmon.exe”选中,单击“确定”,然后注销或重新启动应该就可以了。这是因为Ctfmon.exe控制Alternative User Input Text Processor(TIP)和Microsoft Office语言条,提供语音识别、手写识别、键盘、翻译和其它用户输入技术的支持。这个程序没有启动也会造成输入法图标不显示。
最后提示一下,没有输入法图标,用快捷键一样可以操作输入法。Ctrl+Space(空格键)是在中、英文输入法之间切换;按Ctrl+Shift组合键可以依次显示系统安装的输入法。
第五篇:MFC视图切换全总结
MFC视图切换全总结
交流的朋友请加我QQ:451072182 我的百度空间:http://hi.baidu.com/%BB%B6stephen/home 单纯视图之间的切换
单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了。我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类;第二是在分割窗格的一个窗格内实行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。
在MFC创建SDI的伊始,MFC默认的视图类是CView,如果CView满足你的需求,可以直接单击finish,如果你不想让CView成为你的默认视图类,你可以在下图这个地方修改。
如果你忘记了修改默认的视图类这也没关系,我们可以在代码中改变: 在App类里面有个函数叫InitInstance(),在这里面有一段代码
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(Cprogram8Doc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CView1));
//这里更改你的默认视图类,注意不要忘记包含头文件哦
if(!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
说完了默认视图类的更改,我们现在进入主题。
1、首先创建你需要切换的视图类,AddClass进入或者创建一个控件然后AddClass创建控件关联类,后者适用于Form之类的控件。
2、控制之处,比如菜单项单击、单击鼠标什么的,我是使用菜单项来切换窗口的
void CMainFrame::OnView1(){
// TODO: Add your command handler code here
SwitchToForm(IDD_FORMVIEW1);}
void CMainFrame::OnView2(){
// TODO: Add your command handler code here
SwitchToForm(IDD_FORMVIEW2);}
3、SwitchToForm这个函数主要用于视图切换 在这个函数中主要做以下几个动作:
1、获得当前视图类指针和需要转换的视图类指针,如果是第一次使用需要New一个,并且与文档类关联;
2、改变活动视图;
3、显示新视图和隐藏旧视图;
4、设置控件ID;
5、调整框架视图。
void CMainFrame::SwitchToForm(int nForm){
CView *pOldActiveView=GetActiveView();
//1
CView *pNewActiveView=(CView*)GetDlgItem(nForm);
if(NULL==pNewActiveView)
{
switch(nForm)
{
case IDD_FORMVIEW1:
pNewActiveView=(CView*)new CView1;
break;
case IDD_FORMVIEW2:
pNewActiveView=(CView*)new CView2;
break;
case IDD_FORMVIEW3:
pNewActiveView=(CView*)new CView3;
break;
case IDD_FORMVIEW4:
pNewActiveView=(CView*)new CView4;
break;
default:
break;
}
CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,WS_CHILD | WS_BORDER,CFrameWnd::rectDefault,this,nForm,&context);
pNewActiveView->UpdateData();
}
SetActiveView(pNewActiveView);
//2
pNewActiveView->ShowWindow(SW_SHOW);
//
3pOldActiveView->ShowWindow(SW_HIDE);
if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView1))
//4
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW1);
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView2))
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW2);
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView3))
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW3);
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView4))
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW4);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();//5 }
在看网上其他人的帖子的时候发现在RecalcLayout();前面还要加一句delete pOldActiveView;我自己觉得这样有些浪费资源,视图类创建完成了隐藏起来,用的时候重新显示。这样的方法应该比每次使用都要创建好一些。小弟不才,有讨论的朋友可以联系我。带有分割窗格的视图切换
切换视图第二层就是带有分割窗格的视图切换
分割窗格的视图切换,我觉得难点是不容易在有限区域进行视图切换。
1、首先分割窗格,这里我不多解释,详情看下面链接;
2、再给每个视图一个唯一的ID号;
m_splitter.CreateStatic(this,1,2);
m_splitter.CreateView(0,0,RUNTIME_CLASS(CTree1),CSize(100,100),pContext);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(100,100),pContext);
CWnd *pWnd=m_splitter.GetPane(0,1);
m_pViews[0]=(CView*)m_splitter.GetPane(0,1);
pWnd->SetDlgCtrlID(IDD_FORM1);
pWnd->ShowWindow(SW_HIDE);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(100,100),pContext);
pWnd=m_splitter.GetPane(0,1);
m_pViews[1]=(CView*)m_splitter.GetPane(0,1);
pWnd->SetDlgCtrlID(m_splitter.IdFromRowCol(0,1));
pWnd->ShowWindow(SW_SHOW);
RedrawWindow();
return true;
注:我这里CreateView一个新视图,就覆盖掉前一个视图,最终显示的是最后一个视图,前面的视图只是隐藏起来,等到使用的时候显示出来就好了。返回值要覆盖返回到基类的语句
return CFrameWndEx::OnCreateClient(lpcs, pContext);将这句话注解,然后return true;
3、在哪里激活切换功能自己设计,我使用的是菜单;
4、响应主要包括下面几个步骤:
1、首先获得窗格中的当前视图;
2、使用IsKindOf判断这个类是否是将要切换到的类;
3、获得框架长宽和窗格长宽;
CView *pView=(CView*)m_splitter.GetPane(0,1);
//1
m_bTest=pView->IsKindOf(RUNTIME_CLASS(CForm2));
//
2CRect rcFrame,rcClient;
//3
m_splitter.GetClientRect(&rcClient);
GetClientRect(&rcFrame);
上面的全部是准备工作,下面才是真正的切换;
4、删除原有视图
5、创建当前视图
6、调整框架
if(m_bTest)
{
m_splitter.DeleteView(0,1);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(rcClient.Width(),rcFrame.Height()),NULL);
m_splitter.RecalcLayout();
}
else
{
m_splitter.DeleteView(0,1);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(rcClient.Width(),rcFrame.Height()),NULL);
m_splitter.RecalcLayout();
}
仔细一看,貌似这个还要比单纯视图切换还要简单一些,这也没办法,CSplitterWnd提供了这么一个便捷的方法。
带分割视图与未分割视图之间的切换
这个是三部曲中我认为最难的,并不是说程序有多么难,只是想到这个切分方式真的不容易,今天就把这三部曲的最后一曲分享给大家,也为互联网做一点贡献。
首先说一下程序的思想,为分割窗口层专门独立创建一个基于CFrameWnd的类,然后在这里面写分割视图的代码,再与其他未分割的视图类进行切换。
下面我们来看一下实现的过程:
1、创建一个基于CFrameWnd的派生类CSplitterFrame;
2、添加要填充分割窗口的视图类和与分割视图切换的视图类;
3、为这个派生类重载OnCreateClient函数,构造分割视图
m_Splitter.CreateStatic(this,1,2);
m_Splitter.CreateView(0,0,RUNTIME_CLASS(CLeftTree),CSize(300,0),pContext);
m_Splitter.CreateView(0,1,RUNTIME_CLASS(CRightList),CSize(300,0),pContext);return true;这里我不解释了,想必大家都很熟悉了,这里我要说一点我自己犯过的错误。我本来想在这里GetClientRect获得窗口大小,但失败了,左思右想不明白,后来才发现,这又不是CMainFrame,所以根本不能获得,要是用API函数。
4、在CMainFrame类里面添加框架和视图类指针变量
CSplitterFrame *m_pSplitterFrame;
//分割视图框架指针
CView *m_pView;
//单独视图类,基于CView类
CView *m_pForm;
//单独视图类,基于CFormView类
int m_nCurrentID;
//记录当前视图
5、在CMainFrame类里面重载OnCreateClient函数,创建视图及分割框架
CRect rcClient;GetClientRect(&rcClient);m_pView=new CViewShow;m_pView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW &~WS_BORDER,rcClient,this,NULL,pContext);m_pView->ShowWindow(SW_SHOW);m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);pContext->m_pNewViewClass=(CRuntimeClass*)m_pView;
//设置默认视图类
m_pForm=new CFormShow;m_pForm->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW &~WS_BORDER,rcClient,this,IDD_FORMSHOW,pContext);m_pForm->ShowWindow(SW_HIDE);m_pSplitterFrame=new CSplitterFrame;m_pSplitterFrame->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW &~WS_BORDER,rcClient,this,NULL,0,pContext);m_pSplitterFrame->ShowWindow(SW_HIDE);return true;
6、创建视图切换函数
bool CMainFrame::Switch(int nID){ if(nID==m_nCurrentID)
return false;switch(nID){ case IDD_FORMSHOW:
m_pForm->ShowWindow(SW_SHOW);
m_pForm->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pView->ShowWindow(SW_HIDE);
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST+2);
m_pSplitterFrame->ShowWindow(SW_HIDE);
m_pSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST+1);
m_nCurrentID=IDD_FORMSHOW;
break;case AFX_IDW_PANE_FIRST+1:
m_pSplitterFrame->ShowWindow(SW_SHOW);
m_pSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pForm->ShowWindow(SW_HIDE);
m_pForm->SetDlgCtrlID(IDD_FORMSHOW);
m_pView->ShowWindow(SW_HIDE);
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST+2);
m_nCurrentID=AFX_IDW_PANE_FIRST+1;
break;case AFX_IDW_PANE_FIRST+2:
m_pView->ShowWindow(SW_SHOW);
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pForm->ShowWindow(SW_HIDE);
m_pForm->SetDlgCtrlID(IDD_FORMSHOW);
m_pSplitterFrame->ShowWindow(SW_HIDE);
m_pSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST+1);
m_nCurrentID=AFX_IDW_PANE_FIRST+2;
break;default:
break;} RecalcLayout();return true;}
7、创建调用方法
void CMainFrame::OnForm(){ // TODO: Add your command handler code here Switch(IDD_FORMSHOW);} void CMainFrame::OnView(){ // TODO: Add your command handler code here Switch(AFX_IDW_PANE_FIRST+2);} void CMainFrame::OnSplitter(){ // TODO: Add your command handler code here Switch(AFX_IDW_PANE_FIRST+1);}