国产一区二区精品-国产一区二区精品久-国产一区二区精品久久-国产一区二区精品久久91-免费毛片播放-免费毛片基地

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > GDI+Window詳解

GDI+Window詳解

來源:千鋒教育
發布人:xqq
時間: 2023-11-22 08:16:21 1700612181

一、GDI Windows

GDI+(Graphics Device Interface)Windows是微軟公司推出的一組圖像處理API。該API使用GDI的基本功能,加上更多的屬性和方法,可以完成更多高級圖像處理任務。它被廣泛應用于Windows應用程序的圖形處理,如游戲開發、廣告設計等。其中,開發GDI+Window應用程序,需要注意以下幾點:

1、創建GDI+Window


HWND hWnd;    //窗口句柄
HDC hdcMem;    //內存設備上下文句柄 
Graphics * graphics;    //圖形對象指針
Image * image;    //繪制的圖片
ULONG_PTR token;   //token值,用于初始化GDI+  

//初始化GDI+
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&token, &gdiplusStartupInput, NULL);

//創建窗口
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
wcex.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR));
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClassEx(&wcex);

//創建窗口
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

2、繪制GDI+圖像


PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);

//創建內存設備上下文
hdcMem = CreateCompatibleDC(hdc);
RECT rc;
GetClientRect(hWnd, &rc);

//創建Graphics對象
graphics = new Graphics(hdcMem);

//創建Image對象
image = Image::FromFile(L"path_to_image");

//繪制圖像
graphics->DrawImage(image, 0, 0, rc.right - rc.left, rc.bottom - rc.top);

//釋放資源
delete image;
delete graphics;
DeleteDC(hdcMem);

EndPaint(hWnd, &ps);

3、處理GDI+事件


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_PAINT:
        OnPaint(hWnd);
        break;
    case WM_DESTROY:
        GdiplusShutdown(token);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

void OnPaint(HWND hWnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);

    //創建內存設備上下文
    hdcMem = CreateCompatibleDC(hdc);
    RECT rc;
    GetClientRect(hWnd, &rc);

    //創建Graphics對象
    graphics = new Graphics(hdcMem);

    //創建Image對象
    image = Image::FromFile(L"path_to_image");

    //繪制圖像
    graphics->DrawImage(image, 0, 0, rc.right - rc.left, rc.bottom - rc.top);

    //釋放資源
    delete image;
    delete graphics;
    DeleteDC(hdcMem);

    EndPaint(hWnd, &ps);
}

二、GDI+Window阻止關機

在使用GDI+Window的時候,可能會遇到突然關機的情況,這時就需要防止突然關機引起的數據損壞。可以使用SetConsoleCtrlHandler函數,注冊一個控制信號處理函數。例如:


BOOL WINAPI ConsoleCtrlHandler(DWORD dwCtrlType)
{
    GdiplusShutdown(token);
    switch (dwCtrlType)
    {
    case CTRL_C_EVENT:
        printf("Ctrl-C event\n\n");
        return TRUE;
    case CTRL_CLOSE_EVENT:
        printf("Ctrl-Close event\n\n");
        return TRUE;
    case CTRL_BREAK_EVENT:
        printf("Ctrl-Break event\n\n");
        return TRUE;
    case CTRL_LOGOFF_EVENT:
        printf("Ctrl-Logoff event\n\n");
        return TRUE;
    case CTRL_SHUTDOWN_EVENT:
        printf("Ctrl-Shutdown event\n\n");
        return TRUE;
    default:
        return FALSE;
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //初始化GDI+
    GdiplusStartupInput gdiplusStartupInput;
    GdiplusStartup(&token, &gdiplusStartupInput, NULL);

    //處理控制信號
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleCtrlHandler, TRUE);

    //創建窗口...
}

三、GDI+Window內存不能讀

如果在使用GDI+Window時,遇到“內存不能讀”或者“內存泄漏”的情況,可能是由于內存分配過多、內存越界、變量未初始化等問題引起的,可以使用內存泄漏檢測工具進行檢查。例如,使用CrtDbg工具進行檢測:


#define _CRTDBG_MAP_ALLOC
#include 
#include 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);

    //創建窗口...

    _CrtDumpMemoryLeaks();
    return 0;
}

四、GDI Window是怎么按出來的

GDI+Window是通過對GDI的拓展可以實現更多圖像處理任務。在Windows操作系統中,可以通過CreateWindowEx函數來創建一個窗口,并使用GDI+對圖像進行處理。

五、GDI+Windowed

GDI+Windowed是指使用GDI+對Windows窗口進行圖像處理。它可以用來實現游戲開發、廣告設計等,也可以用來進行圖像展示。

六、GDI+ Windows未關閉

在使用GDI+Window時,可以遇到突然關機的情況。為了防止突然關機引起的數據損壞,可以使用SetConsoleCtrlHandler函數,注冊一個控制信號處理函數。例如:


BOOL WINAPI ConsoleCtrlHandler(DWORD dwCtrlType)
{
    GdiplusShutdown(token);
    switch (dwCtrlType)
    {
    case CTRL_C_EVENT:
        printf("Ctrl-C event\n\n");
        return TRUE;
    case CTRL_CLOSE_EVENT:
        printf("Ctrl-Close event\n\n");
        return TRUE;
    case CTRL_BREAK_EVENT:
        printf("Ctrl-Break event\n\n");
        return TRUE;
    case CTRL_LOGOFF_EVENT:
        printf("Ctrl-Logoff event\n\n");
        return TRUE;
    case CTRL_SHUTDOWN_EVENT:
        printf("Ctrl-Shutdown event\n\n");
        return TRUE;
    default:
        return FALSE;
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //初始化GDI+
    GdiplusStartupInput gdiplusStartupInput;
    GdiplusStartup(&token, &gdiplusStartupInput, NULL);

    //處理控制信號
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleCtrlHandler, TRUE);

    //創建窗口...
}

七、GDI Windows什么意思

GDI(Graphics Device Interface)是Windows操作系統中的一個圖形設備接口,是操作系統和圖形設備之間的一個數據交換接口。它提供了一個標準的方式,將應用程序提供的圖形數據發送到圖形設備上進行顯示。而GDI+ Windows是微軟公司推出的一組圖像處理API,使用GDI的基本功能,加上更多的屬性和方法,可以完成更多高級圖像處理任務。

八、GDI Window是什么意思

GDI(Graphics Device Interface)是Windows操作系統中的一個圖形設備接口,是操作系統和圖形設備之間的一個數據交換接口。而GDI+ Window是對GDI的拓展,可以實現更多高級圖像處理任務的一組圖像處理API。

tags: g*power
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT