≡≡≡≡≡初学者学习VC++的一点心得≡≡≡≡≡

smartmfc 2009-12-16 11:14:35
作为一个初学者,如何能够迅速掌握VC++?

我的总结是,从框架源代码和官方例子着手。
大家可能会说,MFC那么复杂的框架,初学者如何能够很快掌握?其实不然,现在想想,去看教程和视频才误导了我,看似捷径,实际上绕弯路。

MFC源代码固然复杂,可是原理并不复杂,它体现了一种风格,使用框架库编程的捷径就是充分理解框架库的脾气,感觉你的程序可以和框架库无缝连在一起。

我偶然之间获得了MSC C/C++ 7.0,我花了一个晚上,通读了全部源代码,其实也就十万行规模,甚至还不如我的项目的代码多。MFC最难理解的是动态创建和消息映射,看了源代码,豁然开朗。尤其是消息映射是如何变成了消息循环,这个在wincore.cpp里面有。

看完MFC1.0之后,我又看了MFC 2.5 MFC 3.0的源代码。MFC 3.0最重要的改进是增加了对Doc/View的支持。让人兴奋的是,我发现MFC基类已经处理了很多东西。

MFC4.2源代码太大了,而且架构变化不大,我阅读它的方法是,从最终调用着手,往里面看。MFC的例子代码很多,但是我不建议你去网上搜索一般的代码,而应该关注微软的例子,典型的是WordPad,还有AppWizard生成的代码。

C/C++是一个庞大而且复杂的体系,比如说,字符串,他的处理C语法 char[]、CRT string、STL、MFC CString、OLE的BSTR,有无数种实现,再比如有的调用,API、MFC都可以实现,对于MFC开发,我看到很多代码,虽然也能达成目的,但是代码很不自然,感觉是在“打补丁”。这种代码隐患很大,下面说明:

我举一个例子,我们需要创建一个工具条,有一个功能是在查看菜单下,增加一个菜单,用来切换这个工具栏是否显示。

初学者很喜欢看孙鑫的视频,他怎么说的呢?他说我们增加一个菜单,编写响应代码。
判断工具栏目前状态,如果显示,则隐藏,如果隐藏,则显示。
运行,结果发现工具栏没了,Controlbar容器还在。
好,他说,我们需要reclac layout,搞定了。
把Toolbar拖出来,隐藏了,显示,又不对了,工具栏出现在dock的状态……

很悲哀,这么常用的一个操作,越搞越复杂,而第三方的书籍、源代码往往都是这个思路,不过是有的人多做了一点,bug少一点,有的人少作了一点,bug多一点。

但是看了源代码,就不同了。大家想想,appwizard创建了一个工具栏,它就很完美,你去学别的,为啥不学它呢。
经过研究发现,它是映射到Frame的OnBarCheck和OnUpdateControlBarMenu。

于是我将我的菜单也关联上这个,但是发现不行。。。这是为什么呢?还是看源代码:
CControlBar* CFrameWnd::GetControlBar(UINT nID)
{
if (nID == 0)
return NULL;
POSITION pos = m_listControlBars.GetHeadPosition();
while (pos != NULL)
{
CControlBar* pBar = (CControlBar*)m_listControlBars.GetNext(pos);
ASSERT(pBar != NULL);
if (_AfxGetDlgCtrlID(pBar->m_hWnd) == nID)
{
ASSERT_KINDOF(CControlBar, pBar);
return pBar;
}
}
return NULL;
}

void CFrameWnd::OnUpdateControlBarMenu(CCmdUI* pCmdUI)
{
ASSERT(ID_VIEW_STATUS_BAR == AFX_IDW_STATUS_BAR);
ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);
ASSERT(ID_VIEW_REBAR == AFX_IDW_REBAR);

CControlBar* pBar = GetControlBar(pCmdUI->m_nID);
if (pBar != NULL)
{
pCmdUI->SetCheck((pBar->GetStyle() & WS_VISIBLE) != 0);
return;
}
pCmdUI->ContinueRouting();
}

BOOL CFrameWnd::OnBarCheck(UINT nID)
{
ASSERT(ID_VIEW_STATUS_BAR == AFX_IDW_STATUS_BAR);
ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);
ASSERT(ID_VIEW_REBAR == AFX_IDW_REBAR);

CControlBar* pBar = GetControlBar(nID);
if (pBar != NULL)
{
ShowControlBar(pBar, (pBar->GetStyle() & WS_VISIBLE) == 0, FALSE);
return TRUE;
}
return FALSE;
}
看到没有,需要一个nID,那么这个nID是什么呢?
看ToolBar的源代码知道,在创建Toolbar的CreateToolbarEx里面,可以绑定这个Menu的ID。

这样,不多写一行代码,搞定,而且和系统的完全一致。

呵呵,我是初学者,本文只代表我个人观点,欢迎排砖。
...全文
3338 195 打赏 收藏 转发到动态 举报
写回复
用AI写文章
195 条回复
切换为时间正序
请发表友善的回复…
发表回复
cl383804490 2009-12-22
  • 打赏
  • 举报
回复
不错哦
Davinli 2009-12-21
  • 打赏
  • 举报
回复
你这初学者也太不初啦!
百事烟 2009-12-21
  • 打赏
  • 举报
回复
jf
实达诚实 2009-12-21
  • 打赏
  • 举报
回复
初学者???
tigercopy 2009-12-21
  • 打赏
  • 举报
回复
我认为初学者,看是一方面,关键在于实践,原来小时候说过,读十遍不如手写一遍。
nature19862001 2009-12-20
  • 打赏
  • 举报
回复
...
zsdzzzy 2009-12-18
  • 打赏
  • 举报
回复
路过
yuanjzh 2009-12-17
  • 打赏
  • 举报
回复
杯具
syq13 2009-12-17
  • 打赏
  • 举报
回复
楼主 应该是有很深厚的 编程能力,只是没学习MFC的“初学者”吧,不是一般意义上的大众初学者。
kbcsy 2009-12-17
  • 打赏
  • 举报
回复
很强大,学习
tencat 2009-12-17
  • 打赏
  • 举报
回复
给楼主点建议。
MFC是个C++ 界面库, 它是封装的win32 API, 最核心的还是win32 API.
MFC 封装得是比较晦涩的。 框架复杂和庞大。 不要以为把这个复杂的庞大的框架搞
明白了就是高手,它只是封装win32 API而已。熟悉了win32 API和消息循环机制,完全可以不用MFC这个框架。既然MFC复杂庞大,学习和使用又麻烦,何不找替代品?
在VC里,还可以用ATL/WTL, WTL同样是对win32 API的 C++封装。 却精妙得多。
不管是MFC也好,WTL也好,在windows操作系统眼里,都是调用的SDK, 没什么区别。
在程序员眼里,WTL给你的是发散的思维,MFC是固化的DOC/view思维模式。
你可以去搜搜,对比和关注下WTL。
wintershu 2009-12-17
  • 打赏
  • 举报
回复
过分谦虚就是过于骄傲
xgwzw0011 2009-12-17
  • 打赏
  • 举报
回复
不知道说啥
lllyyy2403 2009-12-17
  • 打赏
  • 举报
回复
大家别争了,其实LZ和各位都没有错,错的是各人对“初学者”这个词的理解错了。大家认为“初学者”是初学编程的人,但LZ显然不是初学编程的人,而是有一定项目经验的VC的“初学者”。我也曾经在VC上摔交过,差点把一个大项目给砸了,我的看法是VC不适合一些没有编程经验又没有编码天赋的人学习。如果你符合以下全部的4个条件:1、没有编程经验;2、没有编码天赋;3、项目开发不允许拖延达到3年时间;4、没有成熟的VC程序员现场指导。建议你最好不要把VC作为你的目前项目的程序语言,否则你将会尝到失败的滋味。
  • 打赏
  • 举报
回复
楼主大侠 超级牛啊!

崇拜如 滔滔江水、连绵不绝!!!
fgkenshin 2009-12-17
  • 打赏
  • 举报
回复
看来我已经杯具了,居然连初学者都不是
LPR_Pro 2009-12-17
  • 打赏
  • 举报
回复
UP
j2se1022 2009-12-17
  • 打赏
  • 举报
回复
不错的资源 ,谢谢 !!!
ffffssd 2009-12-17
  • 打赏
  • 举报
回复
......
心留 2009-12-17
  • 打赏
  • 举报
回复
看了楼主,我才知道什么叫初学者!汗颜呀
加载更多回复(175)

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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