1.CWnd::CreateSolidCaret创建插入符,ShowCaret()显示插入符。GetTextMetrics(),获得当前字体的一些信息。CWnd::CreateCaret()创建图象插入符bitmap.LoadBitmap(IDB_BITMAP1);//此处的bitmap为成员变量!!!CreateCaret(&bitmap);ShowCaret();TEXTMETRIC tm;//字体结构体dc.GetTextMetrics(&tm);//m_ptOrigin.y+=tm.tmHeight;//获得字体高度。2.VC中CString::LoadString(ID号),比较方便。3.路径层的概念:有两种方法创建路径层: (1)pDC->BeginPath();pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);pDC->EndPath();pDC->SelectClipPath(RGN_DIFF); (2) CSize sz=pDC->GetTextExtent(str); CRgn rn; rn.CreateRectRgn(0,50,sz.cx,sz.cy); pDC->SelectClipRgn(&rn,RGN_DIFF);路径层有什么作用?可以保护我们先前的文本或者图像不被后来画的覆盖。4.在View上输入文字的步骤。CFont font;//创建字体对象font.CreatePointFont(300,"华文行楷",NULL);//设置CFont *pOldFont=dc.SelectObject(&font);//将字体选择到DC中TEXTMETRIC tm;//创建字体信息对象dc.GetTextMetrics(&tm);//获得当前字体信息if(0x0d==nChar)//处理回车键{ m_strLine.Empty(); m_ptOrigin.y+=tm.tmHeight;}else if(0x08==nChar)//处理退格键{ COLORREF clr=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;}CSize sz=dc.GetTextExtent(m_strLine); CPoint pt;//处理光标的位置pt.x=m_ptOrigin.x+sz.cx;pt.y=m_ptOrigin.y; SetCaretPos(pt);dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);//输出字体 dc.SelectObject(pOldFont);//将原先的字体选择回去。5.模拟卡啦OK变色的步骤。 (1)设置定时器 (2)在定时器中加入如下代码//DEL m_nWidth+=5;//此为view的成员变量,初始值为0//DEL //DEL //DEL CClientDC dc(this);//DEL TEXTMETRIC tm;//DEL dc.GetTextMetrics(&tm);//DEL CRect rect;//DEL rect.left=0;//DEL rect.top=200;//DEL rect.right=m_nWidth;//DEL rect.bottom=rect.top+tm.tmHeight;//此长方形的长度随着定时器的触发,逐渐增大//DEL //DEL dc.SetTextColor(RGB(255,0,0));//DEL CString str;//DEL str.LoadString(IDS_WEIXIN);//DEL dc.DrawText(str,rect,DT_LEFT);此函数的作用是将字符串输出到长方形中,但如果字符串的长度超过长方形的长度,多余的字符将被截断//DEL //DEL rect.top=150;//DEL rect.bottom=rect.top+tm.tmHeight;//DEL dc.DrawText(str,rect,DT_RIGHT);//DEL //DEL CSize sz=dc.GetTextExtent(str);获得字符串的长度//DEL if(m_nWidth>sz.cx)当长方形的长度大于字符串的长度后,将其重新归0//DEL {//DEL m_nWidth=0;//DEL dc.SetTextColor(RGB(0,255,0));//DEL dc.TextOut(0,200,str);//DEL }//DEL //DEL CView::OnTimer(nIDEvent);6.SetTimer也可以用回调函数来操作,但并不方便。以下是步骤 (1) 在View的OnCreate消息响应函数中:SetTimer(1,1000,Timer2Proc); (2) 回调函数的实现:void CALLBACK EXPORT Timer2Proc( HWND hWnd, // handle of CWnd that called SetTimer UINT nMsg, // WM_TIMER UINT nIDEvent, // timer identification DWORD dwTime // system time){// MessageBox((((CMainFrame *)AfxGetMainWnd())->m_hWnd),"ddfaf","weixin",0);;CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;//获得MainFrame的指针CTextView *pView=(CTextView *)pMain->GetActiveView();//获得view的指针CClientDC dc(pView);//构造DC dc.TextOut(333,222,"hello world"); }//我们可以看出,使用回调函数时要获得窗口或者APP的指针,给我们的操作带来麻烦。并不方便。

评论