绘图基础:
绘图设备DC(Device Context),绘图上下文/绘图描述表
HDC-DC句柄,表示绘图设备
GDI-Windows graphics device interface(Win32 提供的绘图API)
颜色:计算机使用红、绿、蓝,
R - 0 ~ 255
G - 0 ~ 255
B - 0 ~ 255
每一个点颜色是三个字节24位保存0-2^24-1
16位:5,5,6
32位:8, 8, 8, 8绘图或透明度。
HDC hdc = BeginPaint(hWnd...);
TextOut(hdc, 100, 100, "hello", ...);
......
EndPaint(...);
颜色的使用:
COLORREF:实际DWORD,也就是usign long
例如:COLOREF nColor = 0;
赋值使用RGB宏:
例如: nColor = RGB(0, 0, 255);
获取RGB值:
GetRValue/GetGValue/GetBValue
例如:BYTE nRed = GetRValue(nColor);就得到了nColor的红色配比
基本图形绘制:
SetPixel设置指定点的颜色
COLORREF SetPixel(
HDC hdc,
int X,
int Y,
COLORREF crColor//设置的颜色
);返回原来的颜色。
线的使用(直线、弧线)
MoveToEx:指明窗口当前点
LineTo:从窗口的当前点到指定的点绘制一条执行案
当前点:上一次绘图时的最后一点,初始为0,0点
封闭图形:能够用画刷填充的图形
Rectangle(直角矩形) / Ellipse(圆形)
GDI绘图对象之画笔
画笔的作用:线条的颜色,线型, 线粗。HPEN:画笔句柄。
画笔的使用:
1.创建画笔:
HPEN CreatePen(
int fnPenStyle,//画笔的样式
int nWidth, //画笔的粗细
COLORREF crColor // 画笔的颜色
);创建成功返回句柄。
PS_SOLID:实心线,可以支持多个像素宽,其他线型只能一个像素宽。
2.将画笔应用到DC中
HGDIOBJ SelectObject(
HDC hdc,//绘图设备句柄
HGDIOBJ hgdiobj //GDI绘图对象句柄,画笔句柄
);返回原来的GDI绘图对象句柄。
3.绘图
4.取出DC中的画笔
将原来的画笔使用SelectObject函数放入DC中,就会将我们创建的画笔取回
5.释放画笔
BOOL DeleteObject(
HGDIOBJ hObject //GDI绘图对象句柄,画笔句柄
);
只能删除不被DC使用的画笔,所以再释放前,必须将画笔从DC取出。
GDI绘图对象之画刷
画刷的作用:给封闭图形填充颜色、图案
画刷的使用:
1.创建画刷
CreateSolidBrush//实心画刷
CreateHatchBrush//纹理画刷
2.将画刷应用到DC中:SelectObject
3.绘图
4.将画刷从DC取出
5.删除画刷。
透明画刷:GetStockObject(NULL_BRUSH);//返回HGDIOBJ类型
位图绘制:
位图相关:光栅图形-记录图像中每一个点的颜色等信息。
矢量图形-记录图像算法、绘图指令等。
HBITMAP-位图句柄
位图的使用:
1.在资源中添加位图资源
2.从资源中加载位图LoadBitmap
3.创建一个与当前DC相匹配的DC(内存DC)
HDC CreateCompatibleDC(
HDC hdc //当前DC句柄,可以为NULL(使用屏幕DC)
);返回创建好的DC句柄。
#include <windows.h>
void DrawPit(HDC hdc) {
SetPixel(hdc, 100, 100, RGB(255, 0, 0));
}
void DrawLine(HDC hdc) {
MoveToEx(hdc, 100, 100, NULL);
LineTo(hdc, 300, 300);
}
void DrawRect(HDC hdc) {
Rectangle(hdc, 100, 100, 300, 300);//左上右下边距
}
void DrawEll(HDC hdc) {
Ellipse(hdc, 100, 100, 300, 300);//左上右下边距的内切圆
}
void OnPaint(HWND hWnd) {
PAINTSTRUCT ps = { 0 };
HDC hdc = BeginPaint(hWnd, &ps);
//DrawPit(hdc); //绘制点
//DrawLine(hdc);//绘制直线
//DrawRect(hdc);//绘制矩形
//DrawEll(hdc);//绘制圆形
HPEN hPen = CreatePen(PS_SOLID, 100, RGB(255, 0, 0));
//HBRUSH hBrush = CreateSolidBrush(RGB(0, 255, 0));
HBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(0, 255, 0));
HGDIOBJ nOldPen = SelectObject(hdc, hPen);
HGDIOBJ nOldBrush = SelectObject(hdc, hBrush);
DrawEll(hdc);
SelectObject(hdc, nOldPen);
SelectObject(hdc, nOldBrush);
DeleteObject(hPen);
DeleteObject(hBrush);
EndPaint(hWnd, &ps);
}
//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgId, WPARAM wParam, LPARAM lParam) {
switch (msgId) {
case WM_PAINT:
OnPaint(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msgId, wParam, lParam);
}
//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {
//注册窗口类
WNDCLASS wc = { 0 };
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
wc.hCursor = NULL;
wc.hIcon = NULL;
wc.hInstance = hIns;
wc.lpfnWndProc = WndProc;
TCHAR name[] = TEXT("Main");
wc.lpszClassName = name;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);//将以上所有赋值全部写入操作系统。
//在内存中创建窗口
HWND hWnd = CreateWindow(name, TEXT("title"), WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);
//显示窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
//消息循环
MSG nMsg = { 0 };
while (GetMessage(&nMsg, NULL, 0, 0)) {
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理
}
return 0;
}