Анимация из BMP

Тема в разделе "WASM.BEGINNERS", создана пользователем Sturgeon, 3 июл 2007.

  1. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Здравствуйте!
    Хочу вывести в окно анимированную картинку, но ничего не получается.
    Когда-то скачивал с сайта исходник, вроде бы от The svin. Вот, пытаюсь по образцу сделать что-нибудь подобное. К сожалению, не смог сейчас найти этот исходник на сайте, поэтому ссылку дать не могу. Если надо могу выложить куда-нибудь.
    Так вот, исходник от The svin написан для диалогового окна, а я пытаюсь переложить этот код для простого окна.
    В общих чертах этот исходник демонстрирует, как имея рисунок такого плана
    [​IMG]
    поочередно выводить "кадры".
    Свои потуги я приаттачил внизу.
    Еще на сайте нашел исходник Sprite by Ron Thomas с использованием спрайтов. С ним пока не занимался. Идея от The svin мне нравиться больше.
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Попробуй, в аттаче сорц и exe
     
  3. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Спасибо! То что нужно.
    Работает отлично. В исходнике сейчас попробую разобраться.
    А это откуда? В смысле откуда скачано? Какие-то уроки от The svin?
     
  4. dcskm4200

    dcskm4200 New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    173
    Адрес:
    China
    Код (Text):
    1. .486
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. include \masm32\include\kernel32.inc
    8. include \masm32\include\gdi32.inc
    9. include \masm32\include\masm32.inc
    10. include \masm32\include\Comctl32.inc
    11. include \masm32\include\comdlg32.inc
    12. include \masm32\include\shell32.inc
    13. include \masm32\include\oleaut32.inc
    14. include \masm32\include\ole32.inc
    15.  
    16. includelib \masm32\lib\user32.lib
    17. includelib \masm32\lib\kernel32.lib
    18. includelib \masm32\lib\gdi32.lib
    19. includelib \masm32\lib\masm32.lib
    20. includelib \masm32\lib\Comctl32.lib
    21. includelib \masm32\lib\comdlg32.lib
    22. includelib \masm32\lib\shell32.lib
    23. includelib \masm32\lib\oleaut32.lib
    24. includelib \masm32\lib\ole32.lib
    25.  
    26. .data
    27.     ClassName   db "SimpleWinClass",0
    28.     AppName     db "Animate",0
    29.     FRAME_WIDTH EQU 50
    30.     FRAME_HEIGHT    EQU 58
    31.  
    32. .data?
    33.     hInstance   dd ?
    34.     CommandLine dd ?
    35.     hwnd        dd ?
    36.     hImgList    dd ?
    37.     img_index   dd ?
    38.  
    39. .code
    40. TopXY proc wDim:DWORD, sDim:DWORD
    41.  
    42.     shr sDim, 1    
    43.     shr wDim, 1    
    44.     mov eax, wDim  
    45.     sub sDim, eax  
    46.  
    47.     mov eax, sDim
    48.     ret
    49.  
    50. TopXY endp
    51.  
    52. WndProc proc uses edx ebx  hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    53.     LOCAL ps:PAINTSTRUCT   
    54.     LOCAL lpRect:RECT  
    55.    
    56.     .IF uMsg==WM_DESTROY
    57.         invoke  KillTimer,hWnd,200
    58.         invoke  ImageList_Destroy,hImgList
    59.         invoke  PostQuitMessage,NULL
    60.        
    61.     .ELSEIF uMsg==WM_CREATE
    62.            
    63.         invoke  ImageList_Create,FRAME_WIDTH,FRAME_HEIGHT,ILC_COLOR24,6,0  
    64.         mov hImgList,eax
    65.         invoke  LoadImage,hInstance,1000,IMAGE_BITMAP,0,0,0        
    66.         push    eax
    67.         invoke  ImageList_Add,hImgList,eax,0                   
    68.         call    DeleteObject                           
    69.         invoke  SetTimer,hWnd,200,200,0
    70.  
    71.     .ELSEIF uMsg==WM_PAINT
    72.         invoke  BeginPaint,hWnd,ADDR ps    
    73.         invoke  GetClientRect,hWnd,addr lpRect
    74.         mov eax,lpRect.right
    75.         sub eax,FRAME_WIDTH
    76.         shr eax,1
    77.         mov edx,lpRect.bottom
    78.         sub edx,FRAME_HEIGHT
    79.         shr edx,1
    80.         invoke  ImageList_Draw,hImgList,img_index,ps.hdc,
    81.                 eax,edx,ILD_NORMAL
    82.         invoke  EndPaint,hWnd,ADDR ps      
    83.     .ELSEIF uMsg==WM_TIMER     
    84.         mov eax,img_index
    85.         inc eax
    86.         cmp eax,6
    87.         jl  index_ok
    88.         xor eax,eax
    89. index_ok:
    90.         mov img_index,eax
    91.         invoke  InvalidateRect,hwnd,0,FALSE
    92.     .ELSEIF
    93.         invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
    94.         ret
    95.     .ENDIF
    96.     xor eax,eax
    97.     ret
    98.  
    99. WndProc endp
    100.  
    101. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    102.     LOCAL wc:WNDCLASSEX
    103.     LOCAL msg:MSG
    104.     LOCAL x_:DWORD
    105.     LOCAL y_:DWORD
    106.     LOCAL w_:DWORD
    107.     LOCAL h_:DWORD
    108.      
    109.     mov wc.cbSize,SIZEOF WNDCLASSEX
    110.     mov wc.style, CS_HREDRAW or CS_VREDRAW
    111.     mov wc.lpfnWndProc, OFFSET WndProc
    112.     mov wc.cbClsExtra,NULL
    113.     mov wc.cbWndExtra,NULL
    114.     push    hInst
    115.     pop wc.hInstance
    116.     mov wc.hbrBackground,COLOR_WINDOW+1
    117.     mov wc.lpszMenuName,NULL
    118.     mov wc.lpszClassName,OFFSET ClassName
    119.     invoke  LoadIcon,NULL,IDI_APPLICATION
    120.     mov wc.hIcon,eax
    121.     mov wc.hIconSm,eax
    122.     invoke  LoadCursor,NULL,IDC_ARROW
    123.     mov wc.hCursor,eax
    124.     invoke  RegisterClassEx, addr wc
    125.    
    126.     mov w_, 340
    127.     mov h_, 140
    128.     invoke  GetSystemMetrics,SM_CXSCREEN
    129.     invoke  TopXY,w_,eax
    130.     mov x_, eax
    131.     invoke  GetSystemMetrics,SM_CYSCREEN
    132.     invoke  TopXY,h_,eax
    133.     mov y_, eax
    134.    
    135.     invoke  CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
    136.             WS_OVERLAPPEDWINDOW,x_,y_,w_,h_,\
    137.             NULL,NULL,hInst,NULL
    138.     mov hwnd,eax
    139.     invoke  ShowWindow, hwnd,SW_SHOWNORMAL
    140.     invoke  UpdateWindow, hwnd
    141.        
    142.     .while TRUE                          
    143.         invoke  GetMessage, addr msg, 0, 0, 0
    144.         .break .if (!eax)
    145.         invoke  TranslateMessage, addr msg                                              
    146.         invoke  DispatchMessage, addr msg                                
    147.         .endw                                      
    148.         mov eax, msg.wParam
    149.         ret
    150.  
    151. WinMain endp
    152.  
    153. start:
    154.     invoke  GetModuleHandle, NULL
    155.     mov hInstance,eax
    156.     invoke  GetCommandLine
    157.     mov CommandLine,eax
    158.     invoke  WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    159.     invoke  ExitProcess,eax
    160.  
    161. end start
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Вот вам ещё один Свин :) Показывает анимацию кадрами BMP и через курсор.
     
  6. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Спасибо всем! Вроде разобрался с вашкй помощью.
    Еще немножко поизвращаюсь. Если что, буду постить в этом топике.
    P.S. Хочу восстановить справедливость. Те исходники, на которые я ссылался в первом посте, были написаны Quantum.
    http://www.wasm.ru/forum/viewtopic.php?id=12874
    P.P.S. 2 Quantum Не могу распаковать архив. 7-Zip пишет, что неподдерживаемый формат. Это не то же самое, что в вышеприведенной ссылке?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Попробуй WinRar, версию поновее. У меня все ок. Ты чем распаковывал?
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Sturgeon
    Да, из сообщения #12. Там ещё анимированный курсор. Кстати, использовать cur значительно проще, чем самостоятельно рисовать фреймы по таймеру.

    Просто я не смог сразу распаковать zip - вот и не заметил, что это тот самый пример, только переделанный под обычное окно вместо диалога.
     
  9. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Quantum
    Я насколько понял, это делает следующий код?
    Код (Text):
    1.    invoke LoadImage,hInstance,101,IMAGE_CURSOR,0,0,0
    2.    invoke SendDlgItemMessage,hDlg,101,STM_SETIMAGE,IMAGE_CURSOR,eax
    И, опять же, как переложить это для обычного окна? Я пока не пробовал сам ковыряться, но подозреваю, что для этоо нужно создать дочернее окно (статик, наверное) и ему посылать сообщения через SendMessage? А с какими параметрами?
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Sturgeon
    Да, обыкновенный "static" со стилями SS_CENTERIMAGE | SS_ICON | WS_CHILD | WS_VISIBLE как в том примере.
     
  11. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Sturgeon
    Обязательно откуда-то скачивать, а сами уже не пишем?;)
    Просто пересобал программу вчера в ответ на #1
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Sturgeon
    А это переделаная gif-анимация Antonis Kyprianou
     
  13. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Контора пишет(с)Остап Бендер:)

    Пишу потихонечку. Я же новичок совсем. Сложная штука-ассемблер. Практически каждый раз, когда хочу что-нибудь сделать, получаю грабли. Вот пока и учусь на примерах, своего очень мало.
    Ну, вроде про анимацию понял немножко. Большое всем спасибо за объяснение и примеры!
     
  14. Plankton

    Plankton New Member

    Публикаций:
    0
    Регистрация:
    12 июн 2007
    Сообщения:
    9
    А не подкинет кто-нить похожих сорсов, тока на фасме?
     
  15. PaVeL_PoL

    PaVeL_PoL New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2007
    Сообщения:
    14
    ФАСМ - очень хорошая вещь... А если и исходники (чтоб разобраться) как работать с гиф (чтоб не тоскать библиотекой, а вживить сразу)... будет очень хорошо...

    Заранее благодарен... [: