成员函数
![成员函数](https://img.360docs.net/img88/042ymr804b52abt48ofq-81.webp)
![成员函数](https://img.360docs.net/img88/042ymr804b52abt48ofq-02.webp)
CcmdUI类中常用的成员函数及其功能描述
区域类
菜单类CMenu
1、创建菜单
CMenu类的成员函数CreateMenu和CreatePopupMenu分别用来创建普通菜单和弹出菜单,其函数原型如下:
BOOL CreateMenu();
BOOL CreatePopupMenu();
2、调用菜单
BOOL LoadMenu(LPCTSTR lpszResourceName);
BOOL LoadMenu(UNIT nIDResource);
3、添加菜单项
BOOL AppendMenu(UNIT nFlags, UNIT nIDNewItem, const CBitmap*pBmp);
BOOL AppendMenu(UNIT nFlags, UNIT nIDNewItem=0, LPCTSTR lpszNewItem=NULL); BOOL InsertMenu(UNIT nPosition, UNIT nFlags, UNIT nIDNewItem, const CBitmap*pBmp); BOOL InsertMenu(UNIT nPosition,UNIT nFlags,UNIT nIDNewItem=0,LPCTSTR lpszNewItem=NULL);
形参nIDNewItem为新增菜单项的ID号,lpszNewItem为新增菜单项的标题,pBmp为位图指针,nPosition为新增菜单项的插入位置,nFlags表示新增菜单项的状态信息,其取值的不同会影响其他参数的含义。
参数nFlags的取值及其含义
在菜单栏中新增菜单后,不管菜单栏所在窗口是否改变,都应该调用CWnd类的成员函数CWnd::DrawMenuBar更新菜单栏。DrawMenuBar的函数原型为void DrawMenuBar()。
4、删除菜单项
BOOL DeleteMenu(UNIT nPosition, UNIT nFlags);
在菜单栏中删除菜单后,不管菜单栏所在窗口是否改变,都应该调用CWnd类的成员函数CWnd::DrawMenuBar更新菜单栏
5、获得菜单项信息
GetMenuItemCount函数
UNIT GetMenuItemCount()const;
其功能是得到某列菜单中的菜单项数。
GetMenuItemID函数
UNIT GetMenuItemID(int nPos)const;
其功能是返回参数nPos指定位置菜单项的ID号
GetSubMenu函数
CMenu*GetSubMenu(int nPos)const;
其功能是得到指向某列菜单的指针
调用上下文菜单
BOOL TrackPopupMenu(UNIT nFlags,intx,inty, CWnd*pWnd, LPCRECT lpRect=0);
形参nFlags表示菜单在屏幕上的显示位置及鼠标的按键状态,具体取值和含义见下表:
创建并初始化工具栏,通过CToolBar::Creat实现,其函数原型为:
BOOL Creat(CWnd*pParentWnd,DWORD dwStly=WS_CHIL D︱WS_VISIBLE︱CBRS_TOP,UNITnID=AFX_IDW_TOOLBAR);
参数pParentWnd为指向工具栏所在父窗口的指针,dwStyle为工具栏的格式,其取值及含义:
将储存在位图资源中的按钮与工具栏资源相连接,该过程通过调用函数CToolBar:LoadBitmap实现,该函数原型如下:
BOOL Load(LPCTSTR lpszResourceName);
BOOL Load(UNIT nIDResource);
常用的Windows标准控件的名称、功能描述及其对应的MFC类
列表框的常用消息及含义
数组类的CArray类中的常用成员函数及其功能描述
成员函数、非成员函数和友元函数介绍
成员函数、非成员函数和友元函数介绍 一、成员函数、非成员函数和友元函数 成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。 成员函数的优势是能够方便的进行动态绑定,实现多态。 说明一个函数为一个类的友元函数则该函数可以访问此类的私有数据和方法。 二、成员函数介绍 1、显式构造函数 C++中的e xplicit关键字用来修饰类的构造函数,表明该构造函数是显式的。 隐式构造函数能够实现将该构造函数对应数据类型的数据转换为该类对象。 class MyClass { public: MyClass( int num); } MyClass obj = 10; //ok,convert int to MyClass 如果在构造函数前加上关键字explicit,上述编译出错。 2、静态函数: 类中,static型的成员函数,由于是类所拥有的,而不是具体对象所有的。 静态函数屏蔽了this指针,因此,如果成员函数作为回调函数,就应该用static去修饰它。 3、虚函数: 虚函数首先是一种成员函数,它可以在该类的派生类中被重新定义并被赋予另外一种处理功能。 注意多态不是函数重载。函数重载属于静态绑定,虚函数实现多态是动态绑定。 4、纯虚函数: 在抽象类中定义纯虚函数,必须在子类实现,不过子类也可以只是声明为纯虚函数,由 子类的子类实现。 5、协变返回类型: 一般来说,一个重写的函数与被它重写的函数必须具有相同的返回类型。 这个规则对于”协变返回类型(covariant return type)”的情形来说有所放松. 也就是说,若B是一个类类型,并且一个基类虚拟函数返回B *,那么一个重写的派生类函数可以返回D *, 其中的D公有派生于B(即D是一个(is-a)B).若基类虚函数返回B &,那么一个重写的派生类函数可以返回一个D&. 考虑如下一个shape层次结构的clone操作: Class Shape { Public: //… Virtual Shape *clone () const = 0; //prototype(原型) //… }; Class Circle : public Shape {
MFC——4个基本类中的成员函数介绍.docx
09121852杜军机械设计及理论 1. CMainFrame ActivateFrame使框架对用户可视并可用 CalcWindowRect每当主框架窗I I的客户区尺寸发生变化或控制条的位置发生变 化,需要重新排列客户区时,调用该函数 Create调用以构造和初始化一个与CFrameWnd对象有关的Windows框架窗口DefWindowProc该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消 息提供缺省的处理 DestroyWindow销毁指定的窗口 DoDataExchange UpdateData会调用这个函数,调用它来初始化对话框的控件或更新数据 GetActiveDocument得到当前文档的指针 GetActiveFrame 返回活动CFrameWnd 对象 GetScrollBarCtrl调用这个成员函数以获取指定的了滚动控件或分隔窗I I的指针LoadFrame调用以从资源信息屮动态构造一个框架窗口 OnAmbientProperty框架调用这个成员函数以从包含OLE控件的窗口获得ambient属性值。重载这个函数以改变OLE控件容器向它的控件返回的缺省ambient属性值。任何没冇被重载函数处理的ambient属性请求将被传递到慕类的实现中OnChildNotify该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被创建 OnCmdMsg该函数的功能首先按字节对消息进行排序,对于WM_COMMAND 消息,调用OnCommand消息响应函数,对于WM_NOTIFY消息调用OnNotify 消息响应函数。任何被遗漏的消息将是一个窗I I消息。OnWndMsg函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg函数不能找到这样的处理函数的话,则把消息返冋到WindowProc函数,由它将消息发送给DefWindowProc函数 OnCommand该函数查看这是不是一个控件通知,如果它是,OnCommand函数会试图将消息映射到制造通知的控件;如杲他不是一个控件通知,OnCommand 就会调用OnCmdMsg函数 OnCreateClient为框架构造一个用户窗口 OnFinalRelease木函数在对对象的最后一个OLE参考或对象对别人的后一个OLE 参考被释放时,由框架调用 OnNotify框架调用这个函数以通知控件的父窗I」,在控件中发生了一个事件,或者该控件需要某些类型的信息。OnNotify处理控件通知的消息映射OnSetPreviewMode 设置应用的主框架成为或退出预打印模式 PostNcDestroy在窗口被销毁以后,缺省的OnNcDestroy成员函数调用这个函数。派生类可以利用这个函数來执行自定义的清除工作,比如删除指针PreCreateWindow该函数是一个重载函数,在窗I I被创建而,可以在该重载函数屮改变创建参数 PreSubclassWindow这也是一个重载函数,允许首先子分类一个窗口PreTranslateMessage 在消息被分派至U Windows 函数TranslateMessage 和
CString类所有成员函数详解
CString类所有成员函数详解 2009-03-27 10:53 CString类所有成员函数详解 VC里CString是我们最常用的类之一,我们觉得对它很熟悉了,可是你知道它的所有用法吗? 还是系统的学习一下吧,认真看完本文就OK了。 下面开始: CString::Compare int Compare( LPCTSTR lpsz ) const; 返回值字符串一样返回0 小于lpsz 返回-1 大于lpsz 返回1 区分大小字符 CString s1( "abc" ); CString s2( "abd" ); ASSERT( https://www.360docs.net/doc/809647819.html,pare( s2 ) == -1 ); ASSERT( https://www.360docs.net/doc/809647819.html,pare( "abe" ) == -1 ); CString::CompareNoCase int CompareNoCase( LPCTSTR lpsz ) const; 返回值字符串一样返回0 小于lpsz 返回-1
大于lpsz 返回1 不区分大小字符 CString::Collate int Collate( LPCTSTR lpsz ) const; 同CString::Compare CString::CollateNoCase int CollateNocase( LPCTSTR lpsz ) const; 同CString::CompareNoCase CString::CString CString( ); CString( const CString& stringSrc ); CString( TCHAR ch, int nRepeat = 1 ); CString( LPCTSTR lpch, int nLength ); CString( const unsigned char* psz ); CString( LPCWSTR lpsz ); CString( LPCSTR lpsz ); 例子最容易说明问题 CString s1; CString s2( "cat" ); CString s3 = s2; CString s4( s2 + " " + s3 ); CString s5( 'x' ); // s5 = "x"
在名字空间中声明类和成员函数
在名字空间中声明类和成员函数 赵湘宁 虽然很多程序员都熟悉名字空间的概念,但他们常常都是被动地使用名字空间。也就是说他们使用的是第三方定义的成员(如标准库的类和函数),而不是在名字空间中声明自己的类和函数。本文拟讨论如何在名字空间中声明自己的类和函数,以及如何在程序中使用它们。 名字空间是一个范畴,它包含类声明,函数声明,常量声明和模板声明等名字空间成员。例如: namespace proj_alpha { //下面是名字空间proj_alpha 的成员 class Spy {/*..*/}; void encrypt (char *msg); const int MAX_SPIES = 8; } 在上面的例子中,类Spy在一个单独的文件中实现。通常,你是在一个专门的头文件中声明一个类并在不同的源文件中独立地定义其成员函数。那么如何将名字空间成员类分离成多个源文件呢? 下面是名为Foo.hpp 的头文件,其中定义了一个名为NS的名字空间,它包含类Foo的声明: //Foo.hpp namespace NS { class Foo { public: void f(); void g(); }; }//close NS 另外,在一个单独的源文件Foo.cpp中,首先包含头文件Foo.hpp以便实现类Foo的成员函数f()和g(): //Foo.cpp #include "Foo.hpp" void NS::Foo::f() { /*..*/ } void NS::Foo::g()
{ /*..*/ } 为了使用名字空间成员,必须使用成员的全路径名,它由名字空间后跟::合成原名组成。因此,类Foo的全路径名是NS::Foo。这样编译器便可以知道NS是一个名字空间名,头文件Foo.hpp必须在引用NS之前被包含。 名字空间是可以扩展的。也就是说可以声明类,而且所声明的类在其它的.cpp文件中是相同的名字空间成员: //Bar.hpp namespace NS //扩展NS { class Bar { public: void a(); void b(); }; } 在Bar.cpp文件中: #include "Bar.hpp" void NS::Bar::a() {/*..*/} void NS::Bar::b() {/*..*/} 可以看出,虽然Foo和Bar这两个类在不同的头文件中声明,但它们都是名字空间NS的成员。并且编译器和链接器将这两个类看成是同一名字空间的成员。那么,如何在应用程序中使用这些类呢? 在文件main.cpp中,必须要包含声明类Foo和Bar的头文件并加上相应的名字空间引用声明-using: #include "Bar.hpp" #include "Foo.hpp" int main() { using NS::Bar; //使用名字空间 using NS::Foo; //同上 Bar b;
1. 解析函数
第十章 复变函数 本章研究的对象是定义在复数域上的复值函数(简称复变函数).重点研究一类比较特殊的复变函数——解析函数.主要内容包括解析函数的分析属性(微积分理论及级数表示)、几何性质(保角映射)等. §1 解析函数 一、复变函数基本概念与复变函数的导数 [单值函数与多值函数] 设Σ是扩充复平面(即包含无穷远点∞的平面)z 上的一个区域(第二十一章§5,二),对于Σ内的每个复数z ,按照一定的规律,有一个或多个复数ω和它对应,就称在Σ上定义了一个复变函数,记作 )(z f =ω 区域Σ称为函数)(z f =ω的定义域. 如果每一个复数z 都只有一个复数ω和它对应(允许不同的复数z 对应于同一个复数ω),就称函数是单值的;如果有的复数z 有多个ω值和它对应,就称函数是多值的.下面如果不加说明,一律都指单值函数. [映射·象·原象] 如果复数z 用复平面z (简称z 平面)上的点表示,复数ω用复平面ω(简称ω平面)上的点表示,那末复变函数)(z f =ω就是z 平面上区域Σ的点和ω平面上的某个点集(第二十一章§3,一)F 的点之间的对应关系.这样一来,复变函数)(z f =ω可以看成几何上的“映射”(变换)(第二十一章§1,二),点ω()(z f =ω)称为点z 的象(象点),点z 称为点ω的原象(象源).一般地,当点z 在复平面z 上画出一个图形A (或点集)时,相应地,它的象点ω在复平面ω上就画出一个图形(或点集)B.称B 为A 的象,A 为B 的原象.称函数)(z f =ω把A 映上B. [单叶函数与多叶函数·反函数] 如果函数)(z f =ω在点集A 上单值的,并且对于点集A 上的任意两个不同的点z 1和z 2,它们的象ω1=f (z 1)和ω2=f (z 2)也不同,那末称函数)(z f =ω在点集A 上是单叶的,如果点集A 上至少有两个不同的点z 1和z 2使)()(210z f z f ==ω,那末称函数)(z f =ω在点集A 上是多叶的. 如果单值函数)(z f =ω又是单叶的,它就表示A 和B 的点之间的一对一对应关系,并且对于B 上的每一点ω,A 上有一个且只有一个点z 和它对应.记作 )(ω?=z 它称为函数)(z f =ω的反函数(单值的). 如果函数)(z f =ω在点集A 上不是单叶的,那末它的反函数就是多值的了. [双方单值连续的映射定理] 设ω=f (z )是z 平面区域Σ内的单值连续函数,如果它又是单
一种使类成员函数成为 Windows 回调函数的方法
问题:一种使类成员函数成为Windows 回调函数的方法( 积分:100, 回复:62, 阅读:3393 ) 分类:Object Pascal ( 版主:menxin, cAkk ) 来自:savetime, 时间:2004-6-20 2:41:00, ID:2672562 [显示:小字体| 大字体] 一种使类成员函数成为Windows 回调函数的方法 https://www.360docs.net/doc/809647819.html, savetime2k@https://www.360docs.net/doc/809647819.html, 2004.6.20 本文排版格式为: 正文由窗口自动换行;所有代码以80 字符为边界;中英文字符以空格符分隔。 未经作者同意请勿在在任何公共媒体转载 大富翁satanmonkey 提出一个问题:HOOK 的时候,那个回调函数怎么弄才能做成类的成员?现在回调函数不能是类成员函数,访问不了类的成员变量。 https://www.360docs.net/doc/809647819.html,/delphibbs/dispq.asp?lid=2624773 后来又在另一篇贴子上也看到类似的问题,看来解决这个问题还有点用(我现在还不知道这有什么用处),所以趁着今天周末思考一下。 (太想睡了,下面只好草率地说明,如有不清楚请提问,或者日后有空再详作解释) 一开始我的想法是在类成员的回调函数内部复制参数的值,差不多理顺了,后来发现如果回调函数有返回值时,这种方法不行... 只好重新开工,用手工编制机器码的方法完成,其中查询JMP $00001111 这样的立即数跳转机器指令花了一个小时,结果是没有找到,只好以JMP [$00001111] 这个代码代替。如果有谁知道前一种跳转指令的机
解析函数的应用
解析函数的应用 —浅谈在陌生弹性力学中的应用 (杜碧晶,运城学院数学系) 摘要:在数学中,我们知道一个复变函数如果解析,则其实部和虚部均为调和函数,满足调和方程。一个实变的双调和函数,可由共轭复变函数的线形组合得到。在平面弹性力学中,对于平面应力问题和平面应变问题,可以通过假设,转变成求解满足某些边界条件下的双调和方程问题。这样就可以用复变函数中的解析函数进行解决。 关键词:解析函数、应力函数、平面应力问题、平面应变问题。 1、引言:社会十分尊重数学,这可能不是因为这个学科的内在美,而是因为数学是社会极其需要和工程中有广泛应用的一种艺术。以复数作为自变量的函数叫做复变函数,而与之相关的理论就是复变函数论。解析函数是复变函数中具有解析(可微)性质的函数。如果一个复变函数解析,那么 它的实部和虚部均为调和函数,满足拉普拉斯调和方程(02222=??+??y x φ φ)。在区域D 内满足C —R 方 程即: x v y u y v x u ??-=????=??,的两个调和函数v u ,中,v 称为u 在区域D 内的共轭调和函数。 任何一个弹性体都是空间问题,一般的外力都是空间系,因此严格的说,任何一个实际的弹性力学问题,都是空间问题。但是所考察的弹性体具有某种特殊形状,并且承受的是某种特殊的外力,就可把空间问题简化为平面问题。这样处理后,分析和计算的工作量将大大的减少,而所得的结果仍满足工程上对精度的要求,因此具有广泛的实用价值。 弹性力学的平面问题分为平面应力问题和平面应变问题。其中平面应力问题是指很薄的等厚度薄板 只在板边上受有平行平板面并且不沿厚度变化的面力,同时体力也平行于板面并且不沿厚度变化;平面应变问题是指很长的柱形体,它的横截面在柱面上受有平行于横截面而且不沿长度变化的面力,同时体力也平行于横截面而且也不沿长度变化,即内在因素和外来作用都不沿长度而变。 2基础内容介绍
C++常数据(函数)成员精讲
C++常数据成员精讲—const关键字 更多内容:h t t p://w w w.c c t w l.c o m/ 内容提要: 用const修饰的定义对象称为常对象; 用const修饰的声明成员函数称为常成员函数; 用const修饰的声明数据成员称为常数据成员。 变量或对象被const修饰后其值不能被更新。因此被const修饰的变量或对象必须要进行初始化。 用const修饰的声明数据成员称为常数据成员。 有两种声明形式: const int cctwl; int const cctwl; int cctwl const; //这样是错误的只能有以上两种声明形式。不能省略数据类型,可以添加public private等访问控制符。 说明: 1.任何函数都不能对常数据成员赋值。 2.构造函数对常数据成员进行初始化时也只能通过初始化列表进行。 3.常数据成员在初始化时必须赋值或称其必须初始化. 4.如果类有多个默认构造函数必须都初始化常数据成员。 通过下面例子来理解常数据成员以上4点。 A、请指出下面程序的错误 class A
{ private: int w,h; const int cctwl=5; //错误一 public: }; void main() { A a ; //错误二 cout<< "sss"; system("pause"); } 错误一:不能对常数据成员在类中初始化、要通过类的构造函数,只有静态常量才能这样初始化。 错误二:没有合适的默认构造函数可用。因为有常量cctwl没有初始化必须初始化所有常数据成员。 更正后结果如下: class A{ private: int w,h; const int cctwl; public: const int cctwlcom;//常对象可以是共有私有等访问权限
如何让类的成员函数作为回调函数
如何让类的成员函数作为回调函数 为什么类(class)的成员函(member function)数不能作为回调函数(callback function) 首先来看看回调函数有怎样的特点。windows中,回调函都显式(explicit)使用CALLBACK修饰符(decorator)修饰 (decorated)。实际上CALLBACK就是_stdcall 参数传递方式(calling convention)的宏定义。MSDN中对__stdcall做了如下定义: The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype. 其中心思想是,__stdcall修饰的函数,参数从右至左依次压入堆栈,被调用者(callee)负责平衡堆栈(clean also called ‘stack unwinding handling’)。 下面来看看类的成员函数有怎样的特点。在VC++中,所有类的成员函数在定义的时候都被隐式(implicit)定义为__thiscall参数传递方式。在MSDN 中对 __thiscall做了如下定义: The __thiscall calling convention is used on member functions and is the default calling convention used by C++ member functions that do not use variable arguments. Under __thiscall, the callee cleans the stack, which is impossible for vararg functions. Arguments are pushed on the stack from
CDC类的主要绘图成员函数
CDC类的主要绘图成员函数 CDC类中常用绘图函数 1)绘制像素函数 原型:COLORREF SetPixel(int x,int y,COLORREF crColor ); 设置某像素点的RGB值 2)获取像素颜色函数 原型:COLORREF GetPixel(int x,int y)const; 返回值:指定像素的RGB值。 参数说明:得到指定像素的RGB颜色值 一、画笔函数 画笔是用来绘制直线、曲线或图形的边界线,是绘图工具类之一 画笔通常具有线型、宽度和颜色三种属性 画笔的线型通常有实线、虚线、点线、点划线、双点划线、不可见线和内框架线7种,这些线型都是以PS_为前缀的预 定义标识符 默认的画笔是一个像素单位的黑色实线 要想更换画笔,可以在创建新画笔对象后,将其选入设备上下文,就可使用新画笔进行绘图。 1)创建画笔函数 原型:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);
返回值:非零。 参数说明: 第一个参数nPenStyle是画笔的风格代码 第二个参数nWidth是画笔的宽度 第三个参数crColor是画笔的颜色。 PS_SOLID;实线;宽度任意指定 PS_DASH;虚线;宽度1(不可任意指定) PS_DOT;点线;宽度1(不可任意指定) PS_DASHDOT;点划线;宽度1(不可任意指定) PS_DASHDOTDOT;双点画线;宽度1(不可任意指定) PS_NULL;不可见线;宽度1(不可任意指定) PS_INSIDEFRAME;内框架线;宽度任意指定 2)选择画笔函数 原型:Cpen *SelectObject(Cpen *pPen); 返回值:被替代画笔的指针。 参数说明:参数pPen是Cpen类的被选中的新画笔对象指针。本函数把原画笔换成新画笔,同时返回指向原画笔的指针。 3)删除画笔函数 原型:BOOL DeleteObject( ); 返回值:非零。 参数说明:画笔使用完毕,把已成自由状态的画笔从系统内存中清除。 4)选择一支库画笔函数 原型: virtual CGdiObject *SelectStockObject(int nIndex); 返回值:被替代的CGdiObject类对象的指针。 参数说明:参数nIndex是库笔代码 Windows系统中准备了一些使用频率较高的画笔,不需要创建,可以直接选用。同样,使用完库画笔时也不需要调用 DeleteObject()函数从内存中删除已使用过的画笔。 三种常用库笔:BLACK_PEN宽度为1的黑笔实线笔;WHITE_PEN宽度为1的白笔实线笔;NULL_PEN透明笔 二、画刷函数(图形内部进行填充) 1)创建实体画刷函数 BOOL CreateSolidBrush(COLORREF crColor ); 选择画刷函数 2)CBrush *SelectObject(CBrush *pBrush ); 删除画刷函数 3)BOOL DeleteObject( ); 创建阴影画刷函数 4)BOOL CreateHatchBrush(int nIndex,COLORREF crColor);