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

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);}
   如果只有一个定时器,当然就不需要辩识这个标志了
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值