⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 05.2.1 ondraw函数.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 TXT
字号:
5.2.1 OnDraw函数
在 CTextView类中, OnDraw函数的定义如例 5-4所示。
例 5-4 

void CTextView: : OnDraw(CDC* pDC) CTextDoc* pDoc = GetDocument(); 
ASSERT_VAL工 o (pDoc) ; 
// TODO: add draw code for native data here 
我们可以在此函数处设置一个断点,调试运行程序,看看程序调用这个函数的时机。我们知道当窗口初次出现时,即从无到有时,会产生 WM_PAINT消息,让窗口重绘,这时程序停在所设置的 OnDraw函数断点处。继续调试程序,在调试过程中,可以看到,每次窗口要出现的时候,就会进入 OnDraw函数。因此,如果希望输入的图形或文字始终能够在窗口上显示的话,就可以在这个 OnDraw函数中进行处理。
另外,从这个函数的定义可知,当它被调用时,应用程序框架会构造一个 CDC类对象的指针并传递给这个函数,这给我们提供了方便,在这个函数内部就不需要再去构造 CDC类的对象,可以直接使用传递进来的 CDC对象指针去调用 CDC类的成员函数,完成绘制功能。
接下来,我们要实现在程序窗口中输出一串文字这一功能,这可以使用第 1章中介绍的 TextOut这个函数来实现。在 C语言中,如果要使用宇符串的话,一般是定义一个 char*类型的变量。在 MFC中,它提供了一个字符串类: CString,这个类没有基类。一个 CString对象由一串可变长度的宇符组成。在 C语言中,利用 char类型指针操作宇符串时,一旦给它分配了堆内存,那么它就只能存储己分配大小的字符数量。如果想要另外再多存储些字符,就只能对这个指针所指向的堆内存进行再分配。然而,利用 CString操作字符串时,无论存储多少个字符,我们都不需要对它进行内存分配,因为这些操作在 CString类的内部都己经替我们完成了,这就是 CString类的好处。在 MFC程序中利用 CString类对宇符串进行操作是很方便的。读者可以在 MSDN中查看 CString类的成员,将会发现它重载了多个操作符,这为我们操作 CString类的对象提供了极大的便利。可以把 CString类型的对象当作简单类型的变量一样进行赋值、相加操作,例如利用"="操作符,可以直接把一个字符或另一个 CString类型的字符串赋给一个 CString类型的对象:利用"+"操作符,可以方便地把两个字符串或一个字符与一个字符串联成一个字符串。 
       CString类提供了多个重载的构造函数(如例 5-5代码所示),利用这些构造函数,我们可以构造一个空的 Cstring对象,或者用一个己有的 CString对象构造一个新的 CString对象,或者用一个字符指针构造一个 CString对象。
例 5-5 

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 } ; 
例 5-6所示代码就是利用 CString类在 OnDraw函数内实现字符串显示的代码:例 5-6 
void CTextView : : OnDraw(CDC* pDC} 
{ CTextDoc * pDoc = GetDocurnent(} ; 
ASSERT_VALID(pDoc} ; 
// TODO: add draw code for native data here 
CString str("C++深入编程") ;
 pDC->TextOut(50 , 50 , str) ; 
注意: CDC封装的 TextOut函数与阳form SDK提供的会图 TextOut
函数的区别:前者不需要 DC句柄作为参数,因为 CDC内部专门有一个成员变量( 没m_hDC)保存了 DC句柄。 
Build并运行 Text程序,可以看到在程序窗口中输出了我们指定的字符串,如图 5.8所示。并且可以发现,当窗口大小发生改变时,字符串仍显示在窗口当中,这是因为我们是在 OnDraw函数中实现字符串的显示操作的。
图 5 .8 字符串显示结果 

下面是另一种 CString字符串构造形式: 

CString str; 
str = "VC++ 深入编程"; 
CString类重载了" ="操作符,可以直接把一个字符串赋给一个 CString对象。读者可以试试这段代码,将会发现程序运行结果是一样的。 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -