现在的位置: 首页 > 综合 > 正文

MFC学习日记四:Mfc消息机制与画图

2018年02月03日 ⁄ 综合 ⁄ 共 2010字 ⁄ 字号 评论关闭

创建一个画刷用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); //画笔移动,pointOnMouseMove的参数

m_ptOrigin=point; //再把原点设置为鼠标现在的位置,继续画

}

dc.SelectObject(pOldPen);

抱歉!评论已关闭.