主要是画图什么的.
按照书上敲代码,没有发现什么大的问题,就是一些设置事件监听和添加成员变量的方法和位置变了
// WindowView.cpp : CWindowView类的实现 #include "stdafx.h" #include "Window.h" #include"WindowDoc.h" #include"WindowView.h #ifdef _DEBUG #define newDEBUG_NEW #endif // CWindowView IMPLEMENT_DYNCREATE(CWindowView,CView) BEGIN_MESSAGE_MAP(CWindowView,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_LBUTTONUP() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() END_MESSAGE_MAP() // CWindowView 构造/析构 CWindowView::CWindowView(): m_ptOrigin(0), m_bDraw(0), m_ptOld(0) { // TODO: 在此处添加构造代码 //初始时,鼠标左键未按下 m_bDraw = FALSE; } CWindowView::~CWindowView() { } BOOLCWindowView::PreCreateWindow(CREATESTRUCT&cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs来修改窗口类或样式 returnCView::PreCreateWindow(cs); } // CWindowView 绘制 void CWindowView::OnDraw(CDC*) { CWindowDoc* pDoc =GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO:在此处为本机数据添加绘制代码 } // CWindowView 打印 BOOLCWindowView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 returnDoPreparePrinting(pInfo); } voidCWindowView::OnBeginPrinting(CDC* , CPrintInfo* ) { // TODO:添加额外的打印前进行的初始化过程 } void CWindowView::OnEndPrinting(CDC*, CPrintInfo* ) { // TODO:添加打印后进行的清理过程 } // CWindowView 诊断 #ifdef _DEBUG void CWindowView::AssertValid()const { CView::AssertValid(); } voidCWindowView::Dump(CDumpContext& dc)const { CView::Dump(dc); }
CWindowDoc*CWindowView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWindowDoc))); return(CWindowDoc*)m_pDocument; } #endif //_DEBUG // CWindowView消息处理程序 void CWindowView::OnLButtonUp(UINTnFlags, CPoint point) { // TODO:在此添加消息处理程序代码和/或调用默认值 //MessageBox(_T("鼠标抬起!")); //左键抬起了 m_bDraw = FALSE; CView::OnLButtonUp(nFlags,point); } void CWindowView::OnLButtonDown(UINTnFlags, CPoint point) { // TODO:在此添加消息处理程序代码和/或调用默认值 //MessageBox(_T("鼠标点击!"));4 m_ptOrigin = point; //鼠标左键按下了 m_bDraw = TRUE; //按下时,记录边缘开始的点 m_ptOld = point; CView::OnLButtonDown(nFlags,point); } void CWindowView::OnMouseMove(UINTnFlags, CPoint point) { // TODO:在此添加消息处理程序代码和/或调用默认值 //当鼠标左键按下并移动时,画线 CClientDC dc(this); CPenpen(PS_SOLID,1,RGB(255,0,0)); CPen *pOldPen =dc.SelectObject(&pen); if(m_bDraw){ dc.MoveTo(m_ptOrigin); dc.LineTo(point); //注释掉改行,可以使得每次按下鼠标左键并移动时,会以开始点为中心绘制很多条线段 //m_ptOrigin = point;//每次画完,都将终点作为下一次的起点 dc.LineTo(m_ptOld);//绘制边缘,从新确定的点到原来的边缘点 m_ptOld = point; } dc.SelectObject(pOldPen); CView::OnMouseMove(nFlags,point); }
主要是获得DC,使用了MFC封装的CDC及其子类.CClientDC来获取DC,管理DC.
其中有几个什么RGB啊,CRect啊,CPen啊CBrush啊,这些东西的
还有个CBitmap位图对象,使用这个位图来作为画刷.这里用到了LoadBitmap去加载位图资源的.
还有个透明画刷的,使用GetStockObject去获取一个空画刷,又要强制转换类型从HGDIOBJECT转换为HBRUSH类型.然后通过静态方法 CBrush::FromHandle从该句柄获取一个画刷指针.
前面还讲了那个消息映射表,在MFC中没有使用虚函数来实现消息的映射,而是自建消息映射表.每个可操作的类的宏定义中,有相关数据.例如
在我们的WindowView.cpp中
BEGIN_MESSAGE_MAP(CWindowView,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_LBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
这就是消息映射表,这里的就有我们添加的鼠标左键按下,抬起,移动的相关信息.
在WindowView.h中
public:
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
public:
afx_msg void OnLButtonDown(UINTnFlags, CPoint point);
public:
afx_msg void OnMouseMove(UINT nFlags,CPoint point);
这些就是映射关系,对应的事件调用的函数.
哈有就是我们自己编写的事件处理函数了.这三部分就是消息映射表的相关信息了.
而具体实现是通过一个CWnd::WindowProc的虚函数来搞的.当然次希函数里面是调用了OnWndMsg函数来实现具体的消息路由的.