windows编程学习笔记(4)GDI绘图

一.绘制线条&使用画刷

绘制线条和使用画刷等都是先获得窗口设备环境句柄,然后选取一个绘图的工具,使用绘图工具在设备环境中绘图
下面有线条和画刷的使用方法:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	COLORREF color = RGB(0, 255, 0);
	HPEN hpen = CreatePen(PS_SOLID, 20, color);
	HBRUSH hbrush = CreateSolidBrush(color);
	PAINTSTRUCT ps;
	switch (message)
	{
<p>		case WM_PAINT:</p>			//采用BeginPaint方法获取设备环境句柄
			hdc = BeginPaint(hWnd, &ps);
			//选取绘图使用的工具
			SelectObject(hdc, hpen);
			//移动焦点
			MoveToEx(hdc, 0, 0, NULL);
			//画线
			LineTo(hdc, 1000, 1000);
			//选择画刷作为绘图工具
			SelectObject(hdc, hbrush);
			//绘制方形函数
			Rectangle(hdc, 150, 200, 200, 250);
			//绘图结束释放设备环境
			EndPaint(hWnd, &ps);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			CleanUp();
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		return 0;
}

运行程序,结果如下:


二.绘制位图

位图,即bitmap类型的图像,在windows平台下结尾为.bmp。GDI支持最好的就是位图。据说GDI+支持png等格式的图像,但是GDI+是对GDI的封装,效率不怎么样。所以在这里还是使用GDI绘制位图。
绘制位图有4个步骤:
1)加载位图

HANDLE LoadImage(

HINSTANCE hinst,//如果是从硬盘加载可以置为NULL

LPCTSTR lpszName,//图像的路径及文件名

UINT uType,//类型

int cxDesired,//宽度(如果为0则按照图像原大小加载)

int cyDesired,//高度(如果为0则按照图像原大小加载)

UINT fuLoad//加载方式

);

2)建立兼容DC
HDC CreateCompatibleDC(HDC hdc);
在内存中建立一个和屏幕DC兼容的内存环境
3)选取位图对象
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
前面使用画笔画刷时也使用过这个函数,其实就是选取一个用来绘图的工具,在这里就是选取位图作为画笔
4)绘图
BOOL BitBlt(HDC hdcDest,//目标DC
int nXDest,//目标贴图x坐标
int nYDest,//目标贴图y坐标
int nWidth,//宽度
int nHeight,//高度
HDC hdcSrc,//源DC
int nXSrc,//贴图源起始x坐标
int nYSrc,//贴图源起始y坐标
DWORD dwRop);//光栅操作标示符,详情可以查阅MSDN
代码如下:
void Init(HWND hwnd)//加载部分
{
	g_hdc = GetDC(hwnd);//获得设备环境句柄
	g_hbitmap = (HBITMAP)LoadImage(NULL, L"xie.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);//加载位图,步骤(1)
	g_mdc = CreateCompatibleDC(g_hdc);//建立兼容内存设备环境步骤(2)
	ReleaseDC(hwnd, g_hdc);//释放设备
}

void Paint(HWND hwnd)//贴图部分
{
	g_hdc = GetDC(hwnd);
	SelectObject(g_bufdc, g_hbitmap);//选取位图作为绘图工具,步骤(3)
	BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY);//贴图操作,步骤(4)
	ReleaseDC(hwnd, g_hdc);
}
运行结果如下:








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值