文本编程

1.CreateSolidCaret:创建实线矩形的插入符号

void CreateSolidCaret( int nWidth, intnHeight);nWidth:宽;nHeight:高。

   ShowCaret:

使插入符号的大小与当前DC中的字体大小一致。

GetTextMetrics

TEXTMETRIC Structure

tmHeight
Specifies the height (ascent + descent) of characters.
tmAscent
Specifies the ascent (units above the base line) of characters.
tmDescent
Specifies the descent (units below the base line) of characters
tmAveCharWidth
Specifies the average width of characters in the font (generally defined as the width of the letter x). This value does not include the overhang required for bold or italic characters.
	CClientDC dc(this);
	TEXTMETRIC textmetric;
	dc.GetTextMetrics(&textmetric);
	CreateSolidCaret(textmetric.tmAveCharWidth/8,textmetric.tmHeight);
	ShowCaret();


2.CreateCaret:创建图形插入符号

void CreateCaret( CBitmap* pBitmap );

CBitmap*如何获得?

先创建一个CBitmap类型的对象 CBitmap bitmap;

再调用CBitmap的初始化函数如LoadBitmap等来初始化位图:bitmap.LoadBitmap(IDB_BITMAP1);在此之前,我们要去创建一个ID为IDB_BITMAP1的位图资源。

The bitmap must have previously been created by the CBitmap::CreateBitmap member function, theCreateDIBitmap Windows function, or theCBitmap::LoadBitmap member function.

 

	CBitmap bitmap;
    bitmap.LoadBitmap(IDB_BITMAP1);


3.问题来了!

我们知道,创建插入符号的代码是写在OnCreate中的。

而OnCreate调用之后,窗口才显示出来。也就是说我们运行程序,看到窗口时,OnCreate已经执行完毕了。而bitmap是定义在其中的局部对象,函数结束时该对象就被析构。对象都已经被析构了,我们当然看不见图形插入符了

解决方案:

把CBitmap bitmap作为CTextView的成员

总结:MFC与SDK程序的区别在于:MFC把函数封装在类中。SDK程序中,我们直接调用API函数即可。在MFC中我们却要先创建对象,再通过对象来调用函数。

我们可以简单地把函数分为窗口显示前调用的函数 和窗口显示后调用的函数。而这些函数都是通过窗口对象调用的。整个过程中该对象总是有生命的,直到程序终止。

窗口显示前的函数主要实现窗口的创建(如Create),窗口显示前的初始化(如OnCreate)。当我们编译连接之后,运行程序时,看到窗口(即窗口显示了)时,这些函数都已经执行完毕且返回了。在这些函数中创建的局部变量或对象也都已经清除或析构了。我们当然看不到相应的初始化状态。因此,当我们在窗口显示的初始化函数(如OnCreate,OnInitDialog)中定义局部变量或对象时,我们应该把这些变量设置成全局的或者是类的数据成员或者用new而不delete

窗口显示后的函数主要实现消息响应。当然窗口显示前也有消息响应。如OnCreate就是对WM_CREATE消息的响应。

 

4.GetSystemMetrics

5.OnCreate

WM_CREATE消息在应用程序调用CreateWindowEx或CreateWindow函数时被发送出去。

调用这两个函数是为了创建窗口。

WM_CREATE消息在这两个函数返回之前发送。

新窗口的窗口过程在这个窗口创建之后,窗口可见之前接收这个消息。

The WM_CREATE message is sent when an application requests that a window be created by calling theCreateWindowEx orCreateWindow function. (The message is sent before the function returns.) The window procedure of the new window receives this message after the window is created, but before the window becomes visible.

具体顺序为:

应用程序调用Create创建窗口

窗口创建完成,但Create函数未返回

发送WM_CREATE消息

OnCreate响应消息

Create函数返回

窗口显示(可见)。

与之类似的有WM_INITDIALOG,OnInitDialog

 

 6.Ondraw

7.CString

LoadString

可以看到,以Load开头的函数都是用来加载现存资源的。将该资源与调用该函数的类对象关联(attach)起来。

 类对象的初始化方法:1.构造函数;2.Create函数3Load。。。.

8.BeginPath

   EndPath

在BeginPath和EndPath间绘制的图形,并不是用来在窗口中显示的。它是用来圈出一块区域:Rectangle画出的一个矩形范围。

EndPath以后,我们再调用有关的函数来实现与之前圈出的一块区域之间的互操作。

BeginPath&EndPath

 

	pDC->BeginPath();
	pDC->Rectangle(50,50,50+size.cx ,50+size.cy );
	pDC->EndPath();
	pDC->SelectClipPath(RGN_DIFF);//剪切区域:限定一个作图区域。该函数选择当前的剪切区域,并排除当前路径(RGN_DIFF)
	pDC->TextOut(50,50,str);//看不到输出的文字,因为上面把文字输出的区域排除出了剪切区域,无法在该区域作图。


 

9.GetTextExtent

CDC::GetTextExtent

CSize GetTextExtent( const CString& str ) const;

CSize SIZE

 

typedef struct tagSIZE {
    int cx;
    int cy;
} SIZE;

 

 

	CString str;
	str.LoadString (IDS_WEIXIN);
	//pDC->TextOut(50,50,str);
	CSize size=pDC->GetTextExtent(str);
	//char ch[10];
	//MessageBox(itoa(size.cy,ch,10));
	pDC->BeginPath();
	pDC->Rectangle(50,50,50+size.cx ,50+size.cy );
	pDC->EndPath();

GetTextExtent:获取指定字符串的宽,高。并返回到一个CSize对象中。而CSize和SIZE结构体基本可以通用。

 

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页