对话框中嵌入多视图的一种方法 (视图切换)(研究好久没有研究会)

wei20041010 2010-06-02 10:52:58
发现了一个教程,但是弄了半天都不知道为什么做错,大家帮忙一下,我发现我运行的时候有断言错误,在定义SwitchToView函数CView* pOldActiveView = (CView*)pFrame->GetActiveView();出错,还有一个是野指针的问题:OnInitDialog()函数
((CFrameWnd*)this)->SetActiveView(m_pView1);我就发现这个两个问题,不知道是我操作错了,还是什么,你们帮我看看,谢谢,原文如下:

在MFC的SDI和MDI文档结构中能很方便的嵌入多视图,而有时候则要在对话框中嵌入多视图,下面是方法。


1.插入三个对话框
ID分别为IDD_VIEW1_FORM,IDD_VIEW2_FORM,IDD_VIEW3_FORM,把三个对话框的属性Style设为Child,Border设为None,映射CView1,CView2,CView3分别对应三个对话框,CView1,CView2,CView3都派生自CFormView。
2.在对话框中加入三个成员变量:
CView1 *m_pView1;
CView2 *m_pView2;
CView3 *m_pView3;
3.映射对话框WM_INITDIALOG消息,在OnInitDialog()函数中加入创建视图窗口的代码.
(注意一定要用(CView*)把三个成员变量的类型转换成CView*类型,不然调用的就是CFormView::Create,但是CFromView的Create是protected类型,不能调用)
//create view1
m_pView1 = new CView1;
ASSERT(m_pView1 != NULL);

if (!((CView*)m_pView1)->Create(NULL, NULL, WS_CHILD,
CRect(0, 0, 0, 0), this, NULL, NULL))
{
AfxMessageBox(_T("Create view1 failed"));
return TRUE;
}

m_pView1->ShowWindow(SW_HIDE);
m_pView1->OnInitialUpdate();
//create view2
m_pView2 = new CView2;
ASSERT(m_pView2 != NULL);

if (!((CView*)m_pView2)->Create(NULL, NULL, WS_CHILD,
CRect(0, 0, 0, 0), this, NULL, NULL))
{
AfxMessageBox(_T("Create view2 failed"));
return TRUE;
}

m_pView2->ShowWindow(SW_HIDE);
m_pView2->OnInitialUpdate();
//create view3
m_pView3 = new CView3;
ASSERT(m_pView3 != NULL);

if (!((CView*)m_pView3)->Create(NULL, NULL, WS_CHILD,
CRect(0, 0, 0, 0), this, NULL, NULL))
{
AfxMessageBox(_T("Create view3 failed"));
return TRUE;
}

m_pView3->ShowWindow(SW_HIDE);
m_pView3->OnInitialUpdate();

//move view in the dialog
CRect rect;
GetWindowRect(&rect);
ScreenToClient(rect);
rect.DeflateRect(200, 0, 0, 0);
m_pView1->MoveWindow(&rect);
m_pView2->MoveWindow(&rect);
m_pView3->MoveWindow(&rect);

((CFrameWnd*)this)->SetActiveView(m_pView1);
m_pView1->ShowWindow(SW_SHOW);
m_pView1->SetDlgCtrlID(AFX_IDW_PANE_FIRST); ......

在对话框中按顺序加入三个radio box,在第一个radio box中勾上group选项(三个radio box 靠左边放,注意不要被嵌入的视图覆盖住。

。在映射按钮消息函数中加入SwitchToView函数。(SwitchToView用来切换视图)
void Cxxxxx::OnRadio1()
{
SwitchToView(IDD_VIEW1_FORM);
}

void Cxxxxx::OnRadio2()
{
SwitchToView(IDD_VIEW2_FORM);
}

void Cxxxxx::OnRadio3()
{
SwitchToView(IDD_VIEW3_FORM);
}

SwitchToView的函数定义为:
void Cxxxxx::SwitchToView(UINT uViewID)
{
//the following statement is important!!!
CFrameWnd *pFrame = (CFrameWnd*)this;

//only for debug
ASSERT_VALID(pFrame);
CView *pNewActiveView = NULL;
CView* pOldActiveView = (CView*)pFrame->GetActiveView();

switch(uViewID)
{
case IDD_VIEW1_FORM:
pNewActiveView = m_pView1;
break;
case IDD_VIEW2_FORM:
pNewActiveView = m_pView2;
break;
case IDD_VIEW3_FORM:
pNewActiveView = m_pView3;
break;
default:
AfxMessageBox(_T("invalid view id"));
return;
}

ASSERT(pOldActiveView!=NULL && pNewActiveView!=NULL);

if (pNewActiveView == pOldActiveView)
return;

pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pFrame->SetActiveView(pNewActiveView);

if (pOldActiveView -> IsKindOf(RUNTIME_CLASS(CView1)))
pOldActiveView -> SetDlgCtrlID(IDD_VIEW1_FORM);
else if(pOldActiveView -> IsKindOf(RUNTIME_CLASS(CView2)))
pOldActiveView -> SetDlgCtrlID(IDD_VIEW2_FORM);
else if (pOldActiveView -> IsKindOf(RUNTIME_CLASS(CView3)))
pOldActiveView -> SetDlgCtrlID(IDD_VIEW3_FORM);
//set the identity of current active view
pNewActiveView -> SetDlgCtrlID(AFX_IDW_PANE_FIRST);
}




...全文
671 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
chunyou128 2011-09-16
  • 打赏
  • 举报
回复
http://www.vckbase.com/english/code/splitter/cxysplitter.shtml.htm
firefly3233 2011-09-15
  • 打赏
  • 举报
回复
另外要用new,必须把构造和析构函数放到public里
firefly3233 2011-09-15
  • 打赏
  • 举报
回复
对话框嵌入视图类并不难,关键代码只有几句(测试成功的,我经常用):
	m_pView = new CMyView;
if (!m_pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0,0,0,0), this, AFX_IDW_PANE_FIRST, NULL))
{
EndDialog(IDABORT);
}
CMyDoc* pDoc = new CMyDoc;//不需要DOC类,注释掉
pDoc->AddView(m_pView);//不需要DOC类,注释掉
m_pView->SendMessage(WM_INITIALUPDATE, 0, 0);

不要用SetActiveView(),因为是CFrameWnd的函数,用CDialog盗用这个函数,是会报错的。
切换时只需显示隐藏相应的对象就行了。
wawagua 2011-09-15
  • 打赏
  • 举报
回复
m_pView1 = new CView1;这一句老出错:
error C2248: 'CView1::CView1' : cannot access protected member declared in class 'CView1'
view1.h(20) : see declaration of 'CView1::CView1'
wawagua 2011-09-15
  • 打赏
  • 举报
回复
什么地方有这方面的书可以看,关于FORMVIEW对话框的这个,我也很乱
changhe2005 2011-07-04
  • 打赏
  • 举报
回复
LZ说问题出在SwitchToView这个函数里,我是新手,不太懂原理,做的时候没用这个函数,把OnRadio()函数
void Cxxxxx::OnRadio1()
{
SwitchToView(IDD_VIEW1_FORM);
}

void Cxxxxx::OnRadio2()
{
SwitchToView(IDD_VIEW2_FORM);
}

void Cxxxxx::OnRadio3()
{
SwitchToView(IDD_VIEW3_FORM);
}

改成
void CXXX::OnRadio1()
{
m_pView1->ShowWindow(SW_SHOW);
m_pView1->OnInitialUpdate();
}

void CXXX::OnRadio2()
{
m_pView2->ShowWindow(SW_SHOW);
m_pView2->OnInitialUpdate();
}

void CXXX::OnRadio3()
{
m_pView3->ShowWindow(SW_SHOW);
m_pView3->OnInitialUpdate();
}

程序就可以运行了。
用户 昵称 2010-06-03
  • 打赏
  • 举报
回复
int CConnectScheduleFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CDialogFrame::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CCreateContext ccc;
ccc.m_pNewViewClass = RUNTIME_CLASS( CConnect_Spy_View );
ccc.m_pCurrentDoc = NULL;
ccc.m_pNewDocTemplate = NULL;
ccc.m_pLastView = NULL;
ccc.m_pCurrentFrame = this;

// Because the CFRameWnd needs a window class, we will create
// a new one. I just copied the sample from MSDN Help.
// When using it in your project, you may keep CS_VREDRAW and
// CS_HREDRAW and then throw the other three parameters.
//CString strMyClass = AfxRegisterWndClass( CS_VREDRAW |
// CS_HREDRAW,
// ::LoadCursor( NULL, IDC_ARROW ),
// ( HBRUSH )::GetStockObject( WHITE_BRUSH ),
// ::LoadIcon( NULL, IDI_APPLICATION ) );

m_pView = ( CConnect_Spy_View * )( this->CreateView( &ccc ) );
::SendMessage( m_pView->GetSafeHwnd(), WM_INITIALUPDATE, 0, 0 );

this->SetActiveView( ( CView * )m_pView );
return 0;
}


这样又在frame中加载了一个view,这里是formview,这个view中你想加嵌套再加载一个frame也行,分隔成多个view也行,加载toolbar,状态条等都行。
用户 昵称 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wei20041010 的回复:]
引用 1 楼 jennyvenus 的回复:
对话框中可以很方便的嵌入frame,frame挂多个view也不难。
哦,大侠,那你给小弟弄个看看,我弄这个几天了都不知道什么的。
[/Quote]

俺的程序从网上抄的,这样在dialog中挂了一个frame

int
CCommonScriptDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
{
return -1;
}

// Because the CFRameWnd needs a window class, we will create
// a new one. I just copied the sample from MSDN Help.
// When using it in your project, you may keep CS_VREDRAW and
// CS_HREDRAW and then throw the other three parameters.
CString strMyClass = AfxRegisterWndClass( CS_VREDRAW |
CS_HREDRAW,
::LoadCursor( NULL, IDC_ARROW ),
( HBRUSH )::GetStockObject( WHITE_BRUSH ),
::LoadIcon( NULL, IDI_APPLICATION ) );

// Create the frame window with "this" as the parent
m_pFrame = new CCommonScriptFrame();
m_pFrame->SetID( IDR_TOOLBAR_COMMON_SCRIPT_CN, IDR_TOOLBAR_COMMON_SCRIPT_EN );

m_pFrame->Create( strMyClass, _T( "Common Script Tool View" ) , WS_CHILD,
CRect( 0, 0, 1, 1 ), this );
//m_pFrame->ShowWindow( SW_SHOW );
m_pFrame->MoveWindow( 0, 0, 300, 300 );

return 0;
}
zxdlms 2010-06-03
  • 打赏
  • 举报
回复
为啥一定要用视图呢,你直接在主对话框中显示不同的子窗口就好了。
kados 2010-06-03
  • 打赏
  • 举报
回复
嗯 这个问题也困扰了很久
每次点击菜单栏中的选项都弹出一个对话框 感觉很挫。。
所以希望能直接在主对话框中根据不同的菜单显示不一样的视图。。。
wei20041010 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qimiao77 的回复:]
CFrameWnd 和CDialog都是从Cwnd派生出来的
不能CFrameWnd *pFrame = (CFrameWnd*)this(this指针代表对话框)
因为他们属于不同的类,Cwnd* p=(Cwnd*) this;这样是可以的,因为CDialog是从
Cwnd中派生的!

学编程的时候,不要人家怎么写,你也跟着怎么写,要理解人家的意图!

根据自己的需要去做!

……
[/Quote]CFrameWnd *pFrame = (CFrameWnd*)this 原文作者这样子做的意图是利用CFrameWnd类的GetActiveView()函数来获取当前活动窗口,用SetActiveView()激活新视图,应该是这样子吧……
贪玩的老鼠 2010-06-02
  • 打赏
  • 举报
回复
CFrameWnd 和CDialog都是从Cwnd派生出来的
不能CFrameWnd *pFrame = (CFrameWnd*)this(this指针代表对话框)
因为他们属于不同的类,Cwnd* p=(Cwnd*) this;这样是可以的,因为CDialog是从
Cwnd中派生的!

学编程的时候,不要人家怎么写,你也跟着怎么写,要理解人家的意图!

根据自己的需要去做!

其实你完全没必要做转换操作,直接保存一个CView * m_pNewActiveView
做全局变量,不就可以了吗?
wei20041010 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jennyvenus 的回复:]
对话框中可以很方便的嵌入frame,frame挂多个view也不难。
[/Quote]哦,大侠,那你给小弟弄个看看,我弄这个几天了都不知道什么的。
用户 昵称 2010-06-02
  • 打赏
  • 举报
回复
对话框中可以很方便的嵌入frame,frame挂多个view也不难。
1,pic_open.zip带位图预览的打开文件对话框(4KB)2,bmpdlg.zip一个位图对话框类 (11KB)3,folder.zip只显示文件夹信息的文件对话框(2KB)4,dir_pic.zip文件目录搜集工具对话框(42KB)5,splash.zip通过自己的线程在Splash对话框显示文字(136KB)6,res_dlg.zip大小可调的对话框(21KB)7,splitter.zip可变的分割视图(58KB)8,anicon1.zip在窗口的标题条上显示动画图标演示程序(47KB)9,anicon2.zip在窗口的标题条上显示动画图标(2KB)10,simple.zip一般用途的分隔器类(43KB)11,outlook.zipOutLook风格的分隔条(59KB)12,appbar1.zip实现桌面的工具条(AppBar)(12KB)13,appbar2.zip实现桌面的工具条演示程序(AppBar)(88KB)14,trayicon1.zip屏幕保护托盘图标(SDK版本)(27KB)15,trayicon2.zip屏幕保护托盘图标(MFC版本)(30KB)16,cj60lib.zipMFC扩展界面库(VC6升级版)(936KB)17,devstudio.zipVisual Studio风格的用户界面(132KB)18,explorer.zipVisual Studio风格的用户界面(213KB)19,outlook1.zipOutLook风格的用户界面(134KB)20,Ccaption.zip一组用于定制窗口标题的类(36KB)21,Ccaption2.zip一组用于定制窗口标题的类演示程序(79KB)22,treectrl1.zipDirTreeCtrl--显示文件夹和文件演示程序(56KB)23,treectrl2.zipDirTreeCtrl--显示文件夹和文件(6KB)24,menutip.zip实现菜单的工具提示(33KB)25,menubar1.zipDevStudio样式的泊位菜单条演示程序(不用MSIE)(58KB)26,menubar2.zipDevStudio样式的泊位菜单条(不用MSIE)(27KB)27,propbox1.zip实用的属性列表框(5KB)28,propbox2.zip实用的属性列表框演示程序(25KB)29,cchecklist.zip一个多层次的CCheckListBox(18KB)30,popchild.zip 在Popup和Child窗口之间转化(43KB)31,multitop.zip 一个SDI(单文档界面)的应用,通过File菜单的Create New Frame命令能够创建一个位于顶层的SDI应用,但关闭主应用后其它的窗口也将关闭,程序由Visual C++ 5.0开发(30KB)32,picknew.zip 演示如何注册多文档模板且避免MFC自动产生的"New File Type"对话框,程序由Visual C++ 5.0开发,调用了CDocTemplate::OpenDocumentFile()(49KB)33,listbox1.zip一个类似VisualStudio样式的列表框类(17KB)34,listbox2.zip一个类似VisualStudio样式的列表框类演示程序(50KB)35,custfile.zip 这个例子能够在CFileDialog增加一对按纽,需要使用Visual C++ 6.0(23KB)36,icondlg.zip 这是一个从资源DLL选取图标的对话框(12KB)37,Modal.zip 创建一个模式的窗口(38KB)38,dock_menu.zip 演示如何实现DevStdio的菜单风格,值得研究 COOL(157KB)39,tooltip.zip 可以多行显示的提示条,且颜色可变(32KB)40,ntray.zip 你想知道拨号网络连通后的动态小图标(Tray Icons)是怎么实现的吗?这个例子可以告诉你一切 COOL(17KB)41,w95tray.zip Windows95 Tray Icon的例子(9KB)42,startmenu.exe 修改Start菜单(27KB)43,splits.zip 这个由Visual C++ 5.0开发的程序演示如何管理View的切分窗口,用到了CSplitterWnd::DeleteView()和CSplitterWnd::CreateView()等成员函数(35KB)44,swt.zipDOS下仿WIN95界面及图标编辑器源程序(498k C&ASM 作者:添翼虎)(499KB)45,menutest.zip定制WIN95图形菜单演示程序(12KB)46,toolbar1.zip在ToolBar嵌入CListBox(39KB)47,fromto.zip从一图退到另一图(54KB)48,cj60libsrc.zip界面开发库Cj60Lib的源程序(268KB)49,password.zip 拖动放大镜到密码输入框能得到密码的内容 COOL(15KB)50,ProperWnd.zip 属性页放置在窗口的指定位置(58KB)51,pushpin.zip在属性页的左边加入一个图钉按纽,熟悉Microsoft Developer Stdio的朋友一定很熟悉(16KB)52,apibrow.zip这个例子使用公用控制回调在一个CListView管理CListCtrl控制,这个例子用于分析了一些以逗号为分割符的文本文件,例如在你的\MSDEV\LIB(VC5.0在DevStudio\VC\Lib)目录下的Win32Api.CSV就是这样的文件(16KB)53,scrl.zip这是一个由Visual C++ 5.0开发的基于对话框的应用,它演示如何使用CListCtrl::Scroll()函数,它是CListView的report方式的一个子集(14KB)54,treelist1.zip显示资源管理器风格的目录树结构的例子(64KB)55,list_menu.zip 在ToolBar嵌入CListBox,看起来像图形菜单(39KB)中取出ICON文件,并能将BMP文件转化为ICON,本程序也是个很酷的工具(117KB)58,ctrbars.zip 一个简单的工具条的程序例子(18KB)59,cj60.zip类似于Developer Studio,Explore界面的类库(165KB)60,cj601.zip类似于Developer Studio,Explore界面的类库(95KB)61,cj602.zip类似于Developer Studio,Explore界面的类库(100KB)62,fileNew.zip文件更新事件类演示程序(37KB)63,CfileNew.zip文件更新事件类(4KB)64,outbar.zip类似OutLook左边按钮条的控件(163KB)65,waitdialog.zip等待对话框(22KB)66,coolmenu.zipOffice 97风格菜单实现(298KB)67,dirpk.exe目录选择对话(78KB)68,docktest.zip演示Docking Window(220kb)69,drivevie.zip查看系统安装的驱动器(34kb)70,enhstbar.zip在状态条上显示按钮和进度指示条(88kb)71,fully.zip全屏幕显示窗口例子程序(42kb)72,icondial.zip在对话框内显示图标列表(12kb)73,mfccmd.zip多重Undo/Redo实现(90kb)74,mfcdde.zipDDE实例(53kb)75,splasher.zip启动屏幕程序(47kb)76,toolbar.zip一个工具条的例子(174kb)77,vwrplc32.exe文档视图结构实例(42KB)78,ModalWin.zip一个多文档的例子(1880kb)79,HTMViewer.ziphtml文件浏览器(1870kb)80,picwin.zip给任意窗口添加背景(2KB)81,DynCon.zip动态改变对话框的大小, 对话框的控件相应改变(166KB)82,tabstatus.zip在多文档应用程序的状态条加入子窗口的列表, 使程序的状态条有点像Windows 95的任务条(62KB)83,jpeg.zip操作JPEG的库和源程序(390KB)84,dibimage.zip这个例子功能强大,能够以多种方式处理位图文件,强烈推荐 COOL(112KB)85,voicecmd.zip在你的软件增加语音控制功能COOL(31KB)86,pathDlg.zip能够选择和创建文件夹的对话框(22KB)87,AniDlg.zip想作动态对话框吗?下载一个回去看看吧!(18KB)88,dlgtbar.zip想在对话框实现浮动工具栏吗?这个代码是你的最佳选择。(19KB)89,DlgMenu.zip教你在对话框加入菜单,一学就会。(26KB)90,fold.zip使用相当简单,实现文件夹浏览,里面附带英文说明。(4KB)91,CoolAbout.zip支持滚动文字图象,并可用鼠标操作方向。(26KB)92,FullDlg.zip用这类你可以实现全屏对话框,并且你用它可以切换到运行的其它应用程序。(3KB)93,Colorsrc.zip一个很漂亮的颜色选择类。(157KB)94,TabDialog.zip能将对话框“钉”在屏幕上。(36KB)95,tip_ocx.zip你有没有觉得VC提供的那个Tip of the day控件很简陋?现在好了,Michael Walz带给我们一个Visual Studio那样的界面漂亮的Tip of the day。(26KB)96,PathPic.zip这个类库提供了选择目录的功能,比通用的CFileDialog好多了。(20KB)97,twopanes.zip你有没有想过把通用对话框作为你的窗口的一个View是什么样子的?看看这个例子吧。(9KB)98,bcmenu21.zip可以利用工具条资源,绘制图标菜单。(56KB)99,MENU4_MDI.ZIP可以利用工具条资源,自动绘制图标菜单,MDI版本。(62KB)100,MENU4_SDI.ZIP可以利用工具条资源,自动绘制图标菜单,SDI版本。(61KB)101,toolbar2.zip这个程序演示了如何利用工具栏的新特性,在工具栏的某个按钮加入下拉式的列表。(28KB)102,avi_bar.zip可以在状态栏里加入一个AVI动画。(34KB)103,outlook.zip这个类库使你可以创建象OutLook那样的切分窗口。(59KB)104,cxysplit.zip这是一个可以在DialogBox使用的切分类库。(21KB)105,AutoWnd.zip自动切分一个视图,并且高亮显示具有输入焦点的视图。(31KB)106,MyWnd.zip高亮显示具有输入焦点的视图。(2KB)107,bhagat.zip使用一个简单的函数调用就可以在切分视图动态创建任何类型的新视图。(64KB)108,MSDNWnd.zip这是一个MSDN的切分窗口的例子,虽不怎么样但已经完整展示了切分操作。对于初学者是一个很好的参考。(37KB)109,rulers.zip使用固定大小的切分窗口(上面、左边部分)在视图加入标尺。(就象Photoshop的标尺那样)酷极了。(5KB)110,VisualFx.zip使用固定大小的切分窗口(上面、左边部分)在视图加入标尺。(就象Photoshop的标尺那样)酷极了。(88KB)111,infobar.zip定制了一个与outlook,outlook express相同的信息条。(16KB)112,BCGB.zipBCGControlBar的AppWizard,编译运行之后你在new的时候就可以选择使用BCGControlBar界面风格了。你最好与BCGControlBar一起下载使用。(215KB)113,sizecbar.zip支持浮动窗体的类库,使用它你可以轻松的做出象Visual Studio那样的界面来。(65KB)114,Coolocx.zip所有你能想到的控件一个都不能少,全都是浮动的效果乃至连Windows通用对话框都浮动。(62KB)115,fullscreen.zip让你轻松实现全屏显示的代码,很简单轻易更可上手,告诉你,全屏时你还可以保留工具条。(22KB)116,sys_tray.zip完全封装windows任务栏,使用此类可以轻松操作任务栏图标及其菜单功能。(51KB)117,regester.zip封装有关注册表操作的函数,使你可以轻松添加、删除、修改主键或键值。(2KB)118,bmpdraw.zip可以用bmp文件构造该类,不须在设计时将bmp文件加入到资源去。其它功能多多。(5KB)119,split.zip从可以学习CFile类的使用方法。(39KB)120,strange.zip用VC++实现异形窗口(234KB)121,csh.zip在对话框实现提示条风格的上下文敏感帮助(75KB)122,whfname.zip从窗口句柄得到文件名(6KB)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧