正文

简单绘图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

阅读(2546) | 评论(0)


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

评论

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