标签:
VC++ 深入详解 孙鑫
***VC++学习--《VC++深入详解》孙鑫 第五章 文本编程 学习心得***
exploer
今天学习了 《VC++深入详解》孙鑫 第五章 文本编程,练习了书上的实例程序,记录再次,身边写点心得,o(∩_∩)o…
P155:
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
/*
//CString str("VC++ 深入编程");
CString str;
str.LoadString(ID_out);//ID_out是自己定义的字符串资源
dc.TextOut(300,300,str);
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
*/
CString str;
str.LoadString(ID_out);//载入字符串
dc.TextOut(100,100,str);
CSize sz="dc".GetTextExtent(str);//获取特定字符串在屏幕上所占的矩形区域,注意和GetTextMetrics()的区别,或者是获取所用字体的字体信息,长和宽只是其中之一
CPen pen(2,1,RGB(200,100,125));
dc.SelectObject(pen);
//路径层的使用
dc.BeginPath();
dc.Rectangle(100,100,100+sz.cx,100+sz.cy);
//dc.TextOut(500,500,str);
dc.EndPath();
dc.SelectClipPath(RGN_XOR);//设置路径层和客户区的耦合方式
//绘制网格,观察使用路径层的效果
for(int i="0";i<500;i+=10)
{
dc.MoveTo(0,i);
dc.LineTo(500,i);
dc.MoveTo(i,0);
dc.LineTo(i,500);
}
}
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd ::OnCreate(lpCreateStruct) == -1)
return -1;
//创建插入符
// TODO: Add your specialized creation code here
// CClientDC dc(this);
//TEXTMETRIC tm;
//dc.GetTextMetrics(&tm);
//CreateSolidCaret(tm.tmAveCharWidth,tm.tmHeight);
//使用位图插入符
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
return 0;
}
void CChildView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//响应 char 字符输入事件
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CFont font;
font.CreatePointFont(300,"隶书",NULL);//第一个参数为字体高度
CFont *poldfont=dc.SelectObject(&font);
TEXTMETRIC tm; //结构体,用于存储字体信息
dc.GetTextMetrics(&tm);
/*
处理换行符
采用这样的处理方法会导致一旦换行,以前输入的字符串就丢失了,在运行的时候换行并不会使屏幕上以前输入的字符串消失,是因为字符串的输入并不会导致窗口重绘,所看到的并不只是当前字符串的内容。只要触发窗口重绘事件,以前输入的字符串就会消失,比如最小化,失去焦点,改变窗口大小等等。
*/
if(nChar==0x0d)
{
m_strLine.Empty();
m_pOrign.y+=tm.tmHeight;// m_pOrign为鼠标左键单击确定的字符输出起点
}
/*
处理退格键,采用取巧的办法:
现获取文本背景颜色,在设置字体颜色为以上颜色并输出,这样文本输出后就看不见了,相当于隐藏了;再把储存的字符串删除一个字符,再按原来字体的颜色输出即可达到删除一个字符的效果。
*/
else if(nChar==0x08)
{
COLORREF clr="dc".SetTextColor(dc.GetBkColor());
dc.TextOut(m_pOrign.x,m_pOrign.y,m_strLine);
m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
//处理正常的输入字符
else
{
m_strLine+=nChar;
}
CSize sz="dc".GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_pOrign.x+sz.cx;
pt.y=m_pOrign.y;
//CWnd::SetCaretPos(pt);
SetCaretPos(pt);
dc.TextOut(m_pOrign.x,m_pOrign.y,m_strLine);
dc.SelectObject(poldfont);
CWnd ::OnChar(nChar, nRepCnt, nFlags);
}
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd::SetCaretPos(point);
m_strLine.Empty();
m_pOrign=point;
CWnd ::OnLButtonDown(nFlags, point);
}
备注:
WM_PAINT 消息
WN_PAINT消息通知程序,全部或部分客户窗口需要重新绘制。当用户在最小化、重叠或调整客户窗口区域的时候,就会产生这条消息。
系统分类:
软件开发 | 用户分类:
VC++学习 | 来源:
原创 | 【推荐给朋友】