创建一个画刷用CBrush类:
CBrush brush(RGB(255,0,0)); //创建一个红色的画刷
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush); //用这个红色的画刷填充一个矩形区域,这里并不需要将这个画刷选到设备描述表当中
创建一个位图画刷:
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); //加载我们自己的位图(图片)
CBrush brush(&bitmap); //CBrush的另一个构造函数
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush); //和上面解释一样
创建一个空画刷,画出来的矩形中间区域是透明的:
在msdn中查到有这样一个函数:
HGDIOBJ GetStockObject(int fnObject );//返回一个GDI(图形设备接口)句柄,它有这样一个parameter(参数),是NULL_BRUSH(equivalent to HOLLOW_BRUSH解释为等价于空心刷);但是我们设计的需要一个画刷对象,这里
在msdn中查到CBrush类有这样一个函数
static CBrush* PASCAL FromHandle( HBRUSH hBrush ); //Returns a pointer to a CBrush object when given a handle to a Windows HBRUSH object.(解释是返回一个指针,指向CBrush)
这样结合上面两个函数,得到:
CClientDC dc(this);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //这里FromHandle是静态函数,直接用类名加双冒号调用
CBrush *pOldBrush=dc.SelectObject(pBrush); //因为上面的画刷是在最后赋值参数中把画刷选进去了,这里需要把画刷选到设备描述表中,返回的是被替换的画刷
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush); //把旧的画刷选择回去
在这里,上面用了CBrush的静态函数,静态函数是在类加载的时候内存就已经给他分配了代码区,它并不属于哪一个对象,所以调用他不用生成对象,直接用类名加上两个冒号,同样的,在它里面不能用非静态成员变量,因为加载的时候它的代码区生成了,但是类成员变量代码区还没有生成,就会出错,并且静态成员变量定义的时候必须进行初始化(这里是定义静态函数时应该注意)
#include <iostream.h> class Point { public: void output() { } static void init() { } }; void main() { /*Point pt; pt.init(); pt.output();*/ Point::init(); // Point::output(); //这样不对 } 带有静态数据成员: #include <iostream.h> class Point { public: void output() { } static void init() { x=0; y=0; } private: static int x,y; }; int Point::x=0; int Point::y=0; void main() { /*Point pt; pt.init(); pt.output();*/ Point::init(); // Point::output(); //这样不对 }
设计一个画连续线条的程序,就需要捕获鼠标移动的消息,这里就需要在View类上增加一个处理鼠标移动的消息,就是OnMouseMove,这里需要设置一个BOOL型成员变量,当鼠标左键按下去的时候,把这个变量设置为真,判断这个值为真的时候就开始画线,当鼠标左键弹起来的时候把这个变量设置为假,这样画线就终止了。
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen=dc.SelectObject(&pen);
if(m_bDraw==TRUE)
{
dc.MoveTo(m_ptOrigin); //把画笔移动到鼠标左键按的地方
dc.LineTo(point); //画笔移动,point为OnMouseMove的参数
m_ptOrigin=point; //再把原点设置为鼠标现在的位置,继续画
}
dc.SelectObject(pOldPen);