2016-03-28 13 views
0

Мне было присвоено задание в университете: написать игру в MASM. Я выбрал игру типа «три подряд». В игре есть несколько сладостей: мороженое, леденец и т. Д. Но у меня есть проблема. Я не знаю, как создавать дочерние окна с разными изображениями. Я пробовал, но ничего не работает. Может, кто-то знает, как это реализовать? Любая помощь приветствуется. Даже в C/C++. Я был бы рад, если бы кто-то просто объяснил мне словами, как это сделать. Главное для меня - понять концепцию.Win32 API: детские окна с разными изображениями

У меня есть

enter image description here

Но мне нужна эта

enter image description here

+0

Начните с обучения, как это сделать в C++ –

+0

, где ваш код? –

+0

@DavidHeffernan для меня не важно, на каком языке программирования писать. Как я уже упоминал, я просто не знаю, как его реализовать. –

ответ

3

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

Я предлагаю вам добавить hBit в SweetsWindowStruct структура:

SweetsWindowStruct struct 
    stype SWEETSTYPE  ? 
    sweetsID DWORD   ? 
    hBit HBITMAP   ? 
SweetsWindowStruct ends 

И удалить глобальную hBit (строка 44 в файле sweets.asm), вы должны изменить WM_PAINT код так:

.elseif [iMsg] == WM_PAINT 

    invoke BeginPaint, [hwnd], addr ps 
    mov [hdc], eax 

    invoke CreateCompatibleDC, hdc 
    mov [hMemDC], eax 

    SweetsWindowStruct *sws;// sorry show you in c++ 
    sws = (SweetsWindowStruct*)GetWindowLong(hwnd, GWL_USERDATA); 
    HBITMAP hBit = sws->hBit; 

    invoke SelectObject, hMemDC, [hBit] 
    mov [oldDC], eax 

Другой вопрос: я думаю, что у вас есть ошибка, где вы говорите:

invoke SetWindowLong, [hwnd], 0, addr [sws] 

должно быть:

invoke SetWindowLong, [hwnd], GWL_USERDATA, addr [sws] 

Пожалуйста, убедитесь, что

+0

большое спасибо.Это именно то, что мне нужно. –

Смежные вопросы