Windows程序设计:画笔

在Windows程序中,我们用画笔来绘制图形

通过HPEN来创建画笔句柄:

static HPEN hPen1, hPen2, hPen3;   //画笔句柄

然后通过创建画笔函数创建画笔:

HPEN CreatePen(
  _In_ int      fnPenStyle,    //画笔的风格
  _In_ int      nWidth,        //占有像素
  _In_ COLORREF crColor        //颜色
);


创建实例:

case WM_CREATE: {
		hPen1 = CreatePen(PS_SOLID, 10, RGB(0,0,255));
		hPen2 = CreatePen(PS_SOLID, 10, RGB(255,0,0));
		hPen3 = CreatePen(PS_SOLID, 15, RGB(0,255,0));
	}break;

画笔的可选样式:

#define PS_SOLID            0
#define PS_DASH             1       /* -------  */
#define PS_DOT              2       /* .......  */
#define PS_DASHDOT          3       /* _._._._  */
#define PS_DASHDOTDOT       4       /* _.._.._  */
#define PS_NULL             5

备用画笔:系统已经预定义好的画笔,可以直接被拿来用(注:备用画笔不能被删除!!)

GetStockObject(BLACK_PEN)


具体使用案例:

首先创建画笔和获取窗体的长宽

	static HPEN hPen1, hPen2, hPen3;   //画笔句柄
	static HPEN hOldPen;               //旧的画笔 用来保存

	static int cxClient;  //x坐标
	static int cyClient;  //y坐标

	static int LineDis;   //线段的数量
	static int lineWidth = 10;

窗体缩放时长宽变化的数据:

	case WM_SIZE: {
		cxClient = LOWORD(lParam);
		cyClient = HIWORD(lParam);
	}break;

画笔的创建:
	case WM_CREATE: {
		hPen1 = CreatePen(PS_DASH, 1, RGB(0,0,255));
		hPen2 = CreatePen(PS_SOLID, 10, RGB(255,0,0));
		hPen3 = CreatePen(PS_SOLID, 15, RGB(0,255,0));
	}break;


画线:
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
           
			//通过selectObject来选择画笔
			
			LineDis = cyClient / (3 + 1);

			
			hOldPen = (HPEN)SelectObject(hdc, hPen1);    //保存旧画笔

			MoveToEx(hdc, cxClient/10, LineDis, NULL);   
			LineTo(hdc, cxClient*9/10, LineDis);

			SelectObject(hdc, hPen2);    //选用一支新的画笔赋予hdc句柄
			MoveToEx(hdc, cxClient / 10, LineDis*2, NULL);
			LineTo(hdc, cxClient * 9 / 10, LineDis*2);

			SelectObject(hdc, hPen3);    //选用一支新的画笔赋予hdc句柄
			MoveToEx(hdc, cxClient / 10, LineDis*3, NULL);
			LineTo(hdc, cxClient * 9 / 10, LineDis*3);
			
			SelectObject(hdc, GetStockObject(BLACK_PEN));   //选用一支系统画笔赋予hdc句柄
			MoveToEx(hdc, cxClient / 2, 0, NULL);
			LineTo(hdc, cxClient / 2, cyClient);


            EndPaint(hWnd, &ps);
        }
        break;

使用完毕后一定要删除画笔:

	case WM_DESTROY: {
		DeleteObject(hPen1);
		DeleteObject(hPen2);
		DeleteObject(hPen3);
		PostQuitMessage(0);
	}break;


绘画效果如下:








  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
说明文档:制作类似windows画笔的程序 功能: 文件—— 新建 打开 保存 另存为 页面设置——画布大小变化 退出 编辑—— 剪切 复制 粘贴 删除选定区域(但是背景变成黑色的了?!) 查看—— 工具栏、状态栏、颜料盒的显示与隐藏 大尺寸、常规尺寸、自定义尺寸的缩放 图像—— 翻转功能实现(包括水平、垂直翻转,以及180度旋转,90与270度旋转理论上亦实现了,只是速度有些慢,只能适用于小图形) 图像反色 颜色—— 编辑颜色功能实现 帮助—— 弹出信息框 界面: 突出显示按件 鼠标移动显示坐标 使用铅笔在画布上任意绘画,且可以变化颜色 橡皮擦功能实现(橡皮擦大小的变化可以通过改变笔刷粗细后改变) 拾色器功能实现 油漆桶功能实现 直线、笔刷功能实现 屏幕输入文字 放大镜功能实现!!(——强烈注意:它又名奇异镜> <……即使用之后,所有画图功能(比如颜色反色出现,橡皮变成铅笔……填充的色块可以叠加……,O(∩_∩)O哈哈~所以使用之后,记得退出程序,重新开启……) 可以画空心或实心的矩形 可以画空心或实心的椭圆和圆 喷枪功能实现(只是在画笔变粗时,效果会有些恶心……,建议通过笔刷,选择1,然后使用) 另:支持各种快捷键,如ctrl+S/ctrl+x 等,详情请见菜单栏。 使用的API函数与ActiveX控件: API函数: GetCursorPos GetDC GetPixel RoundRect ActiveX控件: 通用对话框控件, 位于“Microsoft CommonDialog Control 6.0” 中

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值