荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Deny (孤苦伶仃一个人,哈哈), 信区: Program
标  题: 『VC++技术内幕』学习笔记(2?
发信站: 荔园晨风BBS站 (Tue Dec 25 19:56:46 2001), 转信

正文
『VC++技术内幕』学习笔记(2)
雷神

第二篇:Microsoft基本类库应用程序框架
◎MFC是C++的Microsoft Windows API,如果想要开发WINDOWS的应用程序当然
VC/MFC是开发环境的首选。
◎MFC产生的应用程序使用了标准化的结构。(我现在还体会不出这点的优势所在
,请高手指点)
◎MFC产生的应用程序短而运行速度快。这应该说的是可以很容易的建立动态连接
,其实程序还是需要大量的DLL,不过由于WINDOWS上有很多

可以用DLL所以应用程序很短,我是这样想的不知对否。
◎VC++工具降低了编码的复杂性。这点不容质疑比起TC方便太多了。
◎MFC库功能非常丰富。书上列出了MFC从1.0--4.21的一些特性,我就不废话了,
大家应该看看。
这一章节主要介绍了MFC库的优点,其实我本人认为在某些特定环境下其实MFC不一
定就象说的那样好。我想不会有人用纯VC做MIS系统吧,太累

了。我是这样理解编程序的,如果把学编程看成学武的话,C/C++语言及编程思想
(OOP)是内功,API是基本功(编程思想是内功、API是基本功

这适用于任何WIN32编程,不论Visual C++、Delphi、C++Builder、VB......),
VC/MFC应该不同武功其中的一种,不同的学习方法效果不一样,

只要下工夫也都可以达到一定的境界。真正的高手是有着深厚的内功,扎实的基本
功,至于武功招数无所谓了,随便一站不丁不八全无破绽,无招

胜有招了。对不住扯远了。

C++可以通过类库来进行扩展,我们除了可以使用随编译器提供的类库外还可以很
方便使用软件公司销售的类库产品,甚至可以自己开发。而应用

程序框架是一种类库的超集,它定义了程序的结构。
下面给出两个示例程序(一个是书上的一个是我写的):
雷神建议:虽然现在很多书都附CD,CD上有书中所有示例的源代码,但还是应该亲
自在VC6用手敲进去。这样可以加深印象以及感受一下编译除

错后程序正确运行时的乐趣,因为是纯手工打造。自从我敲了近一百个代码示例后
,由于笔误的BUG就很少了,打字速度也提高了。而且最好在原

示例代码的基础上做些改动例如别千篇一律的显示HELLO WORLD!换点别的,这样
做也可以加深对示例程序的理解。
我的HELLO WORLD用AppWizard向导创建一个显示一个字符串的单文档程序,只需要
敲入一行语句,主要是体验MFC的强大功能。
1、打开VC++6从菜单选择NEW,给项目命名为”MyApp01“。
2、选择MFC AppWizard[exe] 选项,除STEP 1选择单文档外其他STEP缺省。
3、在Class View选择CMyApp01View类的OnDraw()成员函数双击会在C++编译器看到
以下内容

void CMyApp01View::OnDraw(CDC* pDC)
{
    CMyApp01Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
}
在    // TODO: add draw code for native data here的位置增加一行代码
void CMyApp01View::OnDraw(CDC* pDC)
{
    CMyApp01Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    pDC->TextOut(10,10,"雷神愿意和所有学VC的朋友共同进步!");
//<-----------增加的一行
    // TODO: add draw code for native data here
}
完了,就这么简单。编译运行。看到了吗?这个程序具备WINDOWS程序的所有特性
,例如有菜单、工具条、状态栏、最大化、关闭、甚至还有关

于对话框、打印预览.....全了,这就是AppWizard通过MFC动态创建的一个应用程
序。从这个小例子可以看出用VC/MFC设计WINDOWS程序多么方

便。下面我们看看书上的例子,以便更进一步了解应用程序框架。

书上的例子:
1、先建立一个Win32 Application的应用程序。
2、选择Project->Add to project->Files,分别创建一个名为MyApp.h和一个名为
MyApp.cpp的文件。
3、添加代码:(最好照敲以下代码到编译器,别用Ctrl+C/Ctrl+V)
//***********************************************
//  MyApp.h
//

class CMyApp:public CWinApp  //见下②
{
public:
    virtual BOOL InitInstance();
};

class CMyFrame:public CFrameWnd
{
public:
    CMyFrame();
protected:
    afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
    afx_msg void OnPaint();
    DECLARE_MESSAGE_MAP()
};

//*****************************************************
//  MyApp.cpp
//

#include "afxwin.h"
#include "myapp.h"
CMyApp theApp;//建立一个CMyAPP对象见下②

BOOL CMyApp::InitInstance ()
{
    m_pMainWnd=new CMyFrame();
    m_pMainWnd->ShowWindow (m_nCmdShow);
    m_pMainWnd->UpdateWindow ();
    return TRUE;
}

BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)
    ON_WM_LBUTTONDOWN()
    ON_WM_PAINT()
END_MESSAGE_MAP()

CMyFrame::CMyFrame(){
    Create(NULL,"MYAPP Application");
}
void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point)
{
    TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d\n",
    (long)nFlags,point.x ,point.y);
}

void CMyFrame::OnPaint ()
{
    CPaintDC dc(this);
    dc.TextOut (0,0,"Hello World!");
}

4、编译运行,报错。为什么呢?原来还没有添加MFC的支持,在Project Setting
选项General属性页选择”Use MFC in a Static Library"
5、再Ctrl+F5,哈成功了。
让我们看看这个程序中的一些元素。
①WinMain函数:并非不存在只是已经被隐藏在应用程序框架内部。
②CMyApp类:CMyApp类的对象代表一个应用程序,CWinApp基类决定它的大部分行
为。
③应用程序的启动:当开始运行应用程序时WINDOWS会调用WinMain函数,WinMain
会查找该应用程序的全局对象theApp。
④CMyApp::InitInstance成员函数:发现theApp后自动调用重载的虚函数
InitInstance来完成主窗口的构造和显示工作。记住这个函数。
⑤CWinApp::Run成员函数:WinMain在调用InitInstance之后紧接着调用Run函数,
它被隐藏在基类中负责传递应用程序的消息给相映的窗口。(

我把它理解为好象SDK的窗口的过程函数不知对不对)
⑥CMyFrame类:此类的对象代表着应用程序的主窗口。它的构造函数调用基类
CFrameWnd的Create函数创建具体的窗口结构。
⑦CMyFrame::OnLButtonDown函数:演示消息处理机制,当鼠标坐键被按下这一事
件被映射到CMyFrame的OnLButtonDown函数上,如果你选择

F5进行编译运行的话可以在调试窗口看到TRACE宏显示的类似下面的信息
    Entering CMyFrame::OnLButtonDown - 1,309,119
    Entering CMyFrame::OnLButtonDown - 1,408,221
⑧CMyFrame::OnPaint函数:应用程序每次重新绘制窗口都需要调用此函数,将显
示"Hello World!"放在这里是因为每次窗口发生变化时保证"Hello

World!"被显示,你可以试着将语句:
    CPaintDC dc(this);
    dc.TextOut (0,0,"Hello World!");
写在别出,例如写在
void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point)
{
    TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d\n",
    (long)nFlags,point.x ,point.y);
    CPaintDC dc(this);
    dc.TextOut (0,0,"Hello World!");
}
运行后当点击左键时显示"Hello World!",但当窗口最小化再最大化时"Hello
World!"不见了。
⑧关闭应用程序:用户关闭应用程序时会有一系列事件发生。首先CMyFrame对象被
删除,然后退出Run,进而退出WinMain,最后删除CMyApp

对象。
通过上面的示例我们看见程序的大部分功能包含在基类CWinApp和CFrameWnd中,我
们只写了很少的函数,便可以完成很复杂的功能。所以应用

程序框架不仅仅是一种类库,它还定义了应用程序的结构,除了基类外还包括
WinMain函数,以及用来支持消息处理、诊断、DLL、等都包含在应

用程序框架中。
(未完待续)
下一篇:消息映射和视图类
正文完


--
          o o o o o . . . .
        o      _____              ┏━━━┓    ◇◆ 不管路有多长,心有多远
      .][__n_n_|OO[  ====____     ┃ 情缘 ┃    ◇◆ 不管爱有多难,情有多伤
     >(________|__|_[________]    ┗━━━┛    ◇◆ 始终等你
   _//oo |-OOOO oo'  oo    oo                   ◇◆ 在这生命的驿站
   --+--+--+--+--+--+--+--+--+--+--+--++--+--+--+--+--+--+--+--+--+--+--+--

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.201]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店