MFC中常用类,宏,函数介绍

本文介绍了MFC中常用的类、宏和函数,包括CRect、CPoint、CString等类的使用方法及常见操作,同时提供了有趣的C语言编程示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MFC中常用类,宏,函数介绍

常用类

CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right。分别表是左上角和右下角的坐标。可以通过以下的方法构造:

CRect( int l, int t, int r, int b ); 指明四个坐标

CRect( const RECT& srcRect ); RECT结构构造

CRect( LPCRECT lpSrcRect ); RECT结构构造

CRect( POINT point, SIZE size ); 有左上角坐标和尺寸构造

CRect( POINT topLeft, POINT bottomRight ); 有两点坐标构造

下面介绍几个成员函数:

int Width( ) const; 得到宽度
int Height( ) const;
得到高度

CSize Size( ) const;
得到尺寸

CPoint& TopLeft( );
得到左上角坐标

CPoint& BottomRight( );
得到右下角坐标

CPoint CenterPoint( ) const;
得当中心坐标

此外矩形可以和点(CPoint)相加进行位移,和另一个矩形相加得到操作后的矩形。

CPoint:用来表示一个点的坐标,有两个成员变量:x y。 可以和另一个点相加。

CString:用来表示可变长度的字符串。使用CString可不指明内存大小,CString会根据需要自行分配。下面介绍几个成员函数:

GetLength 得到字符串长度
GetAt
得到指定位置处的字符

operator +
相当于
strcat
void Format( LPCTSTR lpszFormat, ... );
相当于
sprintf
Find
查找指定字符,字符串

Compare
比较

CompareNoCase
不区分大小写比较

MakeUpper
改为小写

MakeLower
改为大写

CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数:

Add 增加CString
RemoveAt
删除指定位置CString对象

RemoveAll
删除数组中所有CString对象

GetAt
得到指定位置的CString对象

SetAt
修改指定位置的CString对象

InsertAt
在某一位置插入CString对象

常用宏

RGB

TRACE

ASSERT

VERIFY


常用函数

CWindApp* AfxGetApp();

HINSTANCE AfxGetInstanceHandle( );

HINSTANCE AfxGetResourceHandle( );

int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );用于弹出一个消息框

 

 

 

 

一个有趣的c程序     

 #include

main(int _){

    char*x="*b#**000**I#*******2*0***#-.****5.*-#-.****54.#*******2**6#****00**0.#";

    while(_=*x/4)

    {

       _-=8;

       printf("/n%*s"+!!_,_+_,"_/_/_/"+*x++%4*2);

    }                     

}

 

首先来看看main函数参数,这个参数的名称比较奇怪”_”,我们看着有些不习惯,但它确实是合法的变量名称。另外,本来我们常见的main函数一般都不带参数,如果有参数是因为程序希望处理命令行格式下运行这个程序所需要的参数,一般是这样的:main(int argc, char **argv),第一个参数argc表示参数表中参数的个数,argc是一个char型二维数组,保存着参数字符串。举个例子,如果我们在命令行下输入命令:dir –s c:/

此时,argc的值为3(包括命令本身),argv[0]指向字符串:dirarg[1] 指向字符串:-sarg[2]指向字符串c:/。那么既然main函数的参数通常要不没有,要不就是两个,而这个程序只有一个,这样做是否合法呢?答案是肯定的!我在《关于C语言中的变量》中提到过,函数中的参数是保存在堆栈中的,所以这就涉及到一个谁来平衡堆栈的问题,是调用者还是被调用者。在使用VC6编译器的时候,如果函数没有特别的声明,默认是调用者清理堆栈。换句话说,运行时库(runtime)调用main函数的时候,只传递一个参数给main函数,这一点它自己是知道的,当main函数调用结束以后,它在平衡堆栈的时候,只清除掉一个函数,因此不会出现任何问题。

 

我们接着往下看,下面定义了一个char型指针变量x,指向一个字符串。接下来是while语句,while(_=(*x)/4),但表达式_=(*x)/4的值不为0的时候就执行while的循环体,然而表达式_=(*x)/4是一个赋值语句,它的值又是多少呢?在这种情况下,通常赋值号右面的表达式的值就是整个表达式的值。第一次执行这个语句的时候,x指向字符’*’,对应的值为42,以此类推,当x=0时,也就是字符串结束的时候,循环结束。

 

接下来在原来的程序中是:_-=8,printf("/n%*s"+!!_,_+_,"_/_/_/"+*x++%4*2);这里的逗号作用有些类似分号,但是逗号两侧组成的是一条语句,而分号则是两条语句。

我们仔细看printf这条语句,它的格式字符串为:”/n%*s”,其中%*s很少见,很多人不知道这是什么格式,不过我们可以在MSDN中找到这样的描述:

If the width specification is an asterisk (*), an int argument from the argument list supplies the value. The width argument must precede the value being formatted in the argument list.

意思是说如果宽度用星号(*)来指定,则应该在参数列表中提供一个int型参数作为宽度的值。这样就清楚了,原来这个printf语句是用表达式_+_来控制字符串”%*s”的宽度,也就是替换其中的(*)。

在仔细一看,原来格式字符串还没有完!完整的应该是:"/n%*s"+!!_。这就奇怪了,字符串怎么和!!_相加呢?其实也不奇怪,在这里!!_是对变量_作了两次“非”的操作,结果应该是01。要明确的是,字符串作为参数传递给函数的时候,只是把字符串的首地址传递给了函数,所以字符串"/n%*s"的首地址就是字符’/n’的地址,当这个地址加1的时候,传递给printf函数的格式字符串就变成了"%*s",所以这个+!!_的奥妙就在于控制换行!是不是很有创意?

当然了,下面的代码同样有创意,就是printf语句要打印的字符串参数:"_/_/_/"+*x++%4*2。经过刚才的分析,我们不难理解"_/_/_/"加上后面的表达式的用意了,同样是控制输出字符的个数,是一个”_/”,两个,还是三个。那么关键就是后面这个表达式了:*x++%4*2。其实慢慢的分析也不困难,先执行*x%4*2,然后执行x++。所以,当在执行while语句的时候,x会指向下一个字符!

 

综上所述,这个小程序就是利用一个字符串来控制输出的例子,里面运用了很多技巧,对于初学者需要很好的理解,对今后的编程是很有帮助的!

/////////////////////////////////                                             

我说的简单,其实我提到的每本书至少都够你研究很长时间的,所以希望初学者别着急不骄不躁,相信只要努力过,一定会成为高手的。
在写代码的时候大家要注意养成好的代码习惯和风格还有抽象能力。
下面给出大家在写代码的时候的20字方针:
       函数要小。
       尽量的把函数弄的通用点,代码行少点,一个函数只完成一个简单的功能,一眼就能看出来此函数有没有代码错误,每个函数都是健壮的,那么你的程序就是健壮的。
    代码要少 完成一个功能的时候在逻辑清楚的情况下代码越少越好,千万不要比代码谁写的多啊。
    算法要好 在完成一个功能的时候要考虑效率,目前计算机的内存很大,所以内存已经不是首要考虑的因素了,但是在某些特殊的地方效率还是很重要的。有效率高的算法,就不用效率低的算法,看看本版有一篇精华贴子是关于把一个字符窜两边的空格去掉的帖子(trim),很多人都提出了算法,但是有一个算法是最好的,效率最高,代码最少,是算法要好的最好体现。
    命名要清 命名要清楚,最要用汉语中的谓宾结构如set_buffsize()
文件要多 尽量把一个大的程序安功能分成多个文件,一个文件尽量不要超作1000行,这样就很清楚的知道那个文件代码是健壮的,那个文件有可能有隐患,在代码检查的时候可以有针对性的检查某几个文件。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值