您的位置:首页 > 编程语言 > C语言/C++

孙鑫vc++ 第五课 笔记 CDC的文字处理

2007-05-24 19:23 253 查看
CDC的文字处理

1、在CView客户区中放置插入符
CWnd::CreateSolidCaret
void CreateSolidCaret(int nWidth, int nHeight); //宽度,高度,创建后默认是隐藏的

CWnd::ShowCaret
void ShowCaret(); //显示插入符

插入符的大小应该和dc中使用的字体的大小相适应
获取dc中字体的信息
CDC::GetTextMetrics
Bool GetTextMetrics(LPTEXTMETRIC lpMetrics) const //用一个文字结构体保存当前dc字体信息

TEXTMETRIC Structure //文字结构体

CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm); //我在此常犯的错误,认为参数需要指针类型,就定义指针类型,记住了
CreateSolidCaret(tm.tmaveCharWidth/8,tm.tmHeight);
ShowCaret();

2、创建图形插入符
CWnd::CreateCaret
void CreateCaret(CBitmap* pBitmap);

CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();

此时位图插入符并没有显示出来,因为bitmap是一个局部变量,离开OnCreate()后就自动销毁了,只要把位图对象定义到cview类中就可以了
但为什么上一个例子中同为局部对象的TEXTMETRIC tm;没有导致插入符不显示呢?我想应该是因为CreateSolidCaret()和CreateCaret()不同导致的,前者需要的仅仅是一个信息,拿到后就可以工作了,不需要了,而后者需要的是一个位图指针,一个实例对象,实例消失的时候,当然就什么都没有了

3、OnDrew()在每次窗口重绘的时候被调用,可以用来显示文字,避免重绘导致文字消失
CString 没有基类
CString(const CString& stringSrc);
CString(TCHAR ch, int nRepeat=1);
CString(LPCTSTR lpch, int nLength);
CString(const unsigned char* psz);
CString(LPCWSTR lpsz);
CStringLPCSTR lpst);

CString::LoadString
BOOL LoadString(UINT nID); //载入一个字符串资源,在资源String Table里定义,就当初始化吧

4、路径层
CDC::BeginPath
BOOL BeginPath(); //打开一个路径层,随后可用gdi函数在该路径当中绘画

CDC::EndPath
BOOL EndPath(); //关闭路径层

5、字符串的象素长度
CDC::GetTextExtent
CSize GetTextExtent(LPCTSTR lpszString, int nCount) const;
CSize GetTextExtent(const CString& str) const;

CSize 和 Size 的结构一样
typedef struct tagSIZE
{
int cx; //长
int cy; //高
}Size;

CDC::SelectClipPath
BOOL SelectClipPath(int nMode); //选择路径层操作模式,把层和现存的区域按指定模式进行操作
RGN_AND //周围的线画不进来
RGN_DIFF //线只画进层中

CString str("***");
pDC->TextOut(50,50,str); //指定位置输出字符串
CSize sz=pDC->GetTextExtent(str); //获取字符串象素宽高

pDC->BeginPath(); //路径层开始
pDC->Rectangle(50,50,50+sz.x,50+sz.y); //画矩形,在层内了
pDC->EndPath(); //层结束
pDC->SelectClipPath(RGN_AND); //层操作模式设置
for(int i=0;i<300;i+=10) //画线,检验效果
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}

6、移动插入符
CWnd::SetCarePos
static void PASCAL SetCarePos(POINT point);

获取背景色
CDC::GetBkColor
COLORREF GetBkColor() const;

设置文本颜色
CDC::SetTextColor
virtual COLORREF SetTextColor(COLORREF crColor);

左取字符串
CString::Left
CString Left(int nCount) const;

获取字符串个数
CString::GetLength
int GetLength();

7、CFont : CGdiObject : CObject
CFont::CFont
CFont(); //构造函数没有提供初始化操作,必须用初始化函数完成初始化,和CBitmap一样

CFont::CreatePointFont
BOOL CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, CDC* pDC=NULL);

CFont font;
font.CreatePointFont(300,"华文行楷",NULL);
CFont *pOldFont=dc.SelectObject(&font);
........
dc.SelectObject(pOldFont);

8、如果要做字处理程序,可以让CView继承CEditView和CRichEditView,使用这两个类丰富的现成的功能

9、用DrawText()可以实现文字平滑输出的效果
CDC::DrawText
virtual int DrawText(LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat);
int DrawText(const CString& str, LPRECT lpRect, UINT nFormat);
字符串,矩形,显示类型
定时器
CWnd::SetTimer
UINT SetTimer(UINT nIDEvent, UINT nElapse, void(CALLBACK EXPORT* lpfnTimer)(HWND,UINT,UINT,DWORD)); //定时器标志,发送消息时间间隔,回调函数(不用就填NULL)

定时器标志有什么用?
在定时器消息WM_TIMER的处理函数OnTimer()中有一个参数,传入定时器标志,可以选择执行定时器
void CTextView::OnTimer(UINT nIDEvent) { .... CView::OnTimer(nIDEvent);}
如果只有一个定时器,当然就不需要辩识这个标志了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: