---------- 题目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

评论