以该博文http://blog.csdn.net/column/details/megogame.html 为基础,涉及到的每个都尽量解释和说明其用法。
以下是流程图,由于太大,请尝试右键另存为查看。关于函数请跳过图的部分继续往下看
————————————————————————
函数或命令:
所属类:
原型:
说明:
参考链接:
————————————————————————
函数或命令:
DC
所属类:
原型:
说明:
device context,叫设备环境或者设备描述表,是GDI(图形设备接口)内部保存数据的一种数据结构。此结构中的属性内容和特定的输出设备(显示器、打印机等)相关,属性定义了GDI函数的工作细节。
总之,要使用GDI绘图函数,就需要一个DC句柄。
MFC中把和DC相关的都封装成类。CDC是一个抽象基类,可以访问整个显示器和打印机等,CClientDC类和窗口客户区关联,能用于显示客户区相关内容。
DC: Device Context,中文也叫设备上下文,通俗的理解叫窗口显示描述设备也行; CDC: MFC中封装了操作系统窗口输出底层API的封装类,如CDC的派生类CClientDC,用于窗口客户区域的输出。
HDC: VC++开发环境中的DC句柄类型,32比特的无符号整数类型,用来标识DC设备的句柄。
设备上下文:看上面解释的第一行。
在GDI中,DC(Device context)是一个非常重要的概念。
有的书中,将DC翻译为设备描述表(《Windows 程序设计 第五版》作者Charles Petzold),
也有的书将DC翻译为设备上下文。
到底什么是DC?
用现实中的例子来理解可能更容易些。
如果你喜欢画画,你得先准备了画布,画笔,颜料……
画画的环境搭建好了,你就可以画画了。
这个画画的环境,就是DC。
在图形环境下,一切都是画出来的,所以,你要准备好一个DC,才能在屏幕上画画。——写字也是画画。
在画画的环境中,有哪些对象呢?
画布——GDI对象之一:区域
画笔——GDI对象之一:画笔
颜料盒——GDI对象之一:调色板
如果要在画笔上写字的话,写什么样的字体呢?方正字体?徐静蕾字体?——字体也是GDI对象之一。
有的画笔比较粗,专用来刷大面积背景色的,这是刷子——GDI对象之一:刷子
如果你不想画了,只想把别人画好的画,贴到你的画布上,这也是可以的。——GDI对象之一:位图。
所以,这里就有6种GDI对象可以用于DC。
现在开始画画了,你拿起了一只笔。——在Windows环境里,这叫选择了一个画笔对象:使用SelectOBject函数。当然,如果你没带笔也没关系,Windows为你准备了几只画笔,你可以这样申请系统提供的缺省画笔:hPen = GetStockObject(WHITE_PEN);
如果你画着画着,觉得手中的笔用着不爽,可以换一只啊,没关系的。——依旧是SelectObject()换笔。
当然,如果你走出了画室,别完了把你的画笔清除掉,要不画室里全是笔啊,刷子啊,太乱了。——DeleteObject()
参考链接:
http://wenda.so.com/q/1378648861067082?src=140
http://wenda.so.com/q/1365013199066107
————————————————————————
函数或命令:
CDC
所属类:
原型:
说明:
①cdc相当于画布,你可以使用笔、刷、位图、字体等在画笔上画图,就这么简单
②是 HDC的封装类 可以理解成这是一个 “画家” 你可以给画家准备好笔、刷子、位图等等东西 画的时候只要告诉画家画什么就行了 它会用你给的装备开始绘画...
参考链接:
http://bbs.csdn.net/topics/390636858?page=1
————————————————————————
函数或命令:
CDC m_cacheDC;
所属类:
CDC
原型:
说明:
声明一个CDC对象。
CDC类定义的是设备上下文对象的类。
CDC对象提供处理显示器、或打印机等设备上下文的成员函数,以及处理对象与窗口客户区对应的显示上下文的成员。
通过CDC对象的成员函数进行所有的绘图。
类名 |
说明 |
CClientDC |
窗口客户区的设备描述环境,但应用在WM_PAINT消息之外的消息处理函数中 |
CMetaFileDC |
图元文件的设备描述环境,在创建可以回放的图像时使用 |
CPaintDC |
窗口用户区的设备描述环境,在OnDraw()函数中来处理WM_PAINT消息 |
CWindowDC |
在整个窗口内(不只是用户区)绘图的设备描述环境 |
专门用于在应用程序窗口客户区绘图的CPaintDC,是所有CDC子类中最常用的一个类。为了防止程序设计人员误把绘图代码写到其他位置,MFC规定,CPaintDC对象只在CView类(不过好像在windows的MFC里面,是CChildView类)的OnDraw()函数中有效。
系统每次创建应用程序窗口,及窗口需要刷新时,就会产生WM_PAINT消息,系统接收到这个消息就会自动调用OnDraw()函数。应用程序也可以调用相关函数来激活OnDraw(),因此程序中所有对窗口客户区进行绘图的代码,都应该写再这个函数中(指OnDraw())。
参考链接:
http://blog.csdn.net/cto_51/article/details/8828088
http://blog.csdn.net/akof1314/article/details/5439866(内含大量CDC成员及其作用说明)
————————————————————————
函数或命令:
WM_PAINT
所属类:
原型:
说明:
应用程序通过处理该消息,来实现在窗口上的绘制工作。
(1)系统何时发送WM_PAINT消息?
①第一次创建一个窗口时;
②改变窗口大小时;
③当把窗口从另一个窗口背后移出时;
④当最大化或者最小化窗口时;
⑤其他。
这些动作由系统管理,应用只是被动的接受该消息,在消息处理函数中进行绘制操作,大多数的时候应用也需要能够主动引发窗口动作中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过InvalidateRect 和 InvalidateRgn函数来完成的。
参考链接:
http://blog.sina.com.cn/s/blog_5344089201009whk.html
————————————————————————
函数或命令:
m_bg.CreateCompatibleDC(NULL);
所属类:
CDC
原型:
说明:
创建一个兼容的DC。他的参数是*CDC类型的,即是一个DC的指针,函数会绘制一个与参数提供的DC相兼容的DC。
如果参数为NULL,函数会自动创建和当前程序DC兼容的内存DC。
说明 |
|
创建一个与特定设备场景一致的内存设备场景 |
|
返回值 |
|
Long,新设备场景句柄,若出错则为零 |
|
参数表 |
|
参数 |
类型及说明 |
hdc |
Long,设备场景句柄。新的设备场景将与它一致。也可能为0以创建一个与屏幕一致的设备场景 |
注解 |
|
在绘制之前,先要为该设备场景选定一个位图。不再需要时,该设备场景可用DeleteDC函数删除。删除前,其所有对象应回复初始状态 |
BitBlt( //图形拷贝
HMDC0, //目标设备场景
x0, y0 //目标左上角坐标
w, h //目标图形宽、高
HMDC1, //源设备场景
x1, y1 //源左上角坐标
SRCCOPY //拷贝方式,这里是直接拷贝
);
参考链接:
http://blog.csdn.net/ghevinn/article/details/28641219
————————————————————————
函数或命令:
CBitmap m_bg;
所属类:
CBitmap
原型:
说明:
类CBitmap封装了Windows GDI中的位图,并且提供了操纵位图的成员函数。
使用CBitmap对象之前,要先构造CBitmap对象,调用其中的一个初始化成员函数设置位图对象的句柄。此后,就可以调用其他成员函数了。
这句命令的意思就是,声明一个位图对象(位图对象名是m_bg),之后可以用CBitmap的成员函数,例如“.LoadBitmap(资源名)”可以用来加载某个资源(资源通过右键资源文件—添加—资源—Bitmap 来添加)。
参考链接:
————————————————————————
函数或命令:
m_bg.LoadBitmap( 资源名 )
所属类:
CBitmap
原型:
.LoadBitmap( )
说明:
资源名,实际上是资源的ID,在资源视图下的Bitmap那一栏可以看到。是一个整型(int id),也可以被修改。
貌似还有一种LoadImage()的方法,不懂。
另外,LoadBitmap()不能加载文件,只能加载资源。LoadImage貌似也是。
参考链接:
————————————————————————
函数或命令:
m_cacheBitmap.CreateCompatibleBitmap(cdc, m_client.Width(), m_client.Height());
所属类:
CBitmap
原型:
函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);
说明:
该函数创建与指定的设备环境(DC)相兼容的位图。
cdc是句柄;
m_client.Width()是位图的宽度(x)
m_client.Height()是位图的高度(y)
当位图绘制时:
位图的尺寸如果比窗口DC(客户区,也就是绘制图的区域)小,那么DC有一部分就没图。
如果位图的尺寸比窗口DC大,那么一部分位图就没办法显示出来。
也就是说,和cdc->BitBlt(0, 0, m_a.Width(), m_a.Height(), &m_cacheDC, 0, 0, SRCCOPY);相比。
都是显示一部分图片。个人发现,影响内存占用的,是在cdc->BitBlt(xxx)这一步。不要覆盖绘制。例如:
cdc->BitBlt(0, 0, m_a.Width(), m_a.Height()/2, &m_cacheDC, 0, 0, SRCCOPY);
cdc->BitBlt(0, m_a.Height()/2, m_a.Width(), m_a.Height(), &m_cacheDC, 0, 0, SRCCOPY);
实测来看,这2个放一起。第二行第4个参数/2,会少占用一点内存(貌似)。
如果第一行第4个参数不除以2,那么第二行绘制的图会闪烁(确定)。
但实测来看,每次调试占用的内存量会有浮动(即使没修改任何程序代码),不理解。
但具体我还是不是很明白。
附一个我自己写的理解吧:
m_cacheCBitmap.CreateCompatibleBitmap(cdc, m_a.Width(), m_a.Height()/2);
//创建一个位图,参数1:当前窗口的句柄,参数2:位图的宽度,参数3:位图的高度
....
cdc->BitBlt(0, 0, m_a.Width(), m_a.Height(), &m_cacheDC, 0, 0, SRCCOPY);
//这部分是绘制缓冲区(m_cacheDC)的图片,宽度和高度是窗口(m_a获取的是窗口)的宽度和高度
//不过宽度和高度换成更大的貌似也行(但如果更小的话,就绘制的是一部分了,其他就空出来了)
//个人觉得,这个和上面的m_cacheCBitmap.CreateCompatibleBitmap(cdc, m_a.Width(), m_a.Height());的区别在于
//这里的是绘制缓冲DC的尺寸,上面的缓冲DC指向的位图的尺寸。然后在这里,把缓冲DC的位图(通过&m_cacheDC)绘制在这里,绘制的窗口部分是m_a.Width()宽和m_a.Height()高
//也就是说,先有个位图(他有一定尺寸),然后把这张位图绘制在某个DC上,这个DC如果比这个位图大,那么DC大于位图的部分是没法显示的。如果位图比DC小,那么位图大出来的部分也是没法显示的。
//推测,如果DC大于位图,那么DC可以在多出来的部分(设定坐标),再绘制其他位图。
//如果DC小于位图,那么DC如果绘制其他位图的话,就覆盖了之前的部分了(也就是前者是空的然后填充,后者是有然后覆盖)
//理解为一张纸(位图)在一个木板(DC)上的映射。
参考链接:
http://baike.so.com/doc/6084306-6297408.html
————————————————————————
函数或命令:
m_cacheDC.SelectObject (&m_cacheCBitmap);
所属类:
CDC
原型:
说明:
该函数选择一对象到指定的(调用该函数的对象)DC中,该新对象替换先前相同类型的对象(如果不相同呢?)
理解为给DC选择画笔(画什么,用什么画,例如这里就是用位图对象来绘制)。
参考链接:
http://wenda.so.com/q/1365013199066107
————————————————————————
函数或命令:
m_bg.Draw(m_cacheDC, m_client);
所属类:
CImage
原型:
说明:
绘制图片,第一个参数是在哪绘制(CDC类对象m_cacheDC),第二个参数是绘制的相对坐标(CRect类对象,实际上有四个坐标left, right, top, bottom)。
第一个参数也可以用*cdc(假如CDC *cdc=this->GetDC();的话,cdc指针就是指向当前窗口)
第二个参数是第一个参数(提供的DC对象)的相对坐标。分别是left, right, top, bottom。也就是其上下左右四个坐标的位置(假如和当前窗口的尺寸一样,那么就和当前窗口一样大),可以是负数(于是就只能显示部分),也可以left比窗口的宽还大(于是就在窗口右边的外面了)。总之,通过控制相对于DC的坐标,控制这张图出现在哪里。
1. m_hero.Draw(*cDC,100,400,60,60);
Draw函数有多个重载类型,这里给出的是最常用的,参数分别表示要绘制的DC,起始x,起始y,宽度,高度。
参考链接:
————————————————————————
函数或命令:
cdc->BitBlt(0, 0, m_a.Width(), m_a.Height(), &m_cacheDC, 0, 0, SRCCOPY);
所属类:
CDC
原型:
1. BOOL BitBlt(
2. int nXDest, //目的DC的起始x
3. int nYDest, //起始y
4. int nWidth, //宽度
5. int nHeight, //高度
6. HDC hdcSrc, //源DC
7. int nXSrc, //源DC起始x
8. int nYSrc, //起始y
9. DWORD dwRop //贴图方式,大家设置为SRCCOPY就可以了
10. );
说明:
大概就是说,绘制图,先定绘制的范围(前4个参数),
然后绘制的DC(第5个参数),
然后绘制DC的起始坐标(就是说从DC的哪个x、y坐标开始画图,例如从1,1开始画,于是x坐标<1或者是y坐标是<1的DC的那部分就不会显示了)(第6,7个参数),
最后是贴图方式(第8个参数),关于第八个参数如下:
dwRop:光栅操作代码
|
dwRop有如下选择:
BLACKNESS 使用黑色填充目标区域 DSTINVERT 目标矩阵区域颜色取反 MERGECOPY 使用与运算组合原设备矩形区域的颜色和目标设备的画刷 MERGEPAINT 使用或运算将反向的源矩形区域的颜色和目标矩形区域的颜色合并 NOTSRCCOPY 复制源设备区域的反色到目标设备中 NOTSRCERASE 使用或运算组合源设备区域与目标设备区域的颜色,然后对结果颜色取反 PATCOPY 复制源设备当前选中的画刷到目标设备 PATINVERT 使用异或运算组合目标设备选中的画刷和目标设备区域的颜色 PATPAINT 通过或运算组合目标区域当前选中的画刷和源设备区域反转的颜色 SRCAND 使用与运算组合源设备和目标设备区域的颜色 SRCCOPY 直接复制源设备区域到目标设备中 SRCERASE 使用与运算组合目标设备区域的反色与源设备区域的颜色 SRCINVERT 使用异或运算组合源设备区域颜色和目标设备区域颜色 SRCPAINT 使用或运算组合源设备区域颜色和目标设备区域颜色 WHITENESS 使用白色填充目标区域 |
参考链接:
http://blog.sina.com.cn/s/blog_7590da790101br23.html
————————————————————————
函数或命令:
ValidateRect(&m_client);
所属类:
原型:
BOOL ValidateRect(
HWND hWnd, // 窗口的句柄
CONST RECT *lpRect // 指向RECT结构的指针
);
说明:
InvalidateRect(HWND) 使窗口无效 产生消息WM_PAINT;
ValidateRect(HWND)使窗口有效 清除消息队列中的WM_PAINT消息
该函数更新指定窗口的无效矩形区域,使之有效。
InvalidateRect是将窗口中的一块矩形区域标注为“无效”,系统会不断向窗口发送WM_PAINT消息令其重绘。在响应WM_PAINT消息时,需要调用BeginPaint获取DC来进行重绘。该函数会合并所有“无效”区域,对DC进行裁剪,将整个窗口标注为“有效”,清除WM_PAINT消息。DC经裁剪之后,在进行绘制时,超出DC范围的操作将不被处理,所以即使在响应WM_PAINT消息时绘制的是整个窗口,而实际上绘制的也只是“无效”区域。恰当地使用InvalidateRect进行刷新比刷新整个窗口的效率要高。在WM_PAINT消息时,应尽量根据PAINTSTRUCT结构中rcPaint指定的矩形来处理重绘,减少执行不必要的代码,从而提高效率。
个人感觉,大概就是如果某些地方需要重画(比如说移动了窗口就是全部重画,遮挡的窗口不被遮挡了,就是遮挡部分需要重画),会被标记为无效区域,然后系统就触发了WM_PAINT消息,这个消息的作用就是说告诉DC,要重画啦。
然后函数BegainPaint(系统自己调用),就把所有无效区域合并到一起,在标注有效之后,进行重画。而无效区域如果超出DC范围(比如说图比窗口大),超出的部分就不会被处理。
因为无效区域比全部窗口通常来说要小,因此只画无效区域(也就是指定某区域要重画),要比重画整个窗口来说效率更高。
因此这里的有效,就是说不要去重画(因为在缓冲位图加载后已经重画了,因此不需要让某区域无效从而发送WM_PAINT消息去重画)。
在OnPaint函数中释放DC即ReleaseDC之前要加上ValidateRect(&m_client);这个函数的作用是使绘图区变得有效。在windows中,如果我们的窗口被遮挡了什么的,窗口那部分就变得无效,就会产生WM_PAINT消息,当绘制完毕后,必须要使窗口变得有效,否则系统将周而复始的产生WM_PAINT消息,使得CPU占用率非常高,而且还会出现很多莫名其妙的问题,比如使用MessageBox会导致程序失去响应等。
参考链接:
http://blog.csdn.net/danxuezx/article/details/5088998
————————————————————————
函数或命令:
cacheDC.DeleteDC();
所属类:
CDC
原型:
BOOL DeleteDC(HDC hdc);
说明:
注释:如果一个设备上下文环境(DC)的句柄是通过调用GetDC函数得到的,那么应用程序不能删除该设备上下文环境,它应该调用ReleaseDC函数来释放该设备上下文环境。
由 CreateDC、CreateCopatibleDC 函数创建的设备上下文环境,只能使用DeleteDC来释放。
在程序里,和上面的m_cache.CreateCompatibleDC(NULL);相对应,类似new和delete的关系。
参考链接:
http://blog.csdn.net/angussl/article/details/6527050
————————————————————————
函数或命令:
cacheCBitmap.DelectObject();
所属类:
CBitmap
原型:
BOOL DeleteObject(HGDIOBJ hObject);
说明:
函数功能:该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了。
和上面的
m_cacheCBitmap.CreateCompatilbeBitmap(cdc, m_client.Width(), m_client.Height() )
相对应。
也就是说,CBitmap类对象创建一个兼容的画笔(这里的画笔是位图),在用完后就要释放掉他。
参考链接:
————————————————————————
函数或命令:
ReleaseDC(cdc);
所属类:
CChildView
原型:
说明:
如果一个DC的句柄,是通过getDC() 得到的,只能通过ReleaseDC()来释放。
在本程序中,也就是指和CDC* cdc=this->GetDC(); 相呼应。
每个进程的GDI句柄数是有上限的
(MSDN: The number of DCs is limited only by available memory. ),貌似是10000个,超过上限后,进程再GetDC就会失败。
getdc用户向系统申请,用户获得了一个dc,同时,系统内部必然会记录其资源已经做了什么样的分配,你不释放dc,并且放弃对该dc的控制(比如dc记录在函数变量上,函数退出后,你的应用就失去了对该dc控制),那么,该dc变成了一个被占有而不可以用的资源,你不断的申请dc,这样资源就不断被你占用,直到系统资源不足,大家完蛋。
也就是说,你问系统要一个DC,那么就用完后就得还回去,否则如果你丢掉(但系统记着你还借着呢),等你从系统那里借光了你的余额,你就再也不能借了。
参考链接:
http://bbs.csdn.net/topics/390537124
————————————————————————
函数或命令:
m_cacheDC.SetBkMode(TRANSPARENT);
所属类:
CDC
原型:
WINGDIAPI int WINAPI SetBkMode(__in HDC hdc, __in intmode);
hDC是句柄,mode是设置的模式。
不输入第一个参数应该默认的是当前dc吧(不确定)
说明:
该命令表示将文字背景设为透明。
当在一个已有的图像上面输出文字时,有个很重要的问题是,文字不像手写的文字那样,单单是一个文字,而是一个矩形的图像(观察所得),输入一串文字,其实就是把多个文字的图像放一起。
这个图像由两部分组成,文字,和其背景。如果不输入这行(设置为TRANSPARENT模式),则文字的背景不会变的透明(因此会遮挡背景图像)。只有设置为TRANSPARENT模式后,才会只显示文字。
模式分为两种:TRANSPARENT和OPAQUE,前者是设置为透明,后者为用当前背景的画刷输出显示文字的背景。
①在TRANSPARENT模式下(文字颜色已设置为红色),图像为:
②在OPAQUE模式下,背景画刷不设置。则为:
③OPAQUE模式下,设置背景画刷,目前无(因为我还不会设置背景画刷)
参考链接:
————————————————————————
函数或命令:
m_cacheDC.SetTextColor(RGB(255, 0, 0));
所属类:
CDC
原型:
说明:
设置输出的文字的颜色。通过RGB三个参数(红绿蓝)控制颜色。范围0~255,具体设置为多少在使用的时候查看相关的文章。
参考链接:
————————————————————————
函数或命令:
m_cacheDC.TextOut(0,0,"发生碰撞");
所属类:
CDC
原型:
说明:
该行命令在屏幕左上角(0,0)的位置输出文字。
TextOut (hdc, x, y, psText, iLength) ;
hdc指的是窗口句柄,x,y指的是字符串在显示区域的开始位置,psText参数是指向该字符串的指针,iLength是字符串的长度。
另外,按照查看的来看,可以将其设置为输出文字+字符变量的形式,不过我没看懂怎么做。等搞明白了来补充。
参考链接:
————————————————————————
函数或命令:
mciSendString("open res\\我在人民广场吃炸鸡.mp3 alias bgMusic",
NULL, 0,
NULL);
mciSendString("playbgMusic repeat",
NULL, 0,
NULL);
所属类:
原型:
说明:
mciSendString是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等
需要头文件#include<mmsystem.h>。
需要导入声音文件库#pragmacomment(lib,"winmm.lib")//导入声音头文件库
第一行命令:
①open表示打开媒体文件,媒体文件的地址是后面的res\\我在人民广场吃炸鸡.mp3 ;
②alias bgMusic表示将这个媒体文件的别名bgMusci,于是之后只需要调用别名就可以播放这个媒体文件了。
第二行命令:
①play表示播放某个媒体文件(bgMusic就是这个被播放的);
②repeat表示循环播放。
两行命令后面的NULL,0,NULL表示什么尚不清楚。
参考链接:
http://baike.so.com/doc/6951002-7173403.html
————————————————————————
函数或命令:
CString
所属类:
原型:
说明:
是一种数据类型。很大程度上简化了MFC中的很多操作,使得MFC在做字符串操作的时候方便了很多。
位于头文件<afx.h>中(但貌似MFC无需引用)。其作用包括以下:
①拼合字符串,可以像string类那样,通过加号运算符,将两个CString类对象之和赋值给某个CString类对象;
②格式化字符串。CString类对象的Format()方法。首先声明一个CString类对象(例如CString m),然后m.Format(_T("Total is%d"),total); 这样,可以不必担心存放格式化或数据的缓冲区是否足够大(例如total假如是个很大的数字,每多一位都要多占一个char大小的内存)。格式化也是一种将非字符串类型(例如int)的数据转化为
CString类型的最常用技巧。例如将一个整数转化为CString类型,可用如下方法:CString m; m.Format(_T("%d"),total);此时,m就是total的字符串类型了(例如1就成为了字符串的1,得记住,字符1的ASCNII码,并不是1)
③转换为int型。把CString类型的数据转换为整数类型最简单的方法就是使用标准的字符串到整数转换例程(不懂)——具体看后面的参考链接;
④同char*类型转化。在把字符串类型赋值给CString类型时,使用加号运算符中,至少加号左边的是CString类型(或者对其使用强制转换),或者两个都是CString类型,才能将其结果赋值给另一个CString类型(因为此过程已使用加号运算符的重载函数)。或者,使用_T(字符串,带双引号);
,并将其赋值给CString类型(此时是Unicode字符),不使用_T也可以直接赋值。(更多请查看参考链接)
⑤⑥⑦请查看参考链接,我目前还没接触到其涉及到的知识,因此暂不深入。
参考链接:
http://baike.so.com/doc/5034329-5260837.html
————————————————————————
函数或命令:
所属类:
原型:
说明:
AfxMessageBox的函数原型
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );
int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp =(UINT) –1 );
根据说明,MFC情况下,应尽量使用AfxMessageBox()函数,因为这个全局的对话框最安全,也最方便。(在WIN32 SDK的情况下,只能使用MessageBox)
MFC中,能使用后者的情况下,都能使用前者(afx...)。
AfxMessageBox是MFC的全局函数,提供了多种重载形式(虽然我就看会了一种)。
以AfxMessageBox(bufpos,MB_OKCANCEL);为例:
这行代码可以有三个参数,第一个参数为字符串,可以是CString类型的变量(字符串变量),也可以直接是字符串。这第一个字符串为输出的内容。
第二个参数为按钮(例如这里是按钮是确定和取消),如果不填写,则只有一个“确定”按钮。如何利用不同的按钮来做不同的事,还不太清楚,以后待补充。
第三个参数还没搞懂怎么用。
参考链接:
http://blog.csdn.net/xhhjin/article/details/6456205
————————————————————————
函数或命令:
所属类:
原型:
说明:
参考链接: