?? 2d.txt
字號(hào):
HDC(Handle of Device Context)為一個(gè)設(shè)備環(huán)境的句柄。這里用來(lái)表示顯示設(shè)備。
GetDC(&hDC)函數(shù)用來(lái)取得一個(gè)顯示設(shè)備然后將這個(gè)設(shè)備的句柄賦給hDC。這聽(tīng)起來(lái)讓人糊涂,其實(shí)意思是說(shuō),用GetDC(&hDC)函數(shù)來(lái)創(chuàng)建一個(gè)同Windows GDI兼容的設(shè)備環(huán)境給指定頁(yè)面。用變量hDC來(lái)表示這個(gè)設(shè)備環(huán)境。
SetBkColor和SetTextColor當(dāng)然就是設(shè)置背景顏色和字符顏色了。它們和TextOut都是標(biāo)準(zhǔn)的Windows GDI函數(shù),可以參考任何一本關(guān)于Windows GDI的書(shū)。其實(shí)一看便明白TextOut(hDC, 220, 200, "Yes, I did it!", 14)中,hDC當(dāng)然就是前面說(shuō)的顯示設(shè)備,220肯定是X坐標(biāo),那么200當(dāng)然就是Y坐標(biāo)了,"Yes, I did it!"意思是“我成功了!”,而14則表示這個(gè)字符串有14個(gè)字符。下面的LPSTR則是Win32的字符串類(lèi)型,lstrlen(lpMesg)也是Windows的標(biāo)準(zhǔn)函數(shù)用來(lái)計(jì)算字符串的長(zhǎng)度。最后別忘了刪除掉這個(gè)設(shè)備。
我好象快成長(zhǎng)舌婦了,如果我再羅嗦下去的話,你可能會(huì)找月光寶盒逃命了。但悟空,為師不得不再說(shuō)一句,千萬(wàn)別忘了清除掉幾個(gè)全局變量,不然你可能每運(yùn)行一次程序都得重啟一次電腦,電腦這東西是寶物,重啟會(huì)影響壽命,就算不影響壽命浪費(fèi)能源也是不好的嘛......
清除變量:
if(lpDD != NULL)
{
if(lpDDPS != NULL)
lpDDPS->Release();
lpDDPS = NULL;
}
lpDD->Release();
lpDD = NULL;
}
將上面的代碼整理放入上次的最簡(jiǎn)單的Windows程序就能可以運(yùn)行了。但記得在VC的Project/Settings里將ddraw.lib加入連接庫(kù)里。
下面是完整的程序:
#include <windows.h>
#include <ddraw.h>
LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDPS;
HWND InitWindow(HINSTANCE hInstance, int nShowCmd);
LRESULT CALLBACK WindowProc(HWND hWindow, UINT message, WPARAM wParam,
LPARAM lParam);
bool InitDDraw(HWND hWindow);
void FreeDDraw();
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
MSG msg;
HWND hWindow;
hWindow = InitWindow(hInstance, nShowCmd);
if(hWindow == FALSE)
{
DestroyWindow(hWindow);
return false;
}
if(InitDDraw(hWindow) == false)
{
MessageBox(hWindow, "Error","!" ,MB_OK);
return false;
}
while(GetMessage(&msg, NULL, 0, 0) != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
HWND InitWindow(HINSTANCE hInstance, int nShowCmd)
{
HWND hWindow;
WNDCLASS WindowClass;
WindowClass.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WindowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
WindowClass.style = CS_HREDRAW | CS_VREDRAW;
WindowClass.lpfnWndProc = WindowProc;
WindowClass.cbClsExtra = 0;
WindowClass.cbWndExtra = 0;
WindowClass.hInstance = hInstance;
WindowClass.lpszMenuName = "ClassName";
WindowClass.lpszClassName = "ClassName";
RegisterClass(&WindowClass);
hWindow = CreateWindowEx(0, "ClassName", "WindowTitle",
//WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU,
WS_POPUP,
(GetSystemMetrics(SM_CXFULLSCREEN) - 640)/2,
(GetSystemMetrics(SM_CYFULLSCREEN) - 480)/2,
640, 480,
NULL, NULL, hInstance, NULL);
if(!hWindow)
return FALSE;
ShowWindow(hWindow, nShowCmd);
UpdateWindow(hWindow);
return hWindow;
}
bool InitDDraw(HWND hWindow)
{
DDSURFACEDESC ddsd;
HDC hdc;
LPSTR lpMesg;
if(DirectDrawCreate(NULL, &lpDD, NULL) != DD_OK)
return false;
if(lpDD->SetCooperativeLevel(hWindow,
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT) != DD_OK)
return false;
if ( lpDD->SetDisplayMode(800, 600, 32) != DD_OK)
return false;
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(lpDD->CreateSurface(&ddsd, &lpDDPS, NULL) != DD_OK)
return false;
if(lpDDPS->GetDC(&hdc) != DD_OK)
return false;
SetBkColor(hdc, RGB(0, 0, 255));
SetTextColor(hdc, RGB(255, 255, 0 ));
TextOut(hdc, 220, 200, "Yeh, I did it!", 14);
lpMesg = "Press ESC to exit";
TextOut( hdc, 280, 240, lpMesg, lstrlen(lpMesg));
lpDDPS->ReleaseDC(hdc);
return true;
}
void FreeDDraw()
{
if(lpDD != NULL)
{
if(lpDDPS != NULL)
{
lpDDPS->Release();
lpDDPS = NULL;
}
lpDD->Release();
lpDD = NULL;
}
}
LRESULT CALLBACK WindowProc(HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hWindow, WM_CLOSE, 0, 0);
break;
}
break;
case WM_DESTROY:
FreeDDraw();
PostQuitMessage(0);
break;
}
return DefWindowProc(hWindow, message, wParam, lParam);
}
這個(gè)程序?qū)⒛莻€(gè)史上最愚蠢的Windows程序升級(jí)為在DirectX下的全屏模式下顯示兩句傻兮兮的英文。我相信這足以讓很多有志于做專(zhuān)業(yè)的游戲卻又不知如何入手的人高興上三天三夜。因?yàn)檫M(jìn)入游戲編程的神秘殿堂似乎就在那漆黑的前方。雖然還不知道前面有多少艱苦的路要走,但起碼我們已經(jīng)找到了正確的方向。
我仍然強(qiáng)烈建議你仔細(xì)地閱讀MSDN的說(shuō)明,即可提高英文水平又能比較全面地理解這些代碼。
今天,你學(xué)會(huì)了怎樣在全屏模式下顯示文字,你可以試試將它改到窗口模式下。或加入一些其它東西。不管你有什么古怪的想法,都不要害怕去實(shí)現(xiàn)它,只有不斷地把你的電腦弄死機(jī),你才能成為真正的高手
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -