Использование стиля SS_BITMAP для статического управления в диалоговом окне

Я пытаюсь написать приложение 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;
}

-1

Решение

Следующий код регистрирует класс окна «REEL»: элемент управления, который отображает вращающуюся катушку для игрового автомата. Вы можете создать несколько его экземпляров в диалоге, используя операторы ресурсов, такие как:

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

Катушка вращается бесконечно, но вы можете легко добавлять личные сообщения, чтобы запускать и останавливать ее.

Как объяснено в комментариях, он ожидает растровое изображение, представляющее барабан с идентификатором ресурса 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);
}
1

Другие решения

Других решений пока нет …