MFC(画图,孙鑫C++第四讲笔记整理)
来源:互联网 发布:微店没有淘宝搬家 编辑:程序博客网 时间:2024/05/23 15:38
孙鑫C++视频就是经典,下面是整理.
1.在单文档中view挡在MainFrame的前面。此时如果编写针对MainFrame的mouseClick事件,将不会有反应。
2.消息响应会在3处修改代码,1处是在头文件中,
//{{AFX_MSG(CDrawView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
另一处是cpp文件的begin MessageMap和End MessageMap之间,
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//}}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()
最后是要有函数实现的代码。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TOD Add your message handler code here and/or call default
m_ptOrigin=m_ptOld=point;
m_bDraw=TRUE;
CView::OnLButtonDown(nFlags, point);
}
3.画线:定义一个成员变量保存mouseDown的点m_Point
1)API函数方法画线用HDC
2)用CDC类成员函数画线。此时别忘记ReleaseDC
3)用CClientDC
4)用CWindowDC,用它甚至可以整个屏幕区域画线。
下面是上面4种方法的代码
/*HDC hdc;
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);必须成对使用。*/
/*CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);必须成对使用。*/
//CClientDC dc(this);
/*CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);此处不需要ReleaseDC,因为CClientDC会自动释放DC*/
//CWindowDC dc(this);
//CWindowDC dc(GetParent());
/*CWindowDC dc(GetDesktopWindow());//此时可以在整个屏幕上画线。
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
/*CPen pen(PS_DOT,1,RGB(0,255,0));
CClientDC dc(this);
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);*/
5)用Bitmap填充所画的矩形。
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);
//CBRUSH::FromHandle是静态成员函数,所以可以用下面的方法调用。
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush=dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush);
m_bDraw=FALSE;
6)用其它颜色画线
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen=dc.SelectObject(&pen);//选中红色画笔
if(m_bDraw==TRUE)
{
dc.SetROP2(R2_BLACK);//设置绘画模式
dc.MoveTo(m_ptOrigin);
//dc.LineTo(point);
dc.LineTo(m_ptOld);
//dc.MoveTo(m_ptOrigin);
dc.MoveTo(m_ptOld);
dc.LineTo(point);
//m_ptOrigin=point;
m_ptOld=point;
}
dc.SelectObject(pOldPen);
4.MFC中隐式的包含了windows.h。为什么?
因为在AFXV_W32.h文件中:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
在AFXWIN.h中
// Note: WINDOWS.H already included from AFXV_W32.H
5.如何从句柄获得对象的指针?
答FromHandle
6.类的静态成员函数可以由类名直接调用,也可以由对象调用。可以认为静态成员函数并不属于某个对象,它属于类本身。程序运行伊始,即使没有实例化类的对象,静态成员函数和静态成员变量已然有其内存空间。静态成员函数不能访问非静态成员变量!静态成员变量必须在类的外部初始化。当然如果并不打算用到静态成员变量,此时你可以不初始它。
7.理解代码区,数据区,堆,栈!
请见下面的简介:
对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
具体的代码如下,
其中添加了WM_LBUTTONDOWN,WN_LBUTTONUP,WM_MOUSEMOVE的消息
在CXXView中添加了数据成员CPoint m_orgpt,CPoint m_oldpt,CPoint m_movept
CDrawView::CDrawView(){// TODO: add construction code herem_orgpt=0;m_movept=0;flag=FALSE;}
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultm_orgpt=m_oldpt=point;flag=TRUE;CView::OnLButtonDown(nFlags, point);}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call default/*HDC hdc;hdc=::GetDC(m_hWnd);::MoveToEx(hdc,m_orgpt.x,m_orgpt.y,NULL);::LineTo(hdc,point.x,point.y);::ReleaseDC(m_hWnd,hdc);*//*CDC *pcdc=GetDC();pcdc->MoveTo(m_orgpt);pcdc->LineTo(point.x,point.y);ReleaseDC(pcdc);*///CClientDC ccdc(this);/*CClientDC ccdc(GetParent());ccdc.MoveTo(m_orgpt);ccdc.LineTo(point);*///CWindowDC cwdc(this);//CWindowDC cwdc(GetParent());/*CWindowDC cwdc(GetDesktopWindow());cwdc.MoveTo(m_orgpt);cwdc.LineTo(point);*//*CPen cp(PS_SOLID,10,RGB(255,0,0));CDC *pcdc=GetDC();pcdc->SelectObject(&cp);pcdc->MoveTo(m_orgpt);pcdc->LineTo(point);ReleaseDC(pcdc);*//*CPen cp(PS_DOT,1,RGB(0,255,0));CClientDC ccdc(this);CPen *pcp=ccdc.SelectObject(&cp);ccdc.MoveTo(m_orgpt);ccdc.LineTo(point);ccdc.SelectObject(pcp);*///CBrush cb(RGB(255,0,0));/*CBrush cb(HS_DIAGCROSS ,RGB(255,0,0));CClientDC ccdc(this);CBrush *pcb=ccdc.SelectObject(&cb);ccdc.Rectangle(&CRect(m_orgpt,point));ccdc.SelectObject(pcb);*//*CBitmap cbmp;cbmp.LoadBitmap(MAKEINTRESOURCE(BITMAPID));CBrush cbh(&cbmp);CClientDC ccdc(this);//CBrush *pcbh=ccdc.SelectObject(&cbh);//如果下面用Rectangle的话,这一句还有点作用ccdc.FillRect(CRect(m_orgpt,point),&cbh);//ccdc.SelectObject(pcbh);//如果上面使用了Rectangle来填充颜色,则要把原来的画刷设置回来*//*CClientDC ccdc(this);ccdc.Rectangle(&CRect(m_orgpt,point));//这里使用默认白画刷*//*CClientDC ccdc(this);CBrush *pcbr;pcbr=(CBrush *)ccdc.SelectStockObject(NULL_BRUSH);//SelectStockObject(NULL_BRUSH)返回的是一个GDI指针ccdc.Rectangle(&CRect(m_orgpt,point));ccdc.SelectObject(pcbr);*//*CClientDC ccdc(this);LOGBRUSH logb;::GetObject((HBRUSH)::GetStockObject(NULL_BRUSH),sizeof(LOGBRUSH),&logb);CBrush cbr;cbr.CreateBrushIndirect(&logb);ccdc.Rectangle(&CRect(m_orgpt,point));*/ //这段注释的代码不成功,理论上可行/*CClientDC ccdc(this);CBrush *oldpcbr;CBrush *newpcbr;newpcbr=CBrush::FromHandle((HBRUSH)::GetStockObject(NULL_BRUSH));oldpcbr=ccdc.SelectObject(newpcbr);ccdc.Rectangle(&CRect(m_orgpt,point));ccdc.SelectObject(oldpcbr);*/flag=FALSE;CView::OnLButtonUp(nFlags, point);}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call default/*m_movept=point;//画图程序CClientDC ccdc(this);ccdc.MoveTo(m_orgpt);if(flag){ccdc.LineTo(m_movept);}m_orgpt=m_movept;*//*m_movept=point;//画不带边线的扇形CClientDC ccdc(this);ccdc.MoveTo(m_orgpt);if(flag){ccdc.LineTo(m_movept);}*/CClientDC ccdc(this);CPen cpen(PS_SOLID,3,RGB(255,0,0));CPen *oldpen =ccdc.SelectObject(&cpen);if(flag){ccdc.SetROP2(R2_NOT);ccdc.MoveTo(m_orgpt);ccdc.LineTo(m_oldpt);ccdc.MoveTo(m_oldpt);ccdc.LineTo(point);m_oldpt=point;}ccdc.SelectObject(oldpen);CView::OnMouseMove(nFlags, point);}
这就不截效果图了。
- MFC(画图,孙鑫C++第四讲笔记整理)
- MFC(画图,孙鑫C++第四讲笔记整理)
- MFC(继续画图,孙鑫C++第十讲笔记整理)
- MFC(继续画图,孙鑫C++第十讲笔记整理)
- MFC(继续画图,孙鑫C++第十讲笔记整理)
- MFC(继续画图,孙鑫C++第十讲笔记整理)
- MFC初窥(MFC运行机制,孙鑫C++第三讲笔记整理)
- MFC初窥(MFC运行机制,孙鑫C++第三讲笔记整理)
- MFC(文本编程,孙鑫C++第五讲笔记整理)
- MFC(菜单,孙鑫C++第六讲笔记整理)
- MFC(对话框,孙鑫C++第七讲笔记整理)
- MFC(继续对话框,孙鑫C++第八讲笔记整理)
- MFC(绘图与保存,孙鑫C++第十一讲笔记整理)
- MFC(文件操作,孙鑫C++第十二讲笔记整理)
- MFC(网络编程,孙鑫C++第十四讲笔记整理)
- MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)
- MFC- ActiveX编程(孙鑫C++第十八讲笔记整理 )
- MFC - 网络编程 (孙鑫C++第十四讲笔记整理)
- PHP代码优化
- OpenCV模块
- VLC源码分析总结
- sql case when
- POJ 1226 Substrings KMP
- MFC(画图,孙鑫C++第四讲笔记整理)
- 分治法之我见
- onselectstart与onselect
- struts中的Action层调用服务层时,不需要在Spring配置文件中做属性注入
- 三种读取xml的方法!见人见智
- word中输入英文字符间距变大
- 去除可执行文件中没用到的符号
- 修改一下vi的颜色配置
- Oracle Apps DBA工具:ADADMIN使用说明