Задание нынче такое: "В ресурс внести анимационные курсоры и обычные. Пару иконок. Сделать возможность выбирать через меню, каким курсором работать в окне. То же самое реализовать для иконок. К меню добавить пункт About при выполнении которого должно отрыться новое окно и надписью делающего и окном воспроизведения анимационного видео"
С последним пунктом возникли некоторые сложности. Получается как, у меня есть 12 картинок формата бмп, которые я быстро меняю, и таким образом получается анимация. Препод посоветовал создать массив хэндлов картинок, и потом уже вызывать их из этого массива. Я весь этот процесс заполнения массива реализовал в виде отельной функции:
LoadBmpToArr proc id_bmp: DWORD
.WHILE id_bmp <= 52
invoke LoadBitmap, hInstance, id_bmp
mov ebx, idx
mov hBMP[ebx], eax
add idx, 4
inc id_bmp
.endw
mov id_bitmap, 40
mov idx, 0
ret
LoadBmpToArr endp
Эту функцию я использую при инициализации главного(родительского) окна. И при таком раскладе в меню не меняются иконки и курсоисы, а дочернее окно About вообще не открывается.
Если же я эту функцию использую при инициализации дочернего окна, то все нормально работает. Но стоит мне закрыть дочернее окно, как оно тут же перестает открываться и снова перестают меняться иконки и курсоры
Никак не могу понять в чем проблема. Подскажите пожалуйста кто шарит?
Код главного файла(файл .Asm):
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
include Five.inc
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
invoke ExitProcess,0
;########################################################################
Video proc
mov eax, idx
invoke SendMessage, hbtm, STM_SETIMAGE, IMAGE_BITMAP, hBMP[eax]
add idx, 4
cmp idx, 4*12
jb @F
mov idx, 0
@@:
ret
Video endp
LoadBmpToArr proc id_bmp: DWORD
.WHILE id_bmp <= 52
invoke LoadBitmap, hInstance, id_bmp
mov ebx, idx
mov hBMP[ebx], eax
add idx, 4
inc id_bmp
.endw
mov id_bitmap, 40
mov idx, 0
ret
LoadBmpToArr endp
InputCursor proc hWin:HWND, id: DWORD
invoke LoadCursor, hInstance, id
mov hcursor, eax
invoke SendDlgItemMessage, hWin, IDD_DIALOG1, \
WM_SETCURSOR, eax, NULL
ret
InputCursor endp
InputIcon proc hWin:HWND, id: DWORD
invoke LoadIcon, hInstance, id
invoke SendMessage, hWin, WM_SETICON, ICON_SMALL, eax
ret
InputIcon endp
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax,uMsg
.if eax==WM_INITDIALOG
invoke LoadBmpToArr, id_bitmap
.elseif eax==WM_COMMAND
;-------- CLOSE ----------
.if wParam == IDM_Close ; "Close"
jmp @F
;-------- CURSORS ----------
.elseif wParam == IDM_Cursor1 ; "Cursor_1"
invoke InputCursor, hWin, 5000
.elseif wParam == IDM_Cursor2 ; "Cursor_2"
invoke InputCursor, hWin, 5001
.elseif wParam == IDM_Cursor3 ; "Cursor_3"
invoke InputCursor, hWin, 5002
.elseif wParam == IDM_Cursor4 ; "Cursor_4"
invoke InputCursor, hWin, 5003
;-------- ICONS ----------
.elseif wParam == IDM_Icon1 ; "Icon_1"
invoke InputIcon, hWin, 4000
.elseif wParam == IDM_Icon2 ; "Icon_2"
invoke InputIcon, hWin, 4001
.elseif wParam == IDM_Icon3 ; "Icon_3"
invoke InputIcon, hWin, 4002
;-------- ABOUT ----------
.elseif wParam == IDM_About ; "About"
invoke DialogBoxParam,hInstance,IDD_DLG1,NULL,addr AboutProc,NULL
.endif
.elseif eax == WM_SETCURSOR
invoke SetCursor, hcursor
ret
.elseif eax==WM_CLOSE
@@:
invoke EndDialog,hWin,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
AboutProc proc hAbout:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov eax,uMsg
.if eax==WM_INITDIALOG
invoke GetDlgItem, hAbout, IDC_IMG1
mov hbtm, eax
invoke SetTimer, hbtm, Timer_ID, 30, addr Video
.elseif eax==WM_COMMAND
.elseif eax==WM_CLOSE
invoke EndDialog,hAbout,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
AboutProc endp
end start