
---------- 
题目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);
评论