MFC消息映射机制的剖析,讲述如何运用ClassWizard,,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程序进行分析。如何设置封闭图形的填充刷子(位图画刷与透明画刷的使用)。 1.在CMainFrame类上右键添加“消息处理”,选择WM_LBUTTONDOWN消息,编辑现存的。 2.也可在查看菜单项中选择“建立类向导”进行消息的添加。 3.在frame类捕获LBUTTONDOWN消息无用,在VIEW类中捕获LBUTTONDOWN消息才有效果。因为view类是覆盖在框架类上的,所以一般操作都是对view类的。 要删除消息的话,就在类视图中点击相应的函数的右键,选择delete删除之,这样删除才完整。 4.添加一个消息后,会在头文件中加入宏、源文件的消息映射处添加 5.消息映射:0)在基类中对每个消息写对应的虚函数。这样浪费 1)通过hwnd找到相应的窗口类,然后将消息给它,它再调用windowproc 6.在类上右键添加成员变量,在构造函数中初始化。m_ptOrigin=0; 在窗口处理中,保存鼠标信息:m_ptOrigin=point; 在LBUTTONUP中添加画线代码: HDC hdc; hdc=::GetDC(m_hWnd); MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //将当前绘图位置移动到一个特点位置 LineTo(hdc,point.x,point.y); //LineTo调用完后,x、y要作为当前坐标 ::ReleaseDC(m_hWnd,hdc); 7.封装了CDC类,CDC类中有个类似CWnd中m_hWnd的DC句柄:m_hDC CDC *pDC=GetDC(); //这个GetDC是CWnd类的,返回CDC类的指针,ReleaseDC也是 pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); 8.CClentDC从CDC派生出来,它在构造的时候用GetDC,在析构的时候ReleaseDC。 CClientDC dc(this); //先调用构造函数 dc.MoveTo(m_ptOrigin); dc.LineTo(point); CView::OnLButtonUp(nFlags, point); CWnd有个GetParent函数,返回CWnd的指针。这里可在工具栏上作图了 9.CWindowDC类,构造时调用GetWindowDC,析构时调用ReleaseDC,可以访问整个CWnd区域(包括客户区和非客户区) CWindowDC dc(this); 这时候用GetParent后,可访问到标题栏(画)。用GetDeskTopWindow可获取桌面的CWnd指针,则可以访问桌面。 10.CPen类,封装了画笔 CPen( int nPenStyle, int nWidth, COLORREF crColor );//构造函数 第一个参数如PS_SOLID,……PS_DASH(阴影线,需要nWidth<=1时才可以)/PS_DOT 构造COLORREF时,用RGB函数 COLORREF RGB( BYTE bRed, // red component of color,范围在0~255内 BYTE bGreen, // green component of color BYTE bBlue // blue component of color ); 用CPen构造之后,要用SelectObject选择此对象,它返回先前的被替换的对象(如CPen*/CBrush*……) 11.CBrush类,CBrush(COLORREF crColor),CBrush( CBitmap* pBitmap ); CDC的void FillRect( LPCRECT lpRect, CBrush* pBrush ); 可用CRect构造一个矩形,如CRect(ltpt,rbpt) CBitmap类,构造函数参数为空建立一个CBitmap对象,必须被初始化函数…… 如BOOL LoadBitmap( LPCTSTR lpszResourceName );BOOL LoadBitmap( UINT nIDResource ); 创建资源:可用插入-》资源-》Bitmap-》若新建一个,就自己画;也可导入。也可用资源工具栏添加。 如: CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是自己新建、系统给的ID号。 CBrush brush(&bitmap); 用dc的BOOL Rectangle( LPCRECT lpRect );画矩形。默认有白色的画刷,所以把先前画的矩形都覆盖了。为了不覆盖,就要创建透明画刷。 用HGDIOBJ GetStockObject( int fnObject // type of stock object,这里用NULL_BRUSH空画刷 ); 用CBrush的FromHandle(HBRUSH),可将一个windows的HBRUSH转换为(返回)CBrush指针。 CClientDC dc(this); CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); CBrush *pOldBrush=dc.SelectObject(pBrush); dc.Rectangle(CRect(m_ptOrigin,point)); dc.SelectObject(pOldBrush); 类说明:在类中定义的static类函数,它并不属于某个对象,而属于这个类。(静态函数),可直接用类名::函数名调用,不用定义对象。 12.画连续的线 CClientDC dc(this); if(m_bDraw==TRUE) { dc.MoveTo(m_ptOrigin); //比MoveToEx方便 dc.LineTo(point); m_ptOrigin=point; } 13.CDC::SetROP2函数,设置绘画模式 int SetROP2( int nDrawMode ); //如R2_BLACK,R2_MERGENOTPEN
(孙鑫 四)简单绘图
最新推荐文章于 2024-02-23 22:42:34 发布