gdi 是图形设备接口 可以在屏幕上输出图形图像
gdi函数的分类
1、取得和释放设备上下文的函数
2、取得有关设备内容信息的函数
3、绘图函数
4、设定和取得设备上下文参数的函数
5、调用gdi对象的函数
gdi在屏幕上可以输出的图形图像分为四类
1、直线和曲线(像LineTo()函数可以画线,Arc()函数可以画弧)
2、填充区域(像FillEllipse()填充椭圆—)
3、文字(TextOut()函数输出字符串)
4、位图(像GetDC() 所获得的是屏幕的DC, 使用此DC ,可以对屏幕进行绘图)
设备上下文:dc(设备环境)包含有关某个设备的绘制属性信息的windows数据结构
在窗口绘制图形,图形分为四步
1、得到设备的环境句柄(hdc=GetDC(hWnd);)
2、修改设备属性
3、绘图
4、释放设备环境句柄(ReleaseDC(hWnd,hdc)?
在Windows里面得到设备环境句柄有两种情况:
1、在WM_PAINT消息里面去得到设备环境句柄
那么什么情况下窗口会响应paint消息:
(1)、在窗口最初创建时
(2)、窗口出现无效区域(使用的情况较多)
2、窗口一共有四种情况会出现无效区域
(1)、窗口移动或者大小改变
(2)、窗口隐藏之后重新显示或被其他窗口遮掩部分重新可见
(3)、调用InvalidateRect、InvalidateRgn函数,使窗口出现无效区域
(4)、ScrollDC和ScrollWindow函数,滚动客户区或窗口,出现无效区域。
2、在WM_PAINT消息外面去得到设备环境句柄(GetDC),第四步通过ReleaseDC释放环境句柄
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_RBUTTONDOWN:
{
hdc = GetDC(hWnd);
RECT r = { 0, 0, 1024, 768 };
HBRUSH hr = CreateSolidBrush(0xffffff);//填充区域,填充r这个矩形区域,用hr这个画刷
FillRect(hdc, &r, hr);
ReleaseDC(hWnd, hdc);
}
/* break;
case WM_LBUTTONDOWN:
{ hdc = GetDC(hWnd);
for (int i = 0; i < 100; ++i)
{
SetPixel(hdc, 100 + i, 10, RGB(255, 0, 0));
}
for (int i = 0; i < 100; ++i)
{
SetPixel(hdc, 100 + i, 200, GetPixel(hdc, 100 + i, 100));
}
ReleaseDC(hWnd, hdc);
}
break;*/
case WM_LBUTTONDOWN:
{
//1、得到设备的环境的句柄
hdc = GetDC(hWnd);
//2、修改设备属性
//没有设定画笔即为nullptr,默认为黑色
HPEN hpen = nullptr;//画笔句柄
hpen = (HPEN)GetStockObject(WHITE_PEN);//使用系统预设资源
hpen = CreatePen(PS_DOT//画笔风格
//1、画笔的笔宽,如果笔宽大于1,不管什么风格都会变成PS_SOLID
,1, RGB(255, 0, 0));//画笔的颜色
SelectObject(hdc, hpen);//选择gdi对象进dc
//3、绘图
//画线
MoveToEx(hdc, 100, 100, nullptr);//把画笔移动到某一个点
LineTo(hdc, 200, 200);//画线到某个点,如果之前没有设定起点,默认起点为0,0坐标,如果之前有画线,上个终点将是新起点
LineTo(hdc, 400, 200);//
//画圆弧:借助这个圆的外接矩形来确认圆的大小(逆时针来画)
//起点和终点可以不必在圆上,如果起(终)点在圆外,从圆心到起点做连线与圆的交点为起点(终)点,如果在圆内,从圆内到点做连线再做延长线与圆的交点,如果在圆心,沿x轴正方向与圆的交点
Arc(hdc,
100, 100, 600, 400, //圆或圆弧的外接矩形
0, 0,//圆弧的起点位置
350, 250);//圆弧的终点位置
//注意:如果有SelectObject就一定要用DeleteObject来释放gdi对象
DeleteObject(hpen);
//释放环境句柄
ReleaseDC(hWnd,hdc);
}
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}