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

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > GDI+Window詳解

GDI+Window詳解

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

一、GDI Windows

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

1、創(chuàng)建GDI+Window


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

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

//創(chuàng)建窗口
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);

//創(chuàng)建窗口
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);

//創(chuàng)建內(nèi)存設(shè)備上下文
hdcMem = CreateCompatibleDC(hdc);
RECT rc;
GetClientRect(hWnd, &rc);

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

//創(chuàng)建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);

    //創(chuàng)建內(nèi)存設(shè)備上下文
    hdcMem = CreateCompatibleDC(hdc);
    RECT rc;
    GetClientRect(hWnd, &rc);

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

    //創(chuàng)建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阻止關(guān)機(jī)

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


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);

    //創(chuàng)建窗口...
}

三、GDI+Window內(nèi)存不能讀

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


#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);

    //創(chuàng)建窗口...

    _CrtDumpMemoryLeaks();
    return 0;
}

四、GDI Window是怎么按出來的

GDI+Window是通過對GDI的拓展可以實(shí)現(xiàn)更多圖像處理任務(wù)。在Windows操作系統(tǒng)中,可以通過CreateWindowEx函數(shù)來創(chuàng)建一個窗口,并使用GDI+對圖像進(jìn)行處理。

五、GDI+Windowed

GDI+Windowed是指使用GDI+對Windows窗口進(jìn)行圖像處理。它可以用來實(shí)現(xiàn)游戲開發(fā)、廣告設(shè)計等,也可以用來進(jìn)行圖像展示。

六、GDI+ Windows未關(guān)閉

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


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);

    //創(chuàng)建窗口...
}

七、GDI Windows什么意思

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

八、GDI Window是什么意思

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

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