WIN32学习——绘图

1、一个颜色的值可以用COLORREF表示,使用宏RGB可以给COLORREF赋值,并且可以通过GetRValue/GetGValue/GetBValue这三个函数来获取宏RGB中的每个值。

2、点的使用

GetPixel函数可以获取指定点点颜色

SetPixel函数可以设置点的颜色,该函数的返回值为以前的颜色。

3、线的使用

MoveToEx函数,移动到指定点

LineTo函数从当前点到指定点绘制一条直线。

4、封闭图形的绘制函数

Rectangle绘制矩形

Ellipse绘制圆形

RoundRect绘制圆角矩形

Arc绘制弧线

5、画笔(HPEN)的使用

1)创建画笔 - CreatePen

2)将画笔应用到DC中 - SelectObject,该函数返回原来的GDI绘图对象的句柄,需要保存起来,绘图结束后需要在将原来的GDI对象在重新选入替代自己创建的画笔

3)绘图

4)取出DC中的画笔,将原来的画笔,使用SelectObject函数放入设备DC中,就会将我们创建的画笔取出。

5)释放画笔 - DeleteObject

注意:画笔是可以改变线的颜色、线性、线粗,在第一步创建画笔时,只要设置线宽大于1,画笔的类型只能是PS_SOLID

6、画刷(HBRUSH)的使用

1)创建画刷

CreateSolidBrush - 创建实心画刷

CreateHatchBrush - 创建阴影画刷

CreatePatternBrush - 创建位图画刷

2)将画刷应用到DC中 - SelectObject

3)绘图

4)将画刷从DC中取出 - SelectObject

5)删除画刷 - DeleteObject

注意:画刷可以为封闭的图形填充颜色、图案。

可以调用GetStockObject函数获取系统维护的画刷、画笔、字体等。通过该函数返回的不需要DeleteObject

7、位图(HBITMAP)的使用

1)在资源中添加位图资源并加载(LoadBitmap)

2)创建兼容DC - CreateCompatibleDC

3)将位图选入兼容DC中 - SelectObject

4)位图的绘制函数 - BitBlt

BOOL BitBlt(//不能缩放,改变大小

HDC hdcDest, //目标DC,(HDC)

int  nXDest, //目标左上X坐标

int  nYDest, //目标左上Y坐标

int  nWidth, //目标的宽度

int  nHeight, //目标的高度

HDC  hdcSrc, //源DC,(兼容DC)

int  nXSrc, //源左上X坐标

int  nYSrc, //源左上Y坐标

DWORD  dwRop //绘制方法

);

BOOL StretchBlt( //缩放绘制位图
HDC  hdcDest,
int  nXOriginDest,
int  nYIriginDest,
int  nWidthDest,
int  nHeightDest,
HDC  hdcSrc,
int  nXOriginSrc,
int  nYOriginSrc,
int  nWidthSrc,
int  nHeightSrc,
DWORD  dwRop
 );

5)取出位图 - SelectObject

6)释放位图 - DeleteObject

7)释放兼容DC - DeleteDC

注意:可以通过GetObject()函数回去位图的信息,只要的是可以获取位图的宽和高。

附以上总结的练习代码:(需要手动添加菜单资源和位图资源)

#include 
#include "resource.h"

HINSTANCE g_hInstance;
LONG nMenuID;

void OnCommand(HWND hWnd,WPARAM wParam)
{
	nMenuID = LOWORD(wParam);
	switch(LOWORD(wParam))
	{
	case ID_QUIT:
		PostQuitMessage(0);
		break;
	case ID_PIXEL:
	case ID_LINE:
	case ID_RECT:
	case ID_ELLIPSE:
	case ID_BITMAP:
		InvalidateRect(hWnd,NULL,TRUE);
		break;
	}
}

void OnPixel(HDC hDC)
{
	for(int i =0;i < 255;i++)
	{
		for(int j = 0;j < 255;j++)
			SetPixel(hDC,100+i,100+j,RGB(i,j,0));
	}
}

void OnLine(HDC hDC)
{
	MoveToEx(hDC,200,200,NULL);
	LineTo(hDC,350,350);
	LineTo(hDC,500,200);
}

void OnRect(HDC hDC)
{
	Rectangle(hDC,50,150,250,250);
	RoundRect(hDC,300,150,500,250,150,150);
}

void OnEllipse(HDC hDC)
{
	Ellipse(hDC,50,150,250,400);
	Ellipse(hDC,300,150,550,400);
}

void OnBitMap(HDC hDC)
{
	HBITMAP hBitMap = LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
	HDC hComDC = CreateCompatibleDC(hDC);
	HGDIOBJ hOldBit = SelectObject(hComDC,hBitMap);
	BITMAP bm = {0};
	GetObject(hBitMap,sizeof(bm),&bm);
	BitBlt(hDC,20,100,bm.bmWidth,bm.bmHeight,hComDC,0,0,SRCCOPY);
	StretchBlt(hDC,100,100,24,24,hComDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
	SelectObject(hComDC,hOldBit);
	DeleteObject(hOldBit);
	DeleteDC(hComDC);
}

void OnPaint(HWND hWnd)
{
	PAINTSTRUCT ps = {0};
	HDC hDC = BeginPaint(hWnd,&ps);
	HPEN hPen = CreatePen(PS_SOLID,3,RGB(255,0,0));
	HGDIOBJ hOldPen = SelectObject(hDC,hPen);
	//HBRUSH hBrush = CreateSolidBrush(RGB(0,255,0));
	HBRUSH hBrush = CreateHatchBrush(HS_FDIAGONAL/*HS_DIAGCROSS*/,RGB(0,255,0));
	HGDIOBJ hOldBrush = SelectObject(hDC,hBrush);
	switch(nMenuID)
	{
	case ID_PIXEL:
		OnPixel(hDC);
		break;
	case ID_LINE:
		OnLine(hDC);
		break;
	case ID_RECT:
		OnRect(hDC);
		break;
	case ID_ELLIPSE:
		OnEllipse(hDC);
		break;
	case ID_BITMAP:
		OnBitMap(hDC);
		break;
	}
	SelectObject(hDC,hOldPen);
	SelectObject(hDC,hOldBrush);
	DeleteObject(hBrush);
	DeleteObject(hPen);
	EndPaint(hWnd,&ps);
}

LRESULT CALLBACK MyProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_PAINT:
		OnPaint(hWnd);
		break;
	case WM_COMMAND:
		OnCommand(hWnd,wParam);
		break;
	case WM_SYSCOMMAND:
		if (wParam == SC_CLOSE)
		{
			PostQuitMessage(0);
		}
		break;
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

ATOM Register(LPCWSTR className)
{
	WNDCLASSEX wc = {0};
	wc.cbClsExtra = 0;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hIconSm = NULL;
	wc.hInstance = g_hInstance;
	wc.lpfnWndProc = MyProc;
	wc.lpszClassName = className;
	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);//NULL;
	wc.style = CS_VREDRAW | CS_HREDRAW;
	return RegisterClassEx(&wc);
}

HWND Create(LPCWSTR className,LPCWSTR windowName)
{
	//在创建窗口中,只能用来修改菜单
	return CreateWindowEx(0,className,windowName,WS_OVERLAPPEDWINDOW,100,100,600,600,NULL,NULL,g_hInstance,NULL);
}

void Show(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}

void Message()
{
	MSG ms = {0};
	while (GetMessage(&ms,NULL,0,0))
	{
		TranslateMessage(&ms);
		DispatchMessage(&ms);
	}
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	g_hInstance = hInstance;
	Register(__TEXT("Main"));
	HWND hWnd = Create(__TEXT("Main"),__TEXT("This is test"));
	Show(hWnd);
	Message();
	return 0;
}


你可能感兴趣的:(WIN32学习,win32,MFC,c++,c,windows)