孙鑫VC++ 学习笔记1

时间:2021-10-20 19:23:43
VC++画图总结


// sunxinLab1View.h : CsunxinLab1View 类的接口
//




#pragma once




class CsunxinLab1View : public CView
{
protected: // 仅从序列化创建
CsunxinLab1View();
DECLARE_DYNCREATE(CsunxinLab1View)


// 属性
public:
CsunxinLab1Doc* GetDocument() const;


// 操作
public:
CPoint m_point;
bool IsDraw ;
// 重写
public:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);


// 实现
public:
virtual ~CsunxinLab1View();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif


protected:


// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
};


#ifndef _DEBUG // sunxinLab1View.cpp 中的调试版本
inline CsunxinLab1Doc* CsunxinLab1View::GetDocument() const
{ return reinterpret_cast<CsunxinLab1Doc*>(m_pDocument); }
#endif






// sunxinLab1View.cpp : CsunxinLab1View 类的实现
//


#include "stdafx.h"
#include "sunxinLab1.h"


#include "sunxinLab1Doc.h"
#include "sunxinLab1View.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif




// CsunxinLab1View


IMPLEMENT_DYNCREATE(CsunxinLab1View, CView)


BEGIN_MESSAGE_MAP(CsunxinLab1View, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()


// CsunxinLab1View 构造/析构


CsunxinLab1View::CsunxinLab1View()
{
// TODO: 在此处添加构造代码
IsDraw = false;
}


CsunxinLab1View::~CsunxinLab1View()
{
}


BOOL CsunxinLab1View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式


return CView::PreCreateWindow(cs);
}


// CsunxinLab1View 绘制


void CsunxinLab1View::OnDraw(CDC* /*pDC*/)
{
CsunxinLab1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;


// TODO: 在此处为本机数据添加绘制代码
}






// CsunxinLab1View 打印


BOOL CsunxinLab1View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}


void CsunxinLab1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}


void CsunxinLab1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}




// CsunxinLab1View 诊断


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


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


CsunxinLab1Doc* CsunxinLab1View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CsunxinLab1Doc)));
return (CsunxinLab1Doc*)m_pDocument;
}
#endif //_DEBUG




// CsunxinLab1View 消息处理程序


void CsunxinLab1View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_point = point;
IsDraw = true;
CView::OnLButtonDown(nFlags, point);
}


void CsunxinLab1View::OnLButtonUp(UINT nFlags, CPoint point)
{

// TODO: 在此添加消息处理程序代码和/或调用默认值




// CClientDC dc(GetParent());//or this
//dc.MoveTo(m_point);
//dc.LineTo(point);


////第二种方式
//CDC* cdc = GetDC();
//cdc->MoveTo(m_point);
//cdc->LineTo(point);
//::ReleaseDC(AfxGetMainWnd()->m_hWnd,cdc);




////画到桌面上
// CWindowDC dc(GetDesktopWindow());//or this
//dc.MoveTo(m_point);
//dc.LineTo(point);


////红颜色的画笔
//CDC* cdc = GetDC();
//CPen pen(/*PS_SOLID,PS_DOT*/PS_DASH,1,RGB(255,0,0));
//cdc->SelectObject(&pen);
// cdc->MoveTo(m_point);
// cdc->LineTo(point);


////画刷的使用,画矩形


//CClientDC dc(this);
//CBrush brush(/*PS_SOLID,PS_DOT*/RGB(0,0,0));
//dc.SelectObject(&brush);
//dc.FillRect(new CRect(m_point,point),&brush);
//cdc->MoveTo(m_point);
//cdc->LineTo(point);


IsDraw = false;




CView::OnLButtonUp(nFlags, point);
}


void CsunxinLab1View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(IsDraw){
CDC* cdc = GetDC();
cdc->MoveTo(m_point);
cdc->LineTo(point);
m_point = point;
CView::OnMouseMove(nFlags, point);
}
}






=============================================




文本处理总结


// sunxinLab2View.h : CsunxinLab2View 类的接口
//




#pragma once




class CsunxinLab2View : public CView
{
protected: // 仅从序列化创建
CsunxinLab2View();
DECLARE_DYNCREATE(CsunxinLab2View)


// 属性
public:
CsunxinLab2Doc* GetDocument() const;


// 操作
public:
CBitmap m_bitmap;
CPoint m_inputPosition;
CStringList m_strLst;
int m_nWidth;
// 重写
public:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);


// 实现
public:
virtual ~CsunxinLab2View();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif


protected:


// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnTimer(UINT_PTR nIDEvent);
};


#ifndef _DEBUG // sunxinLab2View.cpp 中的调试版本
inline CsunxinLab2Doc* CsunxinLab2View::GetDocument() const
{ return reinterpret_cast<CsunxinLab2Doc*>(m_pDocument); }
#endif




// sunxinLab2View.cpp : CsunxinLab2View 类的实现
//


#include "stdafx.h"
#include "sunxinLab2.h"


#include "sunxinLab2Doc.h"
#include "sunxinLab2View.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif




// CsunxinLab2View


IMPLEMENT_DYNCREATE(CsunxinLab2View, CView)


BEGIN_MESSAGE_MAP(CsunxinLab2View, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_WM_CREATE()
ON_WM_CHAR()
ON_WM_TIMER()
END_MESSAGE_MAP()


// CsunxinLab2View 构造/析构


CsunxinLab2View::CsunxinLab2View()
{
// TODO: 在此处添加构造代码
m_nWidth = 0;
}


CsunxinLab2View::~CsunxinLab2View()
{
}


BOOL CsunxinLab2View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式


return CView::PreCreateWindow(cs);
}


// CsunxinLab2View 绘制


void CsunxinLab2View::OnDraw(CDC* pDC)
{
CsunxinLab2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

pDC->TextOut(0,200,_T("红亮工作室, http://hl-workroom.com"));

// TODO: 在此处为本机数据添加绘制代码
}




// CsunxinLab2View 打印


BOOL CsunxinLab2View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}


void CsunxinLab2View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}


void CsunxinLab2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}




// CsunxinLab2View 诊断


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


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


CsunxinLab2Doc* CsunxinLab2View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CsunxinLab2Doc)));
return (CsunxinLab2Doc*)m_pDocument;
}
#endif //_DEBUG




// CsunxinLab2View 消息处理程序


int CsunxinLab2View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
////创建一般的插入符


//CClientDC dc(this);
//TEXTMETRIC tm;
//dc.GetTextMetrics(&tm);
//
//CreateSolidCaret(tm.tmAveCharWidth,tm.tmHeight);
//ShowCaret();


////创建图形插入符

//m_bitmap.LoadBitmapW(IDB_BITMAP1);
//CreateCaret(&m_bitmap);
//ShowCaret();




//cdc->SelectClipPath(RGN_AND);


//for(int i = 0 ;i<300;i+=10){
// cdc->MoveTo(i,0);
// cdc->LineTo(i,300);
// cdc->MoveTo(0,i);
// cdc->LineTo(300,i);
//}


// TODO: 在此添加您专用的创建代码


m_inputPosition.x = 0;
m_inputPosition.y = 0;


m_strLst.AddTail(_T(""));
SetTimer(1,50,NULL);


CClientDC dc(this);




//CString s= _T("aaa");////获得字符串宽度
// CSize len = dc.GetTextExtent(s);




return 0;
}


////键盘事件处理
void CsunxinLab2View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//
//m_inputPosition.x = 0;
//m_inputPosition.y = 0;
// // TODO: 在此添加消息处理程序代码和/或调用默认值
//CClientDC dc(this);
//TEXTMETRIC tm;
//dc.GetTextMetrics(&tm);
//
//CBrush brush(RGB(255,255,255));
//
//CRect rect(0,0,1000,800);
//dc.FillRect(&rect,&brush);
//
//if(nChar == 0xd){//回车
// m_strLst.AddTail(_T(""));
//}
//else if(nChar == 0x8){//退格
// if(m_strLst.GetTail().Compare(_T("")) == 0){
// m_strLst.RemoveTail();
// }
// else{
// m_strLst.GetTail().Delete(m_strLst.GetTail().GetLength() - 1);
// }
//}
//else{
// m_strLst.GetTail().AppendChar(nChar);
//}
//
//POSITION rPos;
//rPos = m_strLst.GetHeadPosition();
//while (rPos != NULL)
//{
// m_inputPosition.x = 0;
// CString str = m_strLst.GetNext(rPos);
// for(int i = 0 ;i < str.GetLength();i ++){
// CString s ;
// s.AppendChar(str.GetAt(i));
// m_inputPosition.x += tm.tmAveCharWidth;
// dc.TextOut(m_inputPosition.x,m_inputPosition.y,s);
// }
// m_inputPosition.x += tm.tmAveCharWidth;
// m_inputPosition.y += tm.tmHeight;
//
//}
//m_inputPosition.y -= tm.tmHeight;
// SetCaretPos(m_inputPosition);


CView::OnChar(nChar, nRepCnt, nFlags);
}





////卡拉OK效果
void CsunxinLab2View::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值


m_nWidth++;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CRect rect(0,200,m_nWidth,tm.tmHeight + 200);
dc.SetTextColor(RGB(255,0,0));
CString s ;
s.LoadString(IDS_STRING101);
dc.DrawText(_T("红亮工作室, http://hl-workroom.com"),rect,DT_LEFT);


CView::OnTimer(nIDEvent);
}