@Retr0Hacker

Как создать массив хендлов на MASM?

Задание нынче такое: "В ресурс внести анимационные курсоры и обычные. Пару иконок. Сделать возможность выбирать через меню, каким курсором работать в окне. То же самое реализовать для иконок. К меню добавить пункт 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
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Для полноты картины не хватает определений hBmp, hbtm и hInstance.
Косяк бросающийся в глаза сразу -- ты создаёшь таймер в обработчике WM_INITDIALOG, но нигде его не удаляешь и он продолжает тикать и после закрытия диалога.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы