WM_PAINT 文字繪製代碼。NULL,避免閃爍。WS_EX_TOPMOST | WS_POPUP,尺寸設為螢幕解析度。VK_ESCAPE/VK_F12 退出。ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASS wc = { 0 };
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL; // 關鍵:無背景刷
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle,
WS_POPUP, 0, 0,
GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
NULL, NULL, hInstance, NULL);
// ... ShowWindow, UpdateWindow
}
LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDSPrimary, lpDDSBack;
DDSURFACEDESC ddsd = { sizeof(ddsd) };
DDSCAPS ddscaps;
HRESULT ddrval;
ddrval = DirectDrawCreate(NULL, &lpDD, NULL);
if (ddrval == DD_OK)
ddrval = lpDD->SetCooperativeLevel(hWnd,
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
if (ddrval == DD_OK)
ddrval = lpDD->SetDisplayMode(640, 480, 8); // 640x480 256 色
if (ddrval == DD_OK)
{
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE
| DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL);
}
if (ddrval == DD_OK)
{
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
}
// 失敗時呼叫 DestroyDirectDrawObjects() 清理並銷毀視窗
void DestroyDirectDrawObjects()
{
if (lpDD)
{
lpDD->RestoreDisplayMode();
if (lpDDSPrimary)
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
lpDD->Release();
lpDD = NULL;
}
}
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
case VK_F12:
DestroyDirectDrawObjects();
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
break;
#include <ddraw.h>ddraw.lib此為 DirectDraw 7/舊版 DirectX 基礎架構,現代專案建議改用 Direct3D 9/11/12。