正文

简单绘图2009-10-19 21:55:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/shao/49433.html

分享到:

 

 

----------
题目1:怎样新建?
创建-->
新建一工程-->MFC AppWizard[exe](注:取名必须遵照Mymfc.即必须为英文且第一个字母必须为大写)
选择Single document后按Finish<--完成
题目2:按下鼠标左键怎样弹出对话框?
在CMyFirstMfcProjectView类(注:仅仅此类才可以显示出弹出的对话框)
-->右击选择Add Windows Message handler(可以选择其它不同的消息.如WM_CHAR,WM_PAINT等)
MessageBox("您按下了左键VIEW!","窗口标题栏",MB_OK);(注:当达到消息成功后,就会弹出此窗口)
题目3:怎样画一条线?
/*****************************************************/
在CMyFirstMfcProjectView类中添加一个成员变量.变量类型:CPoint(注:点类型).变量名:任意取
定义之后初始化--->打开构造函数CMyFirstMfcProjectView(),添加初始化代码
把所用消息的值赋给它--->打开所要响应的消息机制.把里面的point值赋给它.
起点已找到.终点要新建--->新建一个WM_LButtonUp(注:当鼠标左弹起来时.响应终点)
开始作图(画线)--->
(一)API的方法(用全局变量)
   (1)首先获取HDC(注:所有作图都必须定义1个HDC):用::GetDc(m_hwnd(注:是CWnd的句柄,公开且默认));     注:必须为全局变量
   (2)其次获取称动时线的坐标可用MoveTo与MoveToEx,究竟用哪个?用MoveToEx
     关于2者区别:MoveTo是Win16 API,MoveToEx是Win32 API.后者是前者的升级.
     另外MFC也有个CDC:MoveTo,那个仅是封装了MoveToEx而已
   (3)移动时选取何种线条?LineTo
   (4)释放资源用Release(注:此为全局函数)
备注:虽然MoveTo,MoveToEx,GetDC,LineTo等是在MFC中,但最后用时,一定要以API为原则
(二)MFC的方法
①(封装了的CDC,客户区有效)
   (1)首先获取CDC,定义一个GetDC(注:此为指针类型,指向GetDC这个成员函数).
   (2)其次获取成员函数MoveTo(int x,int y)或MoveTo(POINT point)(注:2者一样.前1个可写成
     MoveTo(point x,point y).后者是一个结构体
   (3)移动时选取何种张条?用成员函数LineTo
   (4)释放资源用Release(注:此为CDC成员函数)
②(封装了的CClientDC,客户区有效)
   (1)首先用this获取CWnd类对象(注:调用类对象自身用this)
   (2)(3)同上.注:.与->区别?     必须!!!.前是类或者结构体的对象   -〉前是指针
   (4)无.CClientDC已经封装了
③(封装了的CWindowDC,客户区与非客户区有效)
   同上
   注:一般客户区有效.若想非客户区有效要调用GetParent
     若想获得桌面窗口,可以调用GetDesktopWindow
④获得画笔
   (1)定义一个画笔,然后同上.定义一个客户区CClientDC.
   (2)定义一个初始化画笔指针(利用SelectObject将画笔引用到客户区).
   (3)(4)同上
   (5)注:Selectobject总是调用前一个画笔.因此.必须调用画笔初始化指针
⑤获得画刷
   (1)定义1个画刷,定义一个客户区CClientDC.
   (2)利用FillRect直接填充.无需使用(3)(4)
⑥位图画刷
   (1)首先定义一个位图(注:位图使用时必须初始化).接着初始化位图(使用LoadBitmap函数)
   (2)调用位图.使用CBrush.利用FillRect直接填充.无需使用(3)(4)
⑦画矩形(非透明)
   (1)首先定义一个客户区CClientDC
   (2)调用Rectanle(注:专门用来画矩形的函数).无需使用(3)(4)
⑧画矩形(透明性)
   (1)首先定义一个客户区CClientDC
   (2)原理:定义一个画刷替换默认画刷
     定义一个画刷:用GetStockObject选择一个透明画刷类型指针.用FromHandle转换正确格式
     使用SelectObject选进画刷,替换默认(注:使用SelectObject时,用完时记的返回前一个值)
   (3)使用Rectangle画透明矩形
   (4)使用SelectObject返回前一个值
------------------------------------------------------------------------------------
题目4:怎样模仿mspaint中画线?
①画基本的连线(鼠标按下画,弹起不画)
   (1)首先构造一个BOOL成员变量为FALSE   3个响应函数:左下TRUE,左上FALSE,鼠标移动if==TRUE
   (2)同上一样画线(注:Mypoint=point)
②在①基础上增加颜色
   (1)定义一个画笔
   (2)利用SelectObject选定,用完后切记使用SelectObject选定初始值(原因同上)
③在②基础上画扇形
   (1)同上.只需删除Mypoint=point.坚决反对多此一举行为!
④在③基础上画带圆的扇形
   (1)多画一条线OK.定义一个中间点Zpoint,把那个原点的值赋给它.以此为起点画终点
SetROP2设置绘画模式
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
代码如下:(注:主要是鼠标左键按下,弹起,及按下时鼠标拖动3个响应函数)
void CMspaint3View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
Draw=TRUE;
Mypoint=Zpoint=point;
CView::OnLButtonDown(nFlags, point);
}
void CMspaint3View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

/*//HDC hdc;
HDC hdc;
//hdc=::GetDc(m_hWnd);
   hdc=::GetDC(m_hWnd);
MoveToEx(hdc,Mypoint.x,Mypoint.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
//::ReleaseDC(m_hWnd,hdc);
//*/
/* CDC *hdc=GetDC();
hdc->MoveTo(Mypoint.x,Mypoint.y);
hdc->LineTo(point);
ReleaseDC(hdc);*/
//   CClientDC ccdc(this);
// CClientDC ccdc(GetDesktopWindow());//客户区用了获取桌面窗口也无效
// CWindowDC ccdc(GetParent());;
/*   CWindowDC ccdc(GetDesktopWindow());
ccdc.MoveTo(Mypoint);
ccdc.LineTo(point.x,point.y);
*/
/*画笔*/
/* CPen cpen(PS_SOLID,100,RGB(255,0,0));
CClientDC ccdc(this);
CPen * Firstcpen=ccdc.SelectObject(&cpen);
ccdc.MoveTo(Mypoint);
ccdc.LineTo(point);
ccdc.SelectObject(Firstcpen);
*/
/*画刷*/
/* CBrush cbrush(RGB(255,0,0));
CClientDC ccdc(this);
ccdc.FillRect(CRect(Mypoint,point),&cbrush);
*/
/*位图画刷*/
/* CBitmap cbitmap;
cbitmap.LoadBitmap(IDB_BITMAP1);
CBrush cbrush(&cbitmap);
CClientDC ccdc(this);
ccdc.FillRect(CRect(Mypoint,point),&cbrush);
*/
/*画矩形(非透明性)*/
/* CClientDC ccdc(this);
ccdc.Rectangle(CRect(Mypoint,point));
*/
/*画矩形(透明性)*/
/* CClientDC ccdc(this);
CBrush *cbrush=CBrush::FromHandle(HBRUSH(GetStockObject(NULL_BRUSH)));
CBrush *Firstcbrush=ccdc.SelectObject(cbrush);
ccdc.Rectangle(CRect(Mypoint,point));
ccdc.SelectObject(Firstcbrush);
*/
/*画线*/
Draw=FALSE;
CView::OnLButtonUp(nFlags, point);
}
void CMspaint3View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC ccdc(this);
ccdc.SetROP2(R2_BLACK);
CPen cpen(PS_SOLID,1,RGB(255,0,0));
CPen *Firstcpen=ccdc.SelectObject(&cpen);
if(Draw==TRUE)//此为判断语句.切勿为赋值语句
/*画线与画弧形*//* {
   ccdc.MoveTo(Mypoint);
   ccdc.LineTo(point);
   //Mypoint=point;
}*/
{ccdc.MoveTo(Mypoint);
   ccdc.LineTo(point);
   ccdc.MoveTo(Zpoint);
   ccdc.LineTo(point);
   Zpoint=point;

}
ccdc.SelectObject(Firstcpen);
CView::OnMouseMove(nFlags, point);

 

 

http://hi.baidu.com/vc_net/blog/item/807ec9174d610a0ec83d6d3a.html

阅读(2432) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册