Здравствуйте! Хочу вывести в окно анимированную картинку, но ничего не получается. Когда-то скачивал с сайта исходник, вроде бы от The svin. Вот, пытаюсь по образцу сделать что-нибудь подобное. К сожалению, не смог сейчас найти этот исходник на сайте, поэтому ссылку дать не могу. Если надо могу выложить куда-нибудь. Так вот, исходник от The svin написан для диалогового окна, а я пытаюсь переложить этот код для простого окна. В общих чертах этот исходник демонстрирует, как имея рисунок такого плана поочередно выводить "кадры". Свои потуги я приаттачил внизу. Еще на сайте нашел исходник Sprite by Ron Thomas с использованием спрайтов. С ним пока не занимался. Идея от The svin мне нравиться больше.
Спасибо! То что нужно. Работает отлично. В исходнике сейчас попробую разобраться. А это откуда? В смысле откуда скачано? Какие-то уроки от The svin?
Код (Text): .486 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc include \masm32\include\masm32.inc include \masm32\include\Comctl32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\oleaut32.inc include \masm32\include\ole32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\Comctl32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\oleaut32.lib includelib \masm32\lib\ole32.lib .data ClassName db "SimpleWinClass",0 AppName db "Animate",0 FRAME_WIDTH EQU 50 FRAME_HEIGHT EQU 58 .data? hInstance dd ? CommandLine dd ? hwnd dd ? hImgList dd ? img_index dd ? .code TopXY proc wDim:DWORD, sDim:DWORD shr sDim, 1 shr wDim, 1 mov eax, wDim sub sDim, eax mov eax, sDim ret TopXY endp WndProc proc uses edx ebx hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM LOCAL ps:PAINTSTRUCT LOCAL lpRect:RECT .IF uMsg==WM_DESTROY invoke KillTimer,hWnd,200 invoke ImageList_Destroy,hImgList invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_CREATE invoke ImageList_Create,FRAME_WIDTH,FRAME_HEIGHT,ILC_COLOR24,6,0 mov hImgList,eax invoke LoadImage,hInstance,1000,IMAGE_BITMAP,0,0,0 push eax invoke ImageList_Add,hImgList,eax,0 call DeleteObject invoke SetTimer,hWnd,200,200,0 .ELSEIF uMsg==WM_PAINT invoke BeginPaint,hWnd,ADDR ps invoke GetClientRect,hWnd,addr lpRect mov eax,lpRect.right sub eax,FRAME_WIDTH shr eax,1 mov edx,lpRect.bottom sub edx,FRAME_HEIGHT shr edx,1 invoke ImageList_Draw,hImgList,img_index,ps.hdc, eax,edx,ILD_NORMAL invoke EndPaint,hWnd,ADDR ps .ELSEIF uMsg==WM_TIMER mov eax,img_index inc eax cmp eax,6 jl index_ok xor eax,eax index_ok: mov img_index,eax invoke InvalidateRect,hwnd,0,FALSE .ELSEIF invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL x_:DWORD LOCAL y_:DWORD LOCAL w_:DWORD LOCAL h_:DWORD mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc mov w_, 340 mov h_, 140 invoke GetSystemMetrics,SM_CXSCREEN invoke TopXY,w_,eax mov x_, eax invoke GetSystemMetrics,SM_CYSCREEN invoke TopXY,h_,eax mov y_, eax invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW,x_,y_,w_,h_,\ NULL,NULL,hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .while TRUE invoke GetMessage, addr msg, 0, 0, 0 .break .if (!eax) invoke TranslateMessage, addr msg invoke DispatchMessage, addr msg .endw mov eax, msg.wParam ret WinMain endp start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax end start
Спасибо всем! Вроде разобрался с вашкй помощью. Еще немножко поизвращаюсь. Если что, буду постить в этом топике. P.S. Хочу восстановить справедливость. Те исходники, на которые я ссылался в первом посте, были написаны Quantum. http://www.wasm.ru/forum/viewtopic.php?id=12874 P.P.S. 2 Quantum Не могу распаковать архив. 7-Zip пишет, что неподдерживаемый формат. Это не то же самое, что в вышеприведенной ссылке?
Sturgeon Да, из сообщения #12. Там ещё анимированный курсор. Кстати, использовать cur значительно проще, чем самостоятельно рисовать фреймы по таймеру. Просто я не смог сразу распаковать zip - вот и не заметил, что это тот самый пример, только переделанный под обычное окно вместо диалога.
Quantum Я насколько понял, это делает следующий код? Код (Text): invoke LoadImage,hInstance,101,IMAGE_CURSOR,0,0,0 invoke SendDlgItemMessage,hDlg,101,STM_SETIMAGE,IMAGE_CURSOR,eax И, опять же, как переложить это для обычного окна? Я пока не пробовал сам ковыряться, но подозреваю, что для этоо нужно создать дочернее окно (статик, наверное) и ему посылать сообщения через SendMessage? А с какими параметрами?
Sturgeon Да, обыкновенный "static" со стилями SS_CENTERIMAGE | SS_ICON | WS_CHILD | WS_VISIBLE как в том примере.
Sturgeon Обязательно откуда-то скачивать, а сами уже не пишем? Просто пересобал программу вчера в ответ на #1
Контора пишет(с)Остап Бендер Пишу потихонечку. Я же новичок совсем. Сложная штука-ассемблер. Практически каждый раз, когда хочу что-нибудь сделать, получаю грабли. Вот пока и учусь на примерах, своего очень мало. Ну, вроде про анимацию понял немножко. Большое всем спасибо за объяснение и примеры!
ФАСМ - очень хорошая вещь... А если и исходники (чтоб разобраться) как работать с гиф (чтоб не тоскать библиотекой, а вживить сразу)... будет очень хорошо... Заранее благодарен... [: