LoginSignup
1
1

More than 5 years have passed since last update.

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

Posted at

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

原因は何でしょうか.

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1