第4课绘图之一API画线【参考资料:孙鑫VC++教学视频】
我们仍旧开始直接实践:
★相关的知识是绘图方面的知识
现在用VC6直接实践一下MFC编程:
1、程序类型MFC AppWizard(exe)类型;
2、选择Single Document单文档应用程序
3、完成
第一项功能:绘制直线;
可以在框架类和视类里面捕获消息:
首先在框架类CMainFrame捕获消息按下左键:
第一步:增加鼠标左键消息响应;
对类名右键:New Window Message and Event handlers for class CMainFrame.
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
}
但是,在这个函数中写了
在view类里面同样增加一个鼠标左键按下响应函数:
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
}
当我们运行后,对鼠标左键就有响应了一个警告框;
★注意:用class wizard也能增加消息响应函数;
在框架类和视类里面的响应函数都存在,不妨碍;
原因:view类在框架类之上,覆盖在框架类之上;
第一趟:
消息循环,就是把消息放在消息队列当中。
消息映射,对消息的处理。
一,
二,
虚函数 WindowProc函数对消息来处理。
OnWndMsg
双击一下CDrawView 就直接到了头文件里。
在用Ctrl+F 搜索的时候,按F3继续搜索。
第二步:用菜单命令增加私有成员变量CPoint
响应鼠标左键按下函数为:
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
}
第三步:用菜单命令增加鼠标左键up响应函数
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
这里面的点就是画线的终点;改变代码如下:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
以上我们采用了API函数,也就是全局函数来完成的;
API函数和类的成员函数都有ReleaseDC函数,所以调用API函数就要特别用作用域符号注明是API函数,如果不同名,则可以直接用;
实例:
MFC中所有画图的功能都集成到了CDC这个类中:
用CDC类绘制直线;
仍旧在视类里面捕获消息:
注意:画线的代码发生变化,其余步骤不变;
直接修改鼠标左键up响应函数
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
以上我们采用了CDC类画线,看起来很简洁;
第4课绘图之三CClientDC画线【参考资料:孙鑫VC++教学视频】
CClientDC类是从CDC这个类派生出来的;
优点:构造函数中调用GetDC;析构函数调用ReleaseDC;
也就是说用CClientDC类,就不用显示调用DetDC和ReleaseDC函数;
CClientDC绘制直线;
仍旧在视类里面捕获消息:
注意:画线的代码发生变化,其余步骤不变;
直接修改鼠标左键up响应函数
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
以上我们采用了CClientDC类画线,看起来更简洁;
用this指针传递,表示在CDrawView上做图;
下面
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
第4课绘图之四CWindowDC画线【参考资料:孙鑫VC++教学视频】
CWindowDC类是从CDC这个类派生出来的;
优点:构造函数中调用GetDC;析构函数调用ReleaseDC;
也就是说用CClientDC类,就不用显示调用DetDC和ReleaseDC函数;
可以访问整个屏幕区域,包括客户区和非客户区;
CWindowDC绘制直线;
仍旧在视类里面捕获消息:
注意:画线的代码发生变化,其余步骤不变;
直接修改鼠标左键up响应函数
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
在标题栏+菜单栏上(非客户区)可以访问整个屏幕。
能否画到vc上,或者桌面上?
桌面本身就是一个窗口。
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
则可以画到vc上,或者桌面上;
第4课绘图之五CPen修改颜色【参考资料:孙鑫VC++教学视频】
★如何画其他颜色的线条?
CPen修改颜色
仍旧在视类里面捕获消息:
注意:画线的代码发生变化,其余步骤不变;
RGB这个宏 参数三个
直接修改鼠标左键up响应函数
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
这是画出红色的直线;
阴影线 粗细只能1或者更小
以下代码是设置新笔,保存旧的笔;
CPen *pOldPen=dc.SelectObject(&pen);
第4课绘图之六CBrush填充区域【参考资料:孙鑫VC++教学视频】
★如何矩形区域区域颜色?
CBrush填充区域
仍旧在视类里面捕获消息:
注意:画线的代码发生变化,其余步骤不变;
直接修改鼠标左键up响应函数
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
//用指定的画刷来填充指定的矩形 ,当然也有自己缺省的画刷。
}
这是画出红色的矩形;
下面讨论位图画刷:
首先要添加一个位图资源,insert菜单里面resource,添加new了一个Bitmap,它的资源ID是IDB_BITMAP1,程序如下:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
第4课绘图之七透明画刷【参考资料:孙鑫VC++教学视频】
★如何矩形区域不相互遮挡?
CBrush透明画刷
仍旧在视类里面捕获消息:
注意:画线的代码发生变化,其余步骤不变;
直接修改鼠标左键up响应函数
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
}
画出的矩形相互不遮挡,也就是透明的;
★★★★★注意点:
1)静态方法不属于某一个具体对象,而属于类本身,在类加载的时候就已经为类静态方法分配了代码去,故可用CBrush::FromHandle()形式调用。非静态的方法,是属于某个对象的。
2)静态方法中,不能引用非静态的数据成员和方法。
3)静态数据成员需要在类外单独做初始化,形式如:
第4课绘图之八曲线【参考资料:孙鑫VC++教学视频】
★如何绘制拖动的曲线?
绘制拖动的曲线
第一步:增加一个BOOL m_bDraw;
在构造函数中m_bDraw=FALSE;
鼠标左键按下down响应函数中设置m_bDraw=TRUE;
用这个变量表示鼠标按下;
CDrawView::CDrawView()
{
}
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
}
增加鼠标左键move响应函数,用右击菜单栏添加
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
}
SetROp2 是在CDC来的。绘画的模式的设置。