VC++深入详解 (chapter 5)

 

#include "stdafx.h"
#include "chapter5.h"

#include "chapter5Doc.h"
#include "chapter5View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CChapter5View

IMPLEMENT_DYNCREATE(CChapter5View, CView)

BEGIN_MESSAGE_MAP(CChapter5View, CView)
 //{{AFX_MSG_MAP(CChapter5View)
 ON_WM_CREATE()
 ON_WM_CHAR()
 ON_WM_LBUTTONDOWN()
 ON_WM_TIMER()
 //}}AFX_MSG_MAP
 // Standard printing commands
 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/
// CChapter5View construction/destruction

CChapter5View::CChapter5View()
{
 // TODO: add construction code here
 m_strLine = "";
 m_ptOrigin = 0;
 m_nWidth  = 0;

}

CChapter5View::~CChapter5View()
{
}

BOOL CChapter5View::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: Modify the Window class or styles here by modifying
 //  the CREATESTRUCT cs

 return CView::PreCreateWindow(cs);
}

/
// CChapter5View drawing

//  实现字符串的输出

void CChapter5View::OnDraw(CDC* pDC)
{
 CChapter5Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 //当这个函数被调用时,应用框架会构造一个CDC类对象指针并传递给这个函数,这给我们
 //提供了方便,在这个函数内部就不需要再去调用CDC类的对象,可以直接使用传递过来的
 //CDC对象指针去调用CDC类的成员函数,完成绘制的功能
 // 1 创建一个字符串
 CString str("MFC");
 // 2 显示一个字符串
 pDC->TextOut(50,100,str);
    // 3 得到一个字符串的信息
 // GetTextMetrics函数得到的是社别描述表中当前字体的度量信息
 // GetTextExtent函数得到的是某个特定字符串在窗口中显示时所占据的宽度和高度
 CSize sz = pDC->GetTextExtent(str);
    // 从string table中加载字符串
 str.LoadString(IDS_STRING61446);
 pDC->TextOut(50,150,str);
    // 创建路径层是利用CDC类提供的BeginPath和EndPath这两个函数实现的
 //首先利用前者在设备描述表中打开一个路径层,然后完成设备接口提供的绘图函数进行绘图操作
 // 最后在绘图操作完成之后,应用程序通过调用EndPath函数关闭这个路径层
 pDC->BeginPath();

 pDC->Rectangle(50,100,50+sz.cx,100+sz.cy);

 pDC->EndPath();

    //该函数的作用是把当前设置的路径层和设备描述表已有的裁剪区域按照
 //一种指定的模式进行一个操作
 pDC->SelectClipPath(RGN_DIFF);

 for (int i = 0;i <= 300; i+=10)
 {
  pDC->MoveTo(0,i);
  pDC->LineTo(300,i);
        //画横线
  pDC->MoveTo(i,0);
  pDC->LineTo(i,300);
  // 画竖线
 }


}

/
// CChapter5View printing

BOOL CChapter5View::OnPreparePrinting(CPrintInfo* pInfo)
{
 // default preparation
 return DoPreparePrinting(pInfo);
}

void CChapter5View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
 // TODO: add extra initialization before printing
}

void CChapter5View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
 // TODO: add cleanup after printing
}

/
// CChapter5View diagnostics

#ifdef _DEBUG
void CChapter5View::AssertValid() const
{
 CView::AssertValid();
}

void CChapter5View::Dump(CDumpContext& dc) const
{
 CView::Dump(dc);
}

CChapter5Doc* CChapter5View::GetDocument() // non-debug version is inline
{
 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CChapter5Doc)));
 return (CChapter5Doc*)m_pDocument;
}
#endif //_DEBUG

/
// CChapter5View message handlers

int CChapter5View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 // TODO: Add your specialized creation code here
 /*
 // 创建一个插入符
 // 1 创建一个设备描述表
 CClientDC dc(this);
 // 2 定义一个文本信息结构体变量
 TEXTMETRIC tm;
 // 3 获得设备描述表中的文本信息
 dc.GetTextMetrics(&tm);
 // 4 根据字体的大小,创建合适的插入符
 CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
 // 5 显示插入符
 ShowCaret();
 */
 // 创建一个位图插入符
 // 1 创建一个位图资源,注意其中可以用全局变量和静态成员变量
 //了解静态成员变量的含义以及在此处用到的含义
 static CBitmap m_bitmap;
    // 2 下载位图资源
 m_bitmap.LoadBitmap(IDB_BITMAP1);
    //创建位图插入符
 CreateCaret(&m_bitmap);
    //显示插入符
 ShowCaret();

 SetTimer(1,100,NULL);
 
 
 return 0;
}

void CChapter5View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 // 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(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);
  //GetLength函数可以得到字符串中字符的个数
  //Left(int nCount)函数实现返回字符串左边指定数目的字符
  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);

 CSize sz = dc.GetTextExtent(m_strLine);

 CPoint pt;

 pt.x = m_ptOrigin.x + sz.cx + tm.tmAveCharWidth;
 pt.y = m_ptOrigin.y;

 SetCaretPos(pt);

 dc.SelectObject(pOldFont);
 
 CView::OnChar(nChar, nRepCnt, nFlags);
}

void CChapter5View::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 SetCaretPos(point);
    //清空字符串
 m_strLine.Empty();

 m_ptOrigin = point;
 
 CView::OnLButtonDown(nFlags, point);
}
//滑动显示
void CChapter5View::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
   
    m_nWidth +=5;
 
 CClientDC dc(this);

 TEXTMETRIC tm;

 dc.GetTextMetrics(&tm);

 CRect rect;

 rect.left = 0;

 rect.top = 200;

 rect.right = m_nWidth;

 rect.bottom = rect.top + tm.tmHeight;

 dc.SetTextColor(RGB(255,0,0));

 CString str;

 str.LoadString(IDS_STRING61447);

 dc.DrawText(str,rect,DT_LEFT);

 CSize sz = 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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值