Скачать книгу

это сообщение назад в Windows

      push offset msg

      call DispatchMessage

      ;Переходим к следующему сообщению

      jmp msg_loop

      ;Выход из процесса

      end_loop:

      push [msg.msWPARAM]

      call ExitProcess

      ;Обработка сообщений окна. Win32 требует сохранения регистров

      ;EBX, EDI, ESI. Запишем эти регистры после ”uses” в строке ”proc”.

      ;Это позволит Ассемблеру сохранить их

      WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:

      DWORD, lparam:DWORD

      LOCAL theDC:DWORD

      ;Проверим, какое сообщение получили, и перейдем к обработке

      cmp [wmsg],WM_DESTROY

      je wmdestroy

      cmp [wmsg],WM_RBUTTONDOWN

      je wmrbuttondown

      cmp [wmsg],WM_SIZE

      je wmsize

      cmp [wmsg],WM_CREATE

      je wmcreate

      cmp [wmsg],WM_LBUTTONDOWN

      je wmlbuttondown

      cmp [wmsg],WM_PAINT

      je wmpaint

      cmp [wmsg],WM_GETMINMAXINFO

      je wmgetminmaxinfo

      ;Данная программа не обрабатывает это сообщение.

      ;Передадим его Windows,

      ;чтобы оно было обработано по умолчанию

      jmp defwndproc

      ;Сообщение WM_PAINT (перерисовать содержимое окна)

      wmpaint:

      ;Подготовим окно для перерисовки

      push offset lppaint

      push [hwnd]

      call BeginPaint

      mov [theDC], eax

      ;Переведем в ASCII−формат значение mbx_count, которое

      ;показывает, сколько раз была нажата левая кнопка мыши

      mov eax,[mbx_count]

      mov edi, offset s_num

      call HexWrite32

      ;Вывод строки в окно

      push L MSG_L ;Длина строки

      push offset szPaint ;Строка

      push L 5 ;Y

      push L 5 ;X

      push [theDC] ;DC

      call TextOut

      ;Обозначим завершение перерисовки окна

      push offset lppaint

      push [hwnd]

      call EndPaint

      ;Выходим из обработки сообщения

      mov eax, 0

      jmp finish

      ;Сообщение WM_CREATE (создание окна)

      wmcreate:

      ;Выходим из обработки сообщения

      mov eax, 0

      jmp finish

      ;Сообщение, не обрабатываемое данной программой, передаем Windows

      defwndproc:

      push [lparam]

      push [wparam]

      push [wmsg]

      push [hwnd]

      call DefWindowProc

      ;Выходим из обработки сообщения

      jmp finish

      ;Сообщение WM_DESTROY (уничтожение окна)

      wmdestroy:

      ;Закроем поток

      push L 0

      call PostQuitMessage

      ;Выходим из обработки сообщения

      mov eax, 0

      jmp finish

      ;Сообщение WM_LBUTTONDOWN (нажата левая кнопка мыши)

      wmlbuttondown:

      inc [mbx_count]

      ;Обновим содержимое окна

      push L 0

      push L 0

      push [hwnd]

      call InvalidateRect

      ;Выходим из обработки сообщения

      mov eax, 0

      jmp finish

      ;Сообщение WM_RBUTTONDOWN (нажата правая кнопка мыши)

      wmrbuttondown:

      push L 0

      call MessageBeep

      ;Выходим из обработки сообщения

      jmp finish

      ;Сообщение WM_SIZE (изменен размер окна)

      wmsize:

      ;Выходим из обработки сообщения

      mov eax, 0

      jmp finish

      ;Сообщение WM_GETMINMAXINFO (попытка изменить размер

      ;или положение окна)

      wmgetminmaxinfo:

      ;Заполним структуру MINMAXINFO

      mov ebx, [lparam]

      mov [(MINMAXINFO ptr ebx).mintrackposition_x],350

      mov [(MINMAXINFO ptr ebx).mintrackposition_y],60

      ;Выходим из обработки сообщения

      mov eax, 0

      jmp finish

      ;Выходим из обработки сообщения

      finish:

      ret

      WndProc

Скачать книгу