WIN32学习——绘图

来源:互联网 发布:蓝桥杯单片机怎么准备 编辑:程序博客网 时间:2024/05/16 01:26

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 <Windows.h>#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;}