На главную  Программирование на Ассемблере в Fasm  Операционные Системы  Написать Автору  Полезные ссылки



Для поиска введите икомое слово в текстовое поле и нажмите Enter:



Урок 2:Создание Окна.


Вы ещё не скачали пример?Так жмите сюда.
И так,вы готовы?Начинаем наш ликбез!Перед вами содержимое файла les2.ASM:
LES2.ASM
format PE GUI 4.0
entry start

include '%fasminc%\win32a.inc';подключаем win32a заголовочный файл
include '%fasminc%\macro\if.inc';подключаем HLL-Style заголовочный файл

section '.data' data readable writeable ;Объявляем секцию data открытой для чтения  и записи.имя секции '.data'

  AppName db 'Простое окно в fasm',0 ;Имя программы
  ClassName db 'Simple Window',0 ;Класс окна

  mainhwnd dd ?
  hinstance dd ?

  msg MSG             ; структура msg
  wc WNDCLASSEX       ; структура WC


section '.code' code readable executable ;Объявляем секцию code открытой для чтения и исполняемой.имя секции '.data'

  start:

    invoke GetModuleHandle,0;Взять дескриптор пpогpаммы
    mov    [hinstance],eax
;-------------------------------------------------------
;заполнение стpуктуpы wc
;-------------------------------------------------------
 
   mov [wc.cbSize],WNDCLASSEX;(12 dd *4(dd=4byte))
    invoke    LoadIcon,[hinstance],10 ;загрузка иконки
    mov [wc.hIcon],eax  ;Вносим в wc хендл иконки
    mov [wc.hIconSm],eax
    invoke LoadCursor,0,IDC_ARROW;Вносим в wc хендл
курсора.

    mov    [wc.hCursor],eax
    mov    [wc.style],CS_HREDRAW       ;стиль окон
    mov    [wc.lpfnWndProc],WindowProc ;Адpес пpоцедуpы окна,ответственной за окна, создаваемых из класса.
    mov    [wc.cbClsExtra],0 ;Количество дополнительных байтов,котоpые нужно заpезеpвиpовать (они будут следовать за самой стpуктуpой). По умолчанию, опеpационная система инициализиpует это количество в 0. Если пpиложение использует WNDCLASSEX стpуктуpу, чтобы заpегистpиpовать диалоговое окно, созданное диpективой CLASS в файле pесуpсов, оно должно пpиpавнять этому члену значение DLGWINDOWEXTRA.

    mov    [wc.cbWndExtra],;
    mov    eax,[hinstance]    ;Хэндл модуля.
    mov    [wc.hInstance],eax
    mov    [wc.hbrBackground],COLOR_WINDOW+1 ;Цвет фона
    mov    [wc.lpszMenuName],NULL ;Хэндл меню для окон, созданных из класса по умолчанию.
    mov    [wc.lpszClassName],ClassName  ;Имя класса окна.
;-------------------------------------------------------
;Регестрирование класса нашего окна
;-------------------------------------------------------
    invoke RegisterClassEx,wc ;Эта функция регестрирует класс окна
;-------------------------------------------------------
;Создание нашего окна
;-------------------------------------------------------

    invoke    CreateWindowEx,0,ClassName,AppName,\
    WS_VISIBLE+WS_OVERLAPPEDWINDOW ,128,128,\
    192,192,NULL,NULL,[hinstance],NULL ;Создаём окно.Т.к это окно имеет стиль WS_VISIBLE мы не должны вызывать show window и update window
    mov    [mainhwnd],eax
msg_loop:
    invoke    GetMessage,msg,NULL,0,0;Получаем сообщение
    or eax,eax  ;логическое или (Если 1 операнд равен 0 ,а второй 1 всё равно ответ равен 1,если оба равны 0,ответ равен 0).Можно делать итак: cmp eax,0
    jz    EXIT ;eax == 0?Выходим!
    invoke    TranslateMessage,msg
    invoke    DispatchMessage,msg
    jmp    msg_loop ;Прыжок на msg_loop(новый цикл)

   EXIT:
    invoke    ExitProcess,[msg.wParam];Завершаем процесс

proc WindowProc, hwnd,wmsg,wparam,lparam
     push    ebx esi edi
    .if [wmsg],e,WM_DESTROY
     invoke  PostQuitMessage,0
     xor     eax,eax
     pop     edi esi ebx
     return
    .else
     invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
     pop     edi esi ebx
     return
    .endif

endp

data resource from 'hw2.res'
end data

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
      user32,'USER32.DLL'

  import kernel32,\
     GetModuleHandle,'GetModuleHandleA',\
     ExitProcess,'ExitProcess'

  import user32,\
     RegisterClassEx,'RegisterClassExA',\
     RegisterClass,'RegisterClassA',\
     CreateWindowEx,'CreateWindowExA',\
     DefWindowProc,'DefWindowProcA',\
     GetMessage,'GetMessageA',\
     TranslateMessage,'TranslateMessage',\
     DispatchMessage,'DispatchMessageA',\
     LoadCursor,'LoadCursorA',\
     LoadIcon,'LoadIconA',\
     PostQuitMessage,'PostQuitMessage'



Страница1 из 2-хНаверхСтраница2 из 2-х
Сайт управляется системой uCoz