WINAPIでダブルダブル・バッファリング

http://blog.goo.ne.jp/masaki_goo_2006/e/d3c18365234ffb3383f5c30e32c83cf5
コチラを参考にダブル・バッファリングの勉強をしています.
下記のコードが VisualStudio2010 ではコンパイルできましたが, MinGW ではエラーでコンパイルすることができませんでした.

原因は何でしょうか.

```cpp:winmain.cpp
/**************************************************
* ダブル・バッファリング
**************************************************/
#include <windows.h>

/**
 * Macro
 */
#define SCREEN_WIDTH	640				// オフスクリーンの画面サイズ
#define SCREEN_HEIGHT	480 			// 〃


/**
 * Prototype declaration
 */
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);


/**
 * Main
 */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow )
{
	HWND hwnd;
	WNDCLASSEX wc;
	MSG msg;
	static LPSTR lpClassName = "Sample";
	
	wc.cbSize 			= sizeof(WNDCLASSEX);				// 構造体サイズ
	wc.style 			= CS_HREDRAW | CS_VREDRAW;			// クラススタイル
	wc.lpfnWndProc 		= (WNDPROC)WndProc;
	wc.cbClsExtra 		= wc.cbWndExtra = 0;				// 補足メモリブロックのサイズ
	wc.hInstance 		= hInstance;						// インスタンス
	wc.hIcon 			= LoadIcon(NULL, IDI_APPLICATION);	// アイコン
	wc.hCursor 			= LoadCursor(NULL, IDC_ARROW);		// カーソル
	wc.hbrBackground 	= (HBRUSH)(COLOR_WINDOW+1);			// 背景色
	wc.lpszMenuName 	= NULL;								// メニュー名
	wc.lpszClassName 	= lpClassName;						// クラス名
	wc.hIconSm 			= NULL;								// アイコン

	if (!RegisterClassEx(&wc)) { return FALSE; }	// 登録
	
	hwnd = CreateWindow(
			lpClassName, TEXT("TITLE"),
			WS_OVERLAPPEDWINDOW | WS_VISIBLE,
			CW_USEDEFAULT, CW_USEDEFAULT,
			SCREEN_WIDTH, SCREEN_HEIGHT,
			NULL, NULL,
			hInstance, NULL
	);
	
	if (hwnd == NULL) return -1;
	
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	return 0;
}


/**
 * @function WndProc()
 * ウィンドウプロシージャ
 */
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static HBITMAP	hBitmap;	// ビットマップ
	static HDC hMemDC;			// オフスクリーン
	static UINT saveX, saveY;

	switch (msg) {
		case WM_CREATE: {
			HDC hdc;
			
			// デバイスコンテキストの作成
			hdc		= GetDC(hWnd);
			hMemDC	= CreateCompatibleDC(hdc);
			hBitmap	= CreateCompatibleBitmap(hdc, SCREEN_WIDTH, SCREEN_HEIGHT);
			SelectObject(hMemDC, hBitmap);
			SelectObject(hMemDC, GetStockObject(DC_PEN));
			SelectObject(hMemDC, GetStockObject(DC_BRUSH));
			ReleaseDC(hWnd, hdc);
			break;
		}
		case WM_CLOSE: {
			// デバイスコンテキストの破棄
			DeleteDC(hMemDC);
			DeleteObject(hMemDC);
			DestroyWindow(hWnd);
			break;
		}
		case WM_PAINT: {
			PAINTSTRUCT	ps;
			HDC hdc;
			
			// デバイスコンテキストの描画
			hdc = BeginPaint(hWnd, &ps);
			BitBlt(hdc, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, hMemDC, 0, 0, SRCCOPY);
			EndPaint(hWnd, &ps);
			break;
		}
		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}
		case WM_ERASEBKGND: {
			break;
		}
		case WM_LBUTTONDOWN: {
		case WM_LBUTTONDBLCLK: {
			UINT cx = (SHORT)LOWORD(lParam);
			UINT cy = (SHORT)HIWORD(lParam);
			
			if (GetKeyState(VK_SHIFT) < 0) {
				cx = saveX += 16;
				cy = saveY += 16;
			}
			SetDCPenColor(hMemDC, RGB(0xFF, 0xFF, 0x00));
			SetDCBrushColor(hMemDC, RGB(0x00, 0x00, 0xFF));
			Rectangle(hMemDC, cx, cy, (cx + 16*5), (cy + 16*3));
			InvalidateRect(hWnd, NULL, FALSE);
			break;
		}
		}
		case WM_RBUTTONUP: {
			saveX = saveY = 0;
			PatBlt(hMemDC, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, BLACKNESS);
			InvalidateRect(hWnd, NULL, FALSE);
			break;
		}
		default: {
			return DefWindowProc(hWnd, msg, wParam, lParam);
			break;
		}
	}
}
```

■コマンド
gcc winmain.cpp -mwindows

■エラー
winmain.cpp: 関数 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)' 内:
winmain.cpp:29:29: 警告: deprecated conversion from string constant to 'LPSTR
ka char*}' [-Wwrite-strings]
winmain.cpp: 関数 'LRESULT WndProc(HWND, UINT, WPARAM, LPARAM)' 内:
winmain.cpp:87:40: エラー: 'DC_PEN' was not declared in this scope
winmain.cpp:88:40: エラー: 'DC_BRUSH' was not declared in this scope
winmain.cpp:125:47: エラー: 'SetDCPenColor' was not declared in this scope
winmain.cpp:126:49: エラー: 'SetDCBrushColor' was not declared in this scope