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;
}