初探GDI——基本框架(载入位图)

来源:互联网 发布:网络系统安全巡检方案 编辑:程序博客网 时间:2024/06/05 06:29

  跟随的书本的进度,今天尝试GDI载入bmp格式位图,采用创建与屏幕窗口兼容的DC作为缓冲,使窗口重绘更平滑。
  载入位图分为四个步骤:
    1、载入位图;使用LoadImage()载入位图资源。
    2、创建兼容DC;使用CreateCompatible()创建与窗口DC兼容的内存DC用于缓存图像信息。
    3、选用位图对象;使用SelectObject()将第一步载入的对象选用为兼容DC内位图对象。
    4、进行贴图;使用BilBlt()将兼容DC内的位图贴在窗口DC上,实现位图的显示。

  在最后释放资源的时候,采用先进后出的方式,先创建的对象最后释放,后创建的对象,先释放。

  源码:
  

/*尝试GDI载入位图,采用创建与屏幕窗口兼容的DC作为缓冲,使窗口重绘更平滑2017/08/20*///头文件#include <windows.h>//全局变量HDC g_hdc,g_mdc;HBITMAP g_BitMap;//全局函数声明LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);bool Game_Init(HWND);void Game_Paint(HWND);bool Game_CleanUp(HWND);//入口函数int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,    LPSTR lpCmdLine,int nCmdShow){    //创建窗口类    WNDCLASSEX wndClass = { 0 };    wndClass.cbClsExtra = 0;    wndClass.cbWndExtra = 0;    wndClass.cbSize = sizeof(WNDCLASSEX);    wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);    wndClass.hInstance = hInstance;    wndClass.lpfnWndProc = WndProc;    wndClass.lpszClassName = L"GDIBitMap";    wndClass.lpszMenuName = NULL;    wndClass.style = CS_VREDRAW|CS_HREDRAW;    //注册窗口类    RegisterClassEx(&wndClass);    //可创建窗口    HWND hwnd = CreateWindow(L"GDIBitMap", L"加载位图", WS_OVERLAPPEDWINDOW,        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr,        nullptr, hInstance, nullptr);    //显示、移动、刷新窗口    ShowWindow(hwnd, nCmdShow);    MoveWindow(hwnd, 0, 0, 1024, 600, true);    UpdateWindow(hwnd);    //初始化资源    Game_Init(hwnd);    //消息循环    MSG msg = { 0 };    while (msg.message!=WM_QUIT)    {        if (PeekMessage(&msg,nullptr,0,0,PM_REMOVE))        {            TranslateMessage(&msg);            DispatchMessage(&msg);        }    }    //释放资源    Game_CleanUp(hwnd);    return 0;}//全局函数定义//窗口过程函数LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){    PAINTSTRUCT paintstruct;    switch (message)    {    case WM_PAINT:        g_hdc = BeginPaint(hwnd, &paintstruct); //开始绘图        Game_Paint(hwnd);        EndPaint(hwnd, &paintstruct);   //结束绘图        ValidateRect(hwnd, NULL);   //刷新窗口        break;    case WM_KEYDOWN:        if (wParam == VK_ESCAPE)            DestroyWindow(hwnd);    //关闭窗口        break;    case WM_DESTROY:        PostQuitMessage(0);     //结束线程        break;    default:        return DefWindowProc(hwnd, message, wParam, lParam);        break;    }    return 0;}//初始化函数bool Game_Init(HWND hwnd){    g_hdc = GetDC(hwnd);    //获取设备环境    //载入位图资源    g_BitMap = (HBITMAP)LoadImage(NULL, L"34_3.bmp", IMAGE_BITMAP,1024, 600, LR_LOADFROMFILE);    //创建与屏幕DC兼容的内存DC,用于缓冲画面    g_mdc = CreateCompatibleDC(g_hdc);    ReleaseDC(hwnd, g_hdc);     //释放设备环境    Game_Paint(hwnd);    return true;}//绘图函数void Game_Paint(HWND hwnd){    g_hdc = GetDC(hwnd);    //获取设备环境    SelectObject(g_mdc, g_BitMap);  //绑定内存DC的位图对象    BitBlt(g_hdc, 0, 0, 1024, 600, g_mdc, 0, 0, SRCCOPY);   //将内存DC的位图对象以SRCCOPY的方式贴入屏幕DC    ReleaseDC(hwnd, g_hdc);     //释放设备环境}//资源清理函数bool Game_CleanUp(HWND hwnd){    //释放资源    DeleteObject(g_BitMap);    DeleteObject(g_mdc);    return true;}