一、GDI Windows
GDI+(Graphics Device Interface)Windows是微軟公司推出的一組圖像處理API。該API使用GDI的基本功能,加上更多的屬性和方法,可以完成更多高級(jí)圖像處理任務(wù)。它被廣泛應(yīng)用于Windows應(yīng)用程序的圖形處理,如游戲開發(fā)、廣告設(shè)計(jì)等。其中,開發(fā)GDI+Window應(yīng)用程序,需要注意以下幾點(diǎn):
1、創(chuàng)建GDI+Window
HWND hWnd; //窗口句柄
HDC hdcMem; //內(nèi)存設(shè)備上下文句柄
Graphics * graphics; //圖形對(duì)象指針
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對(duì)象
graphics = new Graphics(hdcMem);
//創(chuàng)建Image對(duì)象
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對(duì)象
graphics = new Graphics(hdcMem);
//創(chuàng)建Image對(duì)象
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的時(shí)候,可能會(huì)遇到突然關(guān)機(jī)的情況,這時(shí)就需要防止突然關(guān)機(jī)引起的數(shù)據(jù)損壞。可以使用SetConsoleCtrlHandler函數(shù),注冊(cè)一個(gè)控制信號(hào)處理函數(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);
//處理控制信號(hào)
SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleCtrlHandler, TRUE);
//創(chuàng)建窗口...
}
三、GDI+Window內(nèi)存不能讀
如果在使用GDI+Window時(shí),遇到“內(nèi)存不能讀”或者“內(nèi)存泄漏”的情況,可能是由于內(nèi)存分配過(guò)多、內(nèi)存越界、變量未初始化等問(wèn)題引起的,可以使用內(nèi)存泄漏檢測(cè)工具進(jìn)行檢查。例如,使用CrtDbg工具進(jìn)行檢測(cè):
#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是怎么按出來(lái)的
GDI+Window是通過(guò)對(duì)GDI的拓展可以實(shí)現(xiàn)更多圖像處理任務(wù)。在Windows操作系統(tǒng)中,可以通過(guò)CreateWindowEx函數(shù)來(lái)創(chuàng)建一個(gè)窗口,并使用GDI+對(duì)圖像進(jìn)行處理。
五、GDI+Windowed
GDI+Windowed是指使用GDI+對(duì)Windows窗口進(jìn)行圖像處理。它可以用來(lái)實(shí)現(xiàn)游戲開發(fā)、廣告設(shè)計(jì)等,也可以用來(lái)進(jìn)行圖像展示。
六、GDI+ Windows未關(guān)閉
在使用GDI+Window時(shí),可以遇到突然關(guān)機(jī)的情況。為了防止突然關(guān)機(jī)引起的數(shù)據(jù)損壞,可以使用SetConsoleCtrlHandler函數(shù),注冊(cè)一個(gè)控制信號(hào)處理函數(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);
//處理控制信號(hào)
SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleCtrlHandler, TRUE);
//創(chuàng)建窗口...
}
七、GDI Windows什么意思
GDI(Graphics Device Interface)是Windows操作系統(tǒng)中的一個(gè)圖形設(shè)備接口,是操作系統(tǒng)和圖形設(shè)備之間的一個(gè)數(shù)據(jù)交換接口。它提供了一個(gè)標(biāo)準(zhǔn)的方式,將應(yīng)用程序提供的圖形數(shù)據(jù)發(fā)送到圖形設(shè)備上進(jìn)行顯示。而GDI+ Windows是微軟公司推出的一組圖像處理API,使用GDI的基本功能,加上更多的屬性和方法,可以完成更多高級(jí)圖像處理任務(wù)。
八、GDI Window是什么意思
GDI(Graphics Device Interface)是Windows操作系統(tǒng)中的一個(gè)圖形設(shè)備接口,是操作系統(tǒng)和圖形設(shè)備之間的一個(gè)數(shù)據(jù)交換接口。而GDI+ Window是對(duì)GDI的拓展,可以實(shí)現(xiàn)更多高級(jí)圖像處理任務(wù)的一組圖像處理API。