win32 学习笔记(九)画笔和画刷(了解,不继续学)

绘图基础:
绘图设备DC(Device Context),绘图上下文/绘图描述表
HDC-DC句柄,表示绘图设备
GDI-Windows graphics device interface(Win32 提供的绘图API)
颜色:计算机使用红、绿、蓝,
R - 0 ~ 255
G -  0 ~ 255
B - 0 ~ 255
每一个点颜色是三个字节24位保存0-2^24-1
16位:5,5,6
32位:8, 8, 8, 8绘图或透明度。


HDC hdc = BeginPaint(hWnd...);
TextOut(hdc, 100, 100, "hello", ...);
......
EndPaint(...);

颜色的使用:
COLORREF:实际DWORD,也就是usign long
例如:COLOREF nColor = 0;
赋值使用RGB宏:
例如: nColor = RGB(0, 0, 255);
获取RGB值:
GetRValue/GetGValue/GetBValue
例如:BYTE nRed = GetRValue(nColor);就得到了nColor的红色配比


基本图形绘制:
SetPixel设置指定点的颜色
COLORREF SetPixel(
    HDC hdc,
    int X,
    int Y,
    COLORREF crColor//设置的颜色
);返回原来的颜色。

线的使用(直线、弧线)
MoveToEx:指明窗口当前点
LineTo:从窗口的当前点到指定的点绘制一条执行案
当前点:上一次绘图时的最后一点,初始为0,0点
封闭图形:能够用画刷填充的图形
Rectangle(直角矩形) / Ellipse(圆形)

GDI绘图对象之画笔
画笔的作用:线条的颜色,线型, 线粗。HPEN:画笔句柄。
画笔的使用:
1.创建画笔:
HPEN CreatePen(
    int fnPenStyle,//画笔的样式
    int nWidth, //画笔的粗细
    COLORREF crColor // 画笔的颜色
);创建成功返回句柄。
PS_SOLID:实心线,可以支持多个像素宽,其他线型只能一个像素宽。

2.将画笔应用到DC中
HGDIOBJ SelectObject(
    HDC hdc,//绘图设备句柄
    HGDIOBJ hgdiobj //GDI绘图对象句柄,画笔句柄
);返回原来的GDI绘图对象句柄。
3.绘图
4.取出DC中的画笔
将原来的画笔使用SelectObject函数放入DC中,就会将我们创建的画笔取回
5.释放画笔
BOOL DeleteObject(
    HGDIOBJ hObject //GDI绘图对象句柄,画笔句柄
);
只能删除不被DC使用的画笔,所以再释放前,必须将画笔从DC取出。

GDI绘图对象之画刷
画刷的作用:给封闭图形填充颜色、图案
画刷的使用:
1.创建画刷
    CreateSolidBrush//实心画刷
    CreateHatchBrush//纹理画刷
2.将画刷应用到DC中:SelectObject
3.绘图
4.将画刷从DC取出
5.删除画刷。
透明画刷:GetStockObject(NULL_BRUSH);//返回HGDIOBJ类型


位图绘制:
位图相关:光栅图形-记录图像中每一个点的颜色等信息。
    矢量图形-记录图像算法、绘图指令等。
    HBITMAP-位图句柄
位图的使用:
1.在资源中添加位图资源
2.从资源中加载位图LoadBitmap
3.创建一个与当前DC相匹配的DC(内存DC)
HDC CreateCompatibleDC(
    HDC hdc //当前DC句柄,可以为NULL(使用屏幕DC)
);返回创建好的DC句柄。


 

#include <windows.h>

void DrawPit(HDC hdc) {
	SetPixel(hdc, 100, 100, RGB(255, 0, 0));
}

void DrawLine(HDC hdc) {
	MoveToEx(hdc, 100, 100, NULL);
	LineTo(hdc, 300, 300);
}

void DrawRect(HDC hdc) {
	Rectangle(hdc, 100, 100, 300, 300);//左上右下边距
}

void DrawEll(HDC hdc) {
	Ellipse(hdc, 100, 100, 300, 300);//左上右下边距的内切圆
}
void OnPaint(HWND hWnd) {
	PAINTSTRUCT ps = { 0 };
	HDC hdc = BeginPaint(hWnd, &ps);
    //DrawPit(hdc); //绘制点
	//DrawLine(hdc);//绘制直线
	//DrawRect(hdc);//绘制矩形
	//DrawEll(hdc);//绘制圆形
	HPEN hPen = CreatePen(PS_SOLID, 100, RGB(255, 0, 0));

	//HBRUSH hBrush = CreateSolidBrush(RGB(0, 255, 0));
	HBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(0, 255, 0));
	HGDIOBJ nOldPen = SelectObject(hdc, hPen);
	HGDIOBJ nOldBrush = SelectObject(hdc, hBrush);
	DrawEll(hdc);
	SelectObject(hdc, nOldPen);
	SelectObject(hdc, nOldBrush);
	DeleteObject(hPen);
	DeleteObject(hBrush);
	EndPaint(hWnd, &ps);
}
//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgId, WPARAM wParam, LPARAM lParam) {
	switch (msgId) {
	case WM_PAINT:
		OnPaint(hWnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hWnd, msgId, wParam, lParam);
}

//入口函数
int  CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {
	//注册窗口类
	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hIns;
	wc.lpfnWndProc = WndProc;
	TCHAR name[] = TEXT("Main");
	wc.lpszClassName = name;
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&wc);//将以上所有赋值全部写入操作系统。
	//在内存中创建窗口
	HWND hWnd = CreateWindow(name, TEXT("title"), WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);
	//显示窗口
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
	//消息循环
	MSG nMsg = { 0 };
	while (GetMessage(&nMsg, NULL, 0, 0)) {
		TranslateMessage(&nMsg);
		DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理
	}
	return 0;
}


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值