如何在客户区显示文本以及如何添加字符串资源。理解路径层的作用。
void CTextView::OnDraw(CDC* pDC) //响应WM_PAINT消息的函数
{
CTextDoc*pDoc = GetDocument();
ASSERT_VALID(pDoc);
//TODO: add draw code for native data here
CStringstr_one("努力学习C++");
//CStringstr_two;
//str_two= "努力学习C++";
pDC->TextOut(50,50,str_one);
//pDC->TextOut(50,100,str_two);
CSizesz = pDC->GetTextExtent(str_one);
//1.添加字符串资源
CStringstr;
str.LoadString(IDS_STRINGVC);
pDC->TextOut(0,200,str);
pDC->BeginPath(); //把路径层注释起来就会只显示一个矩形,设置路径层后程序显示与原来的没有什么不同
pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);
pDC->EndPath();
pDC->SelectClipPath(RGN_DIFF/*RGN_AND*/);//把当前设置的路径层和设备描述表中已有的裁剪区域按一种指定的模式进行一个互操作
//在路径层中绘制一些网格状线条
for(inti=0; i<300; i+=10)
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
}
}
如何创建一个普通插入符,位图插入符,符合字体大小的插入符,理解窗口边界。
学会怎样设定一个定时器
int CTextView::OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CView::OnCreate(lpCreateStruct) == -1)
return-1;
//intbx = GetSystemMetrics(SM_CXBORDER);
//intby = GetSystemMetrics(SM_CYBORDER);
/*CClientDCdc(this);
TEXTMETRICtm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/5,tm.tmHeight);
ShowCaret();*/
//1.创建图形插入符
//CBitmapbitmap; //发现程序并未如愿显示图形插入符,原因在于这是个局部变量,原因在于OnCreate函数执行
//完成之后,这个bitmap对象要发生析构。通常,与资源相关联的对象,在其析构时都会把与之相关联的资源销毁。
//解决办法是把bitmap定义成CTestView类的私有成员变量。
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();
SetTimer(1,100,NULL); // 设定一个定时器
return0;
}
怎样实现字符的输入,如何选入一种字体。
void CTextView::OnChar(UINT nChar, UINTnRepCnt, UINT nFlags)
{
CClientDCdc(this);
//选择一种字体
CFontfont;
font.CreatePointFont(300,"华文彩云",NULL);
CFont*pOldFont = dc.SelectObject(&font);
//选择字体颜色
//CPenpen(PS_DOT,1,RGB(152,0,0));
//CPen*pOldPen = dc.SelectObject(&pen);
TEXTMETRICtm;
dc.GetTextMetrics(&tm);
if(0x0d== nChar)
{
m_strLine.Empty();
m_ptOrigin.y+= tm.tmHeight;
}
elseif(0x08 == nChar)
{
COLORREFclr = dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
m_strLine= m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
m_strLine+= nChar;
}
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
CSizesz = dc.GetTextExtent(m_strLine);
CPointpt;
pt.x= m_ptOrigin.x + sz.cx;
pt.y= m_ptOrigin.y;
SetCaretPos(pt);
dc.SelectObject(pOldFont); //把字体选回原来设备描述表的默认字体,恢复设备描述表
//dc.SelectObject(pOldPen);
CView::OnChar(nChar,nRepCnt, nFlags);
}
void CTextView::OnLButtonDown(UINT nFlags,CPoint point)
{
//TODO: Add your message handler code here and/or call default
SetCaretPos(point);
m_strLine.Empty();//变换插入符位置时,清空m_strLine中的字符串,显示新的
m_ptOrigin= point;
CView::OnLButtonDown(nFlags,point);
}
//字幕变色功能的实现,通过相应定时器的WM_TIMER消息来实现
void CTextView::OnTimer(UINT nIDEvent)
{
//TODO: Add your message handler code here and/or call default
m_nWidth+= 5;
CClientDCdc(this);
TEXTMETRICtm;
dc.GetTextMetrics(&tm);
CRectrect;
rect.left= 0;
rect.top= 200;
rect.right= m_nWidth;
rect.bottom= rect.top + tm.tmHeight;
dc.SetTextColor(RGB(255,0,0));
CStringstr;
str.LoadString(IDS_STRINGVC);
dc.DrawText(str,rect,DT_LEFT); //换成DT_RIGHT,DT_CENTER,DT_BOTTOM试试看
rect.top = 150;
rect.bottom= rect.top + tm.tmHeight;
dc.DrawText(str,rect,DT_RIGHT);
CSizesz = dc.GetTextExtent(str);
if(m_nWidth> sz.cx)
{
m_nWidth= 0;
dc.SetTextColor(RGB(0,255,0));
dc.TextOut(0,200,str);
}
CView::OnTimer(nIDEvent);
}
谨记:
1. 对一个变量进行自加自减时一定要初始化,不然他的初始值是未知的,结果是不正确的。
2. 通过学习这些知识希望能够拓宽编程的思路,培养发散性思维方式,对于一个问题的解决,要从多个方面考虑,而不要陷入固定的思维模式中