日志档案

发表于 2008-1-14 15:15:59

0

标签: VC++  深入详解  孙鑫  

VC++学习--《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++学习   |   来源: 原创   |   【推荐给朋友】

    阅读(575)    回复(0)  

投一票您将和博主都有获奖机会!