-1

画像を使用してスピンの結果を表示するスロット マシン Win32 アプリを作成しようとしています。通常の LRESULT CALLBACK フレームに画像を表示する方法は知っていますが、ダイアログに画像を表示するとなるとわかりません。画像を表示する方法を(詳細に)説明してくれる人はいますか?ほんとうにありがとう。

私の現在のダイアログのコールバック:

BOOL CALLBACK DlgProc(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_INITDIALOG:         //dialog created
            g_hbmObject = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_OBJECT));
                                    //initialize slotmachine class
            Machine.Initialize(time(0));
            if(g_hbmObject == NULL) //test if object is loaded correctly
                std::cerr << "Could not load ball..";
        break;
        case WM_COMMAND:            //switch command
            switch(LOWORD(wParam))
            {
                case IDC_SPIN:      //slot machine spins
                                    //put spin function, decide what to display
                                    //do i put the display image command here? or where?
                break;
                case IDC_EXIT:      //exit button
                    DeleteObject(g_hbmObject);
                    EndDialog(hwnd, 0);
                break;
            }
        break;
        case WM_CLOSE:
        case WM_DESTROY:            //case program is exited
            DeleteObject(g_hbmObject);
            PostQuitMessage(0);
        break;
        default:
            return FALSE;
    }
    return TRUE;
}
4

1 に答える 1

1

次のコードは、「REEL」ウィンドウ クラスを登録します。これは、スロット マシンのスピニング リールを表示するコントロールです。次のようなリソースステートメントを使用して、ダイアログで複数のインスタンスを作成できます。

CONTROL         "",IDC_REEL1,"REEL",0,14,50,40,40
CONTROL         "",IDC_REEL2,"REEL",0,70,50,40,40

リールは無限に回転しますが、プライベート メッセージを簡単に追加して開始および停止できます。

コメントで説明されているように、リソース ID を持つリールを表すビットマップが必要IDB_REELです。

HBITMAP g_hbmpReel;

LRESULT CALLBACK ReelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    const int ReelTimerId = 5;

    switch (message)
    {
    case WM_CREATE:
        SetTimer(hWnd, ReelTimerId, 10, 0);
        break;
    case WM_DESTROY:
        KillTimer(hWnd, ReelTimerId);
        break;
    case WM_SIZE:
        SetWindowPos(hWnd, 0, 0, 0, 40, 40, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOREDRAW | SWP_NOZORDER);
        break;
    case WM_TIMER:
        if (wParam == ReelTimerId)
        {
            int offset = GetWindowLong(hWnd, 0);
            offset = (offset + 5) % 120;
            SetWindowLong(hWnd, 0, offset);
            InvalidateRect(hWnd, 0, FALSE);
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            HDC hdcReel = CreateCompatibleDC(hdc);
            HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcReel, g_hbmpReel);
            int offset = GetWindowLong(hWnd, 0);
            BitBlt(hdc, 0, 0, 40, 40, hdcReel, 0, offset, SRCCOPY);
            SelectObject(hdcReel, hbmpOld);
            DeleteDC(hdcReel);
            EndPaint(hWnd, &ps);
        }
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

ATOM RegisterReel(HINSTANCE hInstance)
{
    WNDCLASSEX wcex = {0};

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.lpfnWndProc    = ReelWndProc;
    // Window data used to hold the position of the reel
    wcex.cbWndExtra     = sizeof(int);
    wcex.hInstance      = hInstance;
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszClassName  = L"REEL";

    // IDB_REEL is a 40x160 bitmap representing a reel with THREE 40x40 symbols.
    // The bottom 40x40 square should be the same as the topmost.
    g_hbmpReel = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_REEL));

    return RegisterClassEx(&wcex);
}
于 2012-10-20T19:39:08.860 に答える