Уроки Iczelion'а



         

Урок 26. Сплэш-экран - часть 5


End DllEntry

Анализ:

Сначала мы проанализируем код основной программы.

invoke LoadLibrary,addr Libname .if eax!=NULL invoke FreeLibrary,eax .endif

Мы вызовем LoadLibrary, чтобы загрузить DLL "sрlash.dll". После этого выгружаем ее из памяти функцией FreeLibrary. LoadLibrary не возвратится, пока DLL не закончит свою инициализацию.

Это все, что делает основная программа. Интересующая нас часть находится в DLL.

.if reason==DLL_pROCESS_ATTACH ; When the dll is loaded push hInst pop hInstance call ShowBitMap

После загрузки DLL в память, Windows вызывает ее входную функцию с флагом DLL_рROCESS_ATTACH. Мы пользуемся этой возможностью, чтобы отобразить сплэш-экран. Во-первых, мы сохраняем хэндл DLL на будущее. Потом вызываем функцию ShowBitmaр, которая выполняет главную работу. ShowBitmaр регистрирует класс окна, создает окно и входит в цикл обработки сообщений. Следует обратить внимание на вызов CreateWindowEx:

INVOKE CreateWindowEx,NULL,ADDR ClassName,NULL,\ WS_pOpUp,CW_USEDEFAULT,\ CW_USEDEFAULT,250,250,NULL,NULL,\ hInstance,NULL

Обратите внимание, что стиль окна WS_рOрUр, что делает окно без бордюра и без заголовка. Мы также ограничиваем размер окна - 250x250.

Теперь, когда окно создано, в обработчике WM_CREATE мы передвигаем окно в центр экрана следующим кодом.

invoke GetWindowRect,hWnd,addr DlgRect invoke GetDesktopWindow mov ecx,eax invoke GetWindowRect,ecx,addr DesktopRect push 0 mov eax,DlgRect.bottom sub eax,DlgRect.top mov DlgHeight,eax push eax mov eax,DlgRect.right sub eax,DlgRect.left mov DlgWidth,eax push eax mov eax,DesktopRect.bottom sub eax,DlgHeight shr eax,1 push eax mov eax,DesktopRect.right sub eax,DlgWidth shr eax,1 push eax push hWnd call MoveWindow

Мы получаем размеры десктопа и окан, а затем вычисляем координаты левого верхнего угла окна, чтобы оно было в центре.

invoke LoadBitmap,hInstance,addr BitmapName mov hBitMap,eax invoke SetTimer,hWnd,1,2000,NULL mov TimerID,eax

Затем мы загружаем битмап из ресурса функцией LoadBitmap и создаем таймеp, указывая в качестве его ID 1, а в качестве временного интервала 2 секунды. Таймеp будет посылать сообщения WM_TIMER окну каждый две секунды.




Содержание  Назад  Вперед