Win32编程之绘图编程(四)

发布时间 2023-09-12 22:18:28作者: TechNomad

一、绘图基础

  • 绘图设备DC(Device Context),绘图上下文/绘图描述表
  • HDC:DC句柄,表示绘图设备
  • GDI:Windows graphics device interface(Win32提供的绘图API)
  • 颜色的使用:COLORREF:实际DWORD;例如:COLORREF nColor = 0;
  • 赋值使用RGB宏:例如:nColor = RGB(0,0, 255)
  • 获取RGB值:GetRValue/GetGValue/GetBValue;例如:BYTE nRed = GetRValue(nColor)

计算机使用红、绿、蓝:

  R:0~255

  G:0~255

  B:0~255

每一个颜色是3个字节24位,保存范围:0~2^24-1

二、基本图形绘制

(1).SetPixel设置指定点的颜色

COLORREF SetPixel(
    HDC hdc, //DC句柄
    int x,//X坐标
    int y,//Y坐标
    COLORREF crColor//设置的颜色
);        
返回指定点原来的颜色

示例代码: 

void OnDrawPoint(HDC hdc) {
	for (int i = 0; i < 256; i++) {
		for (int j = 0; j < 256; j++) {
			SetPixel(hdc, i, j, RGB(i, j, 0));
		}
	}
}

void OnPaint(HWND hWnd) {
	PAINTSTRUCT ps = { 0 };
	HDC hdc = BeginPaint(hWnd, &ps);
	OnDrawPoint(hdc);
	EndPaint(hWnd, &ps);
}

//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WindProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) {
	switch (msgID) {
	case WM_PAINT: {
		OnPaint(hWnd);
		break;
	}
	default:
		break;
	}

	return DefWindowProc(hWnd, msgID, wParam, lParam);
}

(2).线的使用(直接,弧线)  

  • MoveToEx:指名窗口当前点
  • LineTo:从窗口当前点到指定点绘制一条直线
  • 当前点:上一次绘图时最后一点,初始为(0,0)点

示例代码:

void OnDrawLine(HDC hdc) {
	//改变窗口当前点坐标
	MoveToEx(hdc, 100, 100, NULL);
	LineTo(hdc, 300, 300);
	LineTo(hdc, 0, 300);
}

(3).封闭图形:能够用画刷填充的图形(Rectangle/Ellipse)

示例代码:

void OnDrawRect(HDC hdc) {
	Rectangle(hdc, 100, 100, 300, 300);
}

void OnDrawEll(HDC hdc) {
	Ellipse(hdc, 100, 100, 300, 300);
}