VC主要内容 h.docx
《VC主要内容 h.docx》由会员分享,可在线阅读,更多相关《VC主要内容 h.docx(18页珍藏版)》请在冰豆网上搜索。
VC主要内容h
孙鑫
第3章:
了解MFC框架中入口函数、窗口创建、注册、显示和更新。
MFC框架中的入口函数WinMain函数是在程序编译链接的,由链接器将该函数链接到程序中。
当程序调用了CWinApp类的构造函数,并执行了CTestApp类的构造函数,且产生了theApp对象之后,接下来就进入WinMain函数.WinMain函数实际上是通过调用AfxWinMain函数来完成它的功能的。
CWinThread*pThread=AfxGetThread();
CWinApp*pApp=AfxGetApp();
If(pApp!
=NULL&&!
pApp->InitApplication())
If(!
pThread->InitInstance())
nReturnCode=pThread->();消息循环
完成了Win32程序所需要的几个步骤:
设计窗口类、注册窗口类、创建窗口、显示窗口、更新窗口、消息循环,以及窗口过程函数。
MFC框架中窗口类的注册是由AfxEndDeferRegisterClass函数完成的,该函数的定义位于WINCORE.CPP文件中。
在MFC程序中,窗口的创建是由CWnd类的CreateEx函数实现的,该函数的声明位于AFXWin.h文件中。
m_pMainWnd->ShowWindow(SW_SHOW);显示应用程序框架窗口
m_pMainWnd->UpdateWindow();更新窗口
CWinThread类的Run函数完成消息循环,该函数的定义位于THRDCORE.CPP文件中,在AfxWinMain函数中调用的,调用形式:
pThread->Run();
窗口过程函数:
wndcls.lpfnWndProc=DefWindowProc;
第4章:
1、如何删除通过类向导添加的消息响应函数?
在ClassView选项卡上用鼠标右键单击要删除的函数名,在弹出的快捷菜单中选择【Delete】菜单命令,系统会提示用户是否确认此操作,用户做出肯定应答后,VC++就会把头文件和源文件中所以与次函数相关的信息全部删除。
2、MFC的消息映射机制(函数声明、消息映射宏、函数定义共三处)。
函数声明:
{{AFX_MSG(CDrawView)
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);}}AFX_MSG
消息映射宏:
{{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN();}}AFX_MSG_MAP
函数定义:
voidCDrawView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
MFC消息映射机制的具体实现方法是:
在每个能接受和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表。
在消息映射表中,消息与对应的消息处理函数指针是成对出现的。
某个类能处理的所以消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。
党有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可以知道该类是否能处理此消息。
如果能处理该消息,则同样按照静态表能很容易找到并调用对应的消息处理函数。
3、掌握划线的方法。
利用SDK全局函数实现画线功能:
为了进行绘图操作,必须得获得一个设备描述表(DC),因此得先定义一个人HDC类型的变量:
hdc,接着调用全局函数GetDC获得当前窗口的设备描述表。
画线操作:
首先调用MoveToEx函数将当前位置移动到需绘制的线条的起点处。
该函数有四个参数,其中第一个参数是设备描述表的句柄;第二个和第三个参数分别是新位置处的X坐标和Y坐标;第四个参数是指向POINT结构体的指针,用于保存移动操作前鼠标的位置坐标。
接着调用LineTo函数绘制一条到指定点的线。
该函数有三个参数,其中第一个参数是设备描述表的句柄,第二个和第三个参数分别是线条终点的X坐标和Y坐标。
最后调用函数ReleaseDC来释放设备描述表资源。
利用MFC的CDC类实现画线功能:
首先需要定义一个CDC类型的指针,并利用CWnd类的成员函数GetDC获得当前窗口的设备描述表对象的指针;接着利用CDC类的成员函数MoveTo和LineTo完成画线操作;最后调用CWnd类的成员函数ReleaseDC来释放设备描述表资源。
利用MFC的CClientDC类实现画线功能:
当一个CClientDC对象在构造时,它在内部会调用GetDC函数,获得一个设备描述对象;在这个CClientDC对象析构时,会自动释放这个设备描述表资源。
这样的话,程序中如果使用CClientDC类型定义DC对象,就不需要显示的调用GetDC函数和ReleaseDC函数了。
只需要定义一个CClientDC对象,然后就可以利用该对象提供的函数进行绘图操作了。
当该对象的生命周期结束时,会自动释放其所占用的设备资源。
利用MFC的CWindowDC类实现画线功能:
利用CWindowDC对象绘图时,不需要显示的调用GetDC和ReleaseDC函数,该对象会自动获取和释放设备描述表资源。
在程序中,当构造一个GDI对象后,该对象不会立即生效,必须选入设备描述表,它才会在以后的绘制操作中生效。
一般情况下,在完成绘图操作后,都要利用SelectObject函数把先前的GDU对象选入设备描述表,以便使其恢复到先前的状态。
画笔的宽度要小于1,虚线线型才有效。
4、位图画刷、连续线条绘制。
创建CBitmap对象时,仅调用其构造函数并不能得到一个有用的位图对象,还需要调用一个初始化函数来初始化这个位图对象。
CBitmap类提供多个初始化函数,例如,LoadBitmap、CreateBitmap、CreateBitmapIndirect等。
(利用多种方法创建位图资源)
创建位图画刷:
静态成员函数和静态成员变量属于类本身,在类加载的时候,即为它们分配了空间,所以可以通过类名:
:
函数名或类名:
变量名来访问。
而非静态成员函数和非静态成员属于对象的方法和数据,也就是应该首先产生类的对象,然后通过类的对象去引用。
在静态成员函数中是不能调用非静态成员的,包括非静态成员函数和非静态成员变量。
静态成员函数只能访问静态成员变量。
绘制连续线条:
首先需要得到线条的起点,然后需要捕获鼠标移动过程中的每一个点,这可以通过捕获鼠标移动消息(WM_MOUSEMOVE)来实现。
在此消息相应函数中,在依次捕获到的各个点之间绘制一条条非常短的线路,从而就可以绘制出一条连续的线条。
然后在OnMouseMove函数中首先对m_bDraw变量进行判断,如果其值为真,说明鼠标左键已经按下去了,这时就可以开始进行画线操作。
还有点需要注意,因为每绘制一条线段后,下次应该从这条线段的终点开始继续绘制。
因此,绘制完当前线段后,应该修改线段的起点,将当前线段的终点最为下一条线段的起点。
第5章
1、创建文本、位图插入符。
在文本处理程序的编辑窗口中都有一条闪烁的竖线,将之称为插入符。
插入符可以用于提示用户:
你输入的文字信息将在这个插入符所在的位置显示出来。
创建文本插入符:
在程序中想要创建插入符,可以利用CWnd类的CreateSolidCaret()函数来完成,该函数的原型声明如下:
VoidCreateSolidCaret(intnWidth,intnHeight);
在创建视类窗口后创建插入符,可以在在WM_CREATE消息的相应函数OnCreate中添加创建插入符的代码。
MFCAppWizard所生成的CTextView类中没有OnCreate,我们需要手动添加。
为CTextView类添加WM_CREATE消息的相应函数OnCreate,然后在此函数中创建一个宽度为20、高度为100的插入符,
最后必须调用ShowCaret函数来显示该插入符。
ShowCaret();
创建位图插入符:
利用函数CreatCaret来实现
voidCreatCaret(CBitmap*pBitmap);
此函数有一个参数,要求是CBitmap指针类型。
在使用这个函数之前,要先构造一个CBitmap对象,并利用CBitmap的成员函数初始化位图对象。
Bitmap对象是一个局部变量,为此,我们应该将这个局部位图对象修改为CTextView类的成员变量。
2、输入字符编程。
第6章
1、菜单资源编辑器创建菜单和其消息响应过程。
Windows程序图形界面的三个主要元素:
菜单栏、工具栏和状态栏。
响应过程:
响应菜单项命令的顺序依次是:
视类、文档类、框架类、应用程序类。
2、WINDOWS消息分类。
标准消息:
除WM_COMMAND之外,所有以WM_开头的消息都是标准消息。
从CWnd派生的类,都可以接收这类消息
命令消息:
来自菜单、加速键或工具栏按钮的消息。
这类消息都以WM_COMMAND形式呈现。
在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
从CCmdTarget派生的类,都可以接收到这类消息。
通告消息:
由控件产生的消息。
这类消息都以WM_COMMAND形式呈现。
从CCmdTarget派生的类,都可以接收到这类消息。
凡是从CWnd派生的类,它们既可以接收标准消息,也可以接收命令消息和通告消息。
而对于那些从CCmdTarget派生的类,则只能接收命令消息和通告消息。
3、命令消息路由。
P168
菜单命令消息路由的具体过程:
当单击某个菜单项时,最先接收到这个菜单命令消息的是框架类。
框架类将把接收到的这个消息交给它的子窗口,即视类,由视类首先进行处理。
视类首先根据命令消息映射机制查找自身是否对此消息进行了响应,如果响应了,就调用相应响应函数对这个消息进行处理,消息路由过程结束;如果视类没有对此类命令消息做出响应,就交由文档类,文档类同样查找自身是否对菜单命令进行了响应,如果响应了就由文档类的命令消息响应函数进行处理,路由过程结束。
如果文档类也未做出响应,就把这个命令消息交还给视类,后者又把该消息交还给框架类。
框架类查看自己是否对这个命令消息进行了响应,如果它也没有做出响应,就把这个菜单命令消息交给应用程序类,由后者来进行处理。
4、菜单基本操作(标记、默认【菜单项以粗体形式显示】一个子菜单只有一个默认菜单项、图形标记、禁用、移除和装载、快捷菜单)。
5、动态菜单操作(添加、插入、删除等相关函数)。
添加:
AppendMenu函数声明
BOOLAppendMenu(UINTnFlags,UNIT_PTRnIDNewItem=0,LPCTSTRlpszNewItem=NULL);
为了添加菜单,首先需要创建一个菜单对象,这可以利用CMenu类提供的另一个成员函数:
CreatePopupMenu来实现。
这个函数的作用是创建一个弹出菜单。
插入:
利用CMenu类的InsertMenu成员函数来实现,声明如下:
BOOLInsertMenu(NINTnPosition,UINTnFlags,UNIT_PTRnIDNewItem=0,LPCTSTRlpszNewItem=NULL);
删除:
利用CMenu类提供的DeleteMenu成员函数,声明如下:
BOOLDeleteMenu(NINTnPosition,UINTnFlags);
第7章
1、对话框种类和区别。
种类:
模态和非模态对话框
模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中的其他任务。
当非模态对话框显示时,允许转而执行程序中的其他任务,而不用关闭这个对话框。
2、两类对话框的创建和显示。
创建模态对话框需要调用CDialog类的成员函数:
DoModal,该函数的功能就是创建并显示一个模态对话框,其返回值将作为CDialog类的另一个成员函数:
EndDialog的参数,后者的功能就是关闭模态对话框。
VoidCMyboleView:
:
OnDialog()
{CTestDlgdlg;
Dlg.DoModal();}
创建非模态对话框则需要利用CDialog类的Create成员函数。
该函数两种形式的声明:
BOOLCreate(LPCTSTRlpszTemplateName,CWnd*pParentWnd=NULL);
BOOLCreate(UNITnIDtemplate,CWnd*pParentWnd=NULL);
实现非模态对话框创建的程序:
VoidCMyboleView:
:
OnDialog()
{CTestDlg*pDlg=newCTestDlg;
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);}
3、控件调整。
P311
4、编辑框控件编程,对话框控件与类成员变量的关联。
第一种方式:
利用GetWindowText函数和SetWindowText函数来实现
第二种方式:
利用函数GetDlgItemText(将返回对话框中指定ID的控件上的文本)和SetDlgItemText(用来设置对话框中指定ID的控件上的文本)。
第三种方式:
利用函数:
GetDlgItemInt(返回指定控件的文本,并将其转换为一个整形数值)和SetDlgItemInt(用指定的数值来设置特定控件的文本)
第四种方式:
在DoDataExchange函数内部实现了对话框控件与类成员变量的关联
或者:
利用关联变量直接进行编程:
第五种方式:
在第四种方式上增加三个CEdit类型的空间变量
利用这些控件变量调用GetWindowText和SetWindowText这两个函数来获取和设置编辑框的文本。
第六种方式:
利用PlatformSDK的SendMessage函数,通过发送WM_GETTEXT消息获取前两个编辑框控件的文本,接着将它们转换为相应的数值并完成加法计算,然后将结果转换为相应的字符串,最后再发送WM_SETTEXT消息,用得到的结果字符串设置第三个编辑框文本的实现代码。
第七种方式:
使用函数SendDlgItemMessage直接给对话框的子控件发送消息。
声明形式:
总结七种方式:
第9章
1、修改应用程序窗口外观(创建窗口之前和之后)。
创建窗口之前:
修改窗口的外观和大小,我们只需要修改CREATETRUCT结构体中的cx和cy成员变量的值就可以了。
修改应用程序窗口的标题,则可以通过修改CREATETRUCT结构体中的lpszName成员的值来实现。
Cs.style&=~FWS_ADDTOTTLE;
Cs.lpsName=“标题名“;
在窗口创建之后:
利用函数SetWindowLong,为了改变窗口的类型,该函数的第二个参数应指定为GWL_STYLE,第三个参数应指定新的窗口类型。
当修改窗口外观时,如果实在已有类型的基础上进行一些修改的话,那么先要获得这个窗口的现有类型,这可以利用GetWindowLong这个函数来实现,该函数的作用是获取指定窗口的信息,声明如下:
第一个参数是想要获取其信息的窗口的句柄,第二个参数指定要获取的信息类型。
2、修改窗口的光标、图标和背景(创建窗口之前和之后),相关函数。
窗口创建之前修改:
在MFC程序中,如果想要修改应用程序窗口的图标,则应在框架类中进行,因为在框架窗口中才有标题栏,所以才能修改位于该标题栏上的图标;如果想要修改程序窗口的背景和光标,就应该在视类中进行。
下面就利用这个函数来实现修改窗口图标的功能:
接下来,在视类的PreCreateWindow函数中利用AfxRegisterWndClass函数修改视类窗口的背景和光标:
窗口创建之后修改:
利用全局API函数:
SetClassLong来实现,该函数用来重置指定窗口所属窗口类的WNDCLASSEX结构体中指定数据成员的属性:
接下来,在style程序的视类中修改视类窗口的光标和背景,在响应函数(OnCreate函数)中,调用SetClassLong函数修改视类窗口的光标和背景:
3、创建工具栏和状态栏的过程
第一种方法:
第二种方法:
MFC创建工具栏的过程:
在CMainFrame类的OnCreate函数中,首先调用CreateEx函数创建程序的工具栏对象,接着调用LoadToolBar函数加载工具栏资源:
IDR_MAINFRAME.接着,CMainFrame类的OnCreate函数调用工具栏对象的EnableDocking成员函数设置工具栏停靠的位置。
接下来,CMainFrame类的OnCreate函数又调用了一个EnableDocking函数。
最后,CMainFrame类的OnCreate函数调用DockControlBar函数,让工具栏停靠在主框架窗口上。
注:
先前第一次调用的EnableDocking函数是工具栏对象的成员函数,目的是让工具栏对象可以停靠,而这里调用的是CFrameWnd对象的EnableDocking成员函数,目的是让主框架窗口可以被停靠。
状态栏:
首先调用状态栏对象的Create函数创建状态栏对象,接着调用SetIndicators函数设置状态栏指示器,