详解MFC画笔的使用

了解画笔的使用之前我们先要掌握如何使用MFC画一条线,了解MFC画线之前我们还要知道Win32 API如何画线,了解Win32 API画线之前我们先要知道DC

DC,设备描述表,我们在不同的系统绘图就要和不同的设备驱动程序打交道,那将是相当的困难和繁琐,DC就代替程序员完成了这个工作。

想要在窗口上绘图或显示文字就要使用DC,大体步骤如下:

(1)声明DC句柄:HDC hdc;

(2)获取窗口句柄:hdc=GetDC(hwnd);

(3)画图、写文字等;

(4)释放句柄:ReleaseDC(hwnd,hDC);

那么,如果想要画一条,则:

HDC hdc;
hdc = ::GetDC(m_hWnd);
MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);
LineTo(hdc, point.x, point.y);
::ReleaseDC(m_hWnd, hdc);*/

其中,m_hwnd是窗口句柄,m_ptOrigin是起点坐标,point是终点坐标

注意,如果在某个类中使用这段代码,GetDC和ReleaseDC前面要有冒号,表示是Win32平台的函数。

而MFC中提供了CDC类用于绘图,它有很多派生类,如CClientDC(客户区域绘图)、CWindowDC(客户区域和非客户区域绘图),

用CClientDC完成画线操作的代码如下:

CClientDC dc(this);
CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

用上述代码你会发现画出来的是很细的一条黑线,那么如何更改它的样式呢,下面终于轮到我们的画笔出场了。

编辑画笔就可以改变画线的样式,MFC的CPen类。

我们先要创建一个画笔:CPen pen();构造函数cpen()是重载函数,其中一个有三个参数:画笔样式、宽度、颜色,其中颜色是由一个宏RGB决定,EGB有三个参数,即红绿蓝,每个参数值可设为0-255,全0即黑色,全255即白色,具体可以查看MSDN文档。

我们就创建一个红色的粗画笔:

CPen pen(PS_SOLID, 10, RGB(0, 0, 255));

现在创建的画笔不会生效,需要将画笔应用到DC中,MFC提供SelectObject函数完成此功能,要注意的是,SelectObject函数的参数是画笔对象指针,返回值是被替换的画笔指针,我们需要创建一个CPen对象保存这个旧的指针,保证用完这个画笔后,画笔的样式恢复到初值,代码:

CClient dc(this);
CPen *oldPen=dc.SelectObject(&pen);

然后画线:

dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

最后要恢复画笔初始样式:

dc.SelectObject(&pOldPen);
这样,我们可以看到画出的是一条红色的粗线。





  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`SetClassLongA`函数的参数如下: ```c++ LONG SetClassLongA( HWND hWnd, // 窗口句柄 int nIndex, // 属性索引 LONG dwNewLong // 新属性值 ); ``` 参数说明: - `hWnd`:指定窗口句柄。 - `nIndex`:指定要设置的属性索引。可以是以下值之一: - `GCL_MENUNAME`:设置窗口的菜单名称。 - `GCL_STYLE`:设置窗口的样式。 - `GCL_WNDPROC`:设置窗口的窗口过程。 - `GCL_HICON`:设置窗口的大图标句柄。 - `GCL_HICONSM`:设置窗口的小图标句柄。 - `GCL_CBCLSEXTRA`:设置窗口的额外字节数。 - `GCL_CBWNDEXTRA`:设置窗口的额外窗口字节数。 - `GCL_HCURSOR`:设置窗口的光标句柄。 - `GCL_HBRBACKGROUND`:设置窗口的背景画刷句柄。 - `dwNewLong`:指定新的属性值。 注意: - 在使用`SetClassLongA`函数之前,需要确保指定的窗口已经注册。 - 如果在使用`SetClassLongA`函数之前,使用了`AfxRegisterWndClass`或`RegisterClass`函数注册窗口,则需要使用相应的函数获取窗口的原始值,然后将修改后的值与它们合并。例如: ```c++ LONG dwStyle = ::GetClassLongA(m_hWnd, GCL_STYLE); ::SetClassLongA(m_hWnd, GCL_STYLE, dwStyle | CS_DROPSHADOW); ``` 上述代码将向窗口的样式中添加`CS_DROPSHADOW`位,而不是替换它们。 - 在使用`SetClassLongA`函数之后,需要使用`SetWindowPos`函数通知系统更新窗口样式。例如: ```c++ ::SetClassLongA(m_hWnd, GCL_STYLE, dwStyle | WS_BORDER); ::SetWindowPos(m_hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值