设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 数据 创业者 手机
当前位置: 首页 > 服务器 > 系统 > 正文

Windows程序设计--(五)绘图基础

发布时间:2021-02-22 20:13 所属栏目:52 来源:网络整理
导读:5.1 GDI的结构 图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视讯显示器和打印机上显示图形。 ? 5.2 设备环境 5.2.1 获取设备环境句柄 最常用的取得并释放设备内容句柄的方法是,在处理WM_PAINT消息时,使用BeginPaint和EndPa

5.1 GDI的结构

图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视讯显示器和打印机上显示图形。

?

5.2 设备环境

5.2.1 获取设备环境句柄

最常用的取得并释放设备内容句柄的方法是,在处理WM_PAINT消息时,使用BeginPaint和EndPaint呼叫:

hdc = BeginPaint (hwnd,&ps) ;
其它行程序
EndPaint (hwnd,&ps) ;

?

Windows程序还可以在处理非WM_PAINT消息时取得设备内容句柄:

hdc = GetDC (hwnd) ;
其它行程序
ReleaseDC (hwnd,hdc) ;

?

Windows程序还可以取得适用于整个窗口(而不仅限于窗口的显示区域)的设备内容句柄:

hdc = GetWindowDC (hwnd) ;
其它行程序
ReleaseDC (hwnd,hdc) ;

?

5.3 点和线的绘制

5.3.1 设定像素

SetPixel函数在指定的x和y坐标以特定的颜色设定图素:

SetPixel (hdc,x,y,crColor) ;

?

第一个参数是设备内容的句柄。第二个和第三个参数指明了坐标位置。通常要获得窗口显示区域的设备内容,并且x和y相对于该显示区域的左上角。最后一个参数是COLORREF型态指定了颜色。如果在函数中指定的颜色视讯显示器不支持,则函数将图素设定为最接近的纯色并从函数传回该值。

GetPixel函数传回指定坐标处的图素颜色:

crColor = GetPixel (hdc,y) ;

?

5.3.2 直线

画一条直线,必须呼叫两个函数。第一个函数指定了线的开始点,第二个函数指定了线的终点:

MoveToEx (hdc,xBeg,yBeg,NULL) ;
LineTo (hdc,xEnd,yEnd) ;

?

绘制直线

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//消息函数声明

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)//主函数
{
    static TCHAR szAppName[] = TEXT("WNDCLASS NAME");//窗口类名称
    HWND hwnd;//句柄
    MSG msg;//结构体
    WNDCLASS wndclass;//窗口类

    //窗口类属性
    wndclass.style = CS_HREDRAW | CS_VREDRAW;//样式
    wndclass.lpfnWndProc = WndProc;//窗口处理函数
    wndclass.cbClsExtra = 0;//窗口实例扩展
    wndclass.cbWndExtra = 0;//窗口类扩展
    wndclass.hInstance = hInstance;//窗口实例句柄
    wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);//加载图标
    wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);//鼠标,移入内容区域变成箭头
    wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);//主窗口背景色
    wndclass.lpszMenuName = NULL;//窗口菜单
    wndclass.lpszClassName = szAppName;//窗口类名

    if (!RegisterClass(&wndclass)) {//注册窗口类,如果注册失败弹出窗口
        MessageBox(NULL,TEXT("窗口创建失败!程序需要Windows NT!(传递窗口消息为UNICODE)"),szAppName,MB_ICONERROR);//消息窗口

        return 0;
    }

    hwnd = CreateWindow(szAppName,//Windows类名
        TEXT("窗口绘制成功!"),//窗口标题
        WS_OVERLAPPEDWINDOW,//窗口风格
        CW_USEDEFAULT,//初始化窗口位置的X坐标
        CW_USEDEFAULT,//初始化窗口位置的Y坐标
        500,//初始化窗口宽度大小
        500,//初始化窗口长度大小
        NULL,//父类窗口句柄
        NULL,//窗口菜单句柄
        hInstance,//程序实例句柄
        NULL);                    //创建参数
    ShowWindow(hwnd,iCmdShow);//显示窗口
    UpdateWindow(hwnd);//更新窗口

    while (GetMessage(&msg,NULL,0,0)) {//从消息队列中获取消息
        TranslateMessage(&msg);//将虚拟键消息转换为字符消息
        DispatchMessage(&msg);//分发到回调函数
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) {
    HDC hdc;//设备环境句柄
    int x,y;
    /*
    typedef struct tagRECT
    {
        LONG    left;
        LONG    top;
        LONG    right;
        LONG    bottom;
    } RECT
    其中left,top赋为0,因此right和bottom表示客户区的宽度和高度(像素)
    */
    RECT rect;//矩形结构

    switch (message) {//处理得到的消息
    case WM_PAINT://处理窗口绘制
        hdc = GetDC(hwnd);
        GetClientRect(hwnd,&rect);//获取当前位置
        for (x = 0; x < rect.right; x += 50) {//竖线
            MoveToEx(hdc,NULL);//设置起点
            LineTo(hdc,rect.bottom);//设置终点
        }
        for (y = 0; y < rect.bottom; y += 50) {//横线
            MoveToEx(hdc,0,NULL);
            LineTo(hdc,rect.right,y);
        }
        ReleaseDC(hwnd,hdc);
        return 0;
    case WM_DESTROY://处理窗口关闭时的消息
        PostQuitMessage(0);//将退出消息插入消息队列,程序从消息循环退出,return msg.wParam
        return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);//执行默认消息处理
}

Windows程序设计--(五)绘图基础

?

?

绘制矩形

Windows程序设计--(五)绘图基础

Windows程序设计--(五)绘图基础

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND,IDC_ARROW);//鼠标,移入内容区域变成箭头
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITENESS);//主窗口背景色
    wndclass.lpszMenuName = NULL;//窗口菜单
    wndclass.lpszClassName = szAppName;//窗口类名

    if (!RegisterClass(&wndclass)) {//注册窗口类,如果注册失败弹出窗口
        MessageBox(NULL,//Windows类名
        TEXT("Hk_Mayfly"),LPARAM lParam) {
    HDC hdc;//设备环境句柄
    POINT apt[5] = { 100,100,200,100 };//矩形坐标
    int i;
    /*
    typedef struct tagRECT
    {
        LONG    left;
        LONG    top;
        LONG    right;
        LONG    bottom;
    } RECT
    其中left,&rect);//获取当前位置
        MoveToEx(hdc,apt[0].x,apt[0].y,NULL);
        for (i = 1; i < 5; ++i) {
            LineTo(hdc,apt[i].x,apt[i].y);
        }
        ReleaseDC(hwnd,lParam);//执行默认消息处理
}
View Code

Windows程序设计--(五)绘图基础

使用Polyline替换,也可以绘制矩形。

Polyline(hdc,apt,5);

或者

MoveToEx(hdc,NULL);
PolylineTo(hdc,5);

?

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读