WIN32汇编: 26.启动画面[1]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 goddragon 的 blog

第26章: 启动画面


    上一章我们学习了位图的使用.在这一章我们要用上帝赋予我们的创造力来融会贯通上一章我们学到的知识.那就是研究如何用位图来创建启动画面. 你可以在这里下载示范: the example.

理论

    首先,我们先要搞清楚什么是启动画面.举个简单的例子:我们启动某些作的专业一点的程序时(比如netscape,adobe acrobat等)会先跳出一个启动画面.上面通常有一些版权信息,版本号等.与此同时,程序后台正做着一些程序的加载或初始化工作.这个启动画面有别于一般的窗口.它没有标题栏,没有系统菜单,也没有边框.只有一张位图在屏幕上显示一会儿,然后消失 .在这一章我们来试试自己做一个.
    第一步你可能会想到把要显示的位图包含到资源文件中去.但是这样做有一个缺点.你的程序只在启动的时候显示这张位图,可是它却至始至终存在于你的内存中,直到你把程序关掉.这不能不说是对内存的极大浪费.好办法是:创建一个"资源"dll(动态连接库)来包含位图和它独特的显示代码.这样,你就可以在想显示启动画面的时候加载他,用完了就卸载它.所以,我们的程序需要2个模块:主程序和启动画面dll.我们要把位图放到这个dll的资源中去.
    基本步骤如下:
  1. 把位图作为一个位图资源放到dll中去.
  2. 主程序调用 loadlibrary 把 dll 加载到内存中去.
  3. dll 被调用后,它会建立一个定时器用于管理启动画面显示的时间.然后,注册并创建一个没有 标题和边框的窗口.同时在窗口的客户区显示位图.
  4. 等启动画面的显示时间长度到达你预先的设定值,启动画面消失,控制权回到主程序手中.
  5. 主程序调用 freelibrary 从内存中卸载 dll .然后,做它该做的事去.
    下面我们来研究细节部分

加载/卸载 dll

你可以用 loadlibrary 灵活的加载一个 dll ,它的格式如下:
loadlibrary  proto lpdllname:dword
它只有一个参数: 你想要加载的 dll 的名称所在的地址.调用成功返回指向该dll模块的句柄,反之返回null.
要卸载 dll, 则调用 freelibrary:
freelibrary  proto  hlib:dword
它也只有一个参数: 你想要卸载的 dll 模块的句柄(通常就是上面那个函数返回的啦).

怎样使用定时器

首先, 你要用 settimer 创建一个定时器:
settimer  proto  hwnd:dword, timerid:dword, uelapse:dword, lptimerfunc:dword

hwnd接受这个定时器消息的窗口的句柄.如果,你的定时器不需要窗口接受它的消息,你也可以 用null作为参数
timerid定时器的 id 值. 由你自己定义.
uelapse 定时器定的时间.以ms(千分之一秒)为单位.
lptimerfunc 处理该定时器消息的函数所在的地址.如果你用null作为该参数,那么定时器的消息会被送给 hwnd 参数所指定的窗口.

settimer 如果成功则返回定时器的 id 否则返回 null. 所以最好不要把定时器的id设为0(pheadnius:null代表0, 记得吗?).

你可以用2种方法创建定时器:
  • 如果你有一个窗口并且定时器把消息传给这个窗口.那么你需要把所有的4个参数都传送给 settimer 函数 (lptimerfunc参数必须为null).
  • 如果你没有窗口或者你不想让窗口处理定时器的消息,那么你必须在窗口句柄中传送一个null.同时你要指定用于处理定时器消息的函数的地址.
在这个例子中我们要使用第一种方法.
当你设定的时间到了, 与定时器相连的窗口会收到 wm_timer 消息.例如,你指定 uelapse 的值为 1000, 你的窗口每过一秒都会收到 wm_timer 消息.
等到你再也不需要这个定时器了,就用 killtimer 来去除定时器.
killtimer  proto  hwnd:dword, timerid:dword

例子:

;-----------------------------------------------------------------------
;                         主程序
;-----------------------------------------------------------------------
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

winmain proto :dword,:dword,:dword,:dword

.data
classname db "splashdemowinclass",0
appname  db "splash screen example",0
libname db "splash.dll",0

.data?
hinstance hinstance ?
commandline lpstr ?
.code
start:
 invoke loadlibrary,addr libname
 .if eax!=null
    invoke freelibrary,eax
 .endif
 invoke getmodulehandle, null
 mov    hinstance,eax
 invoke getcommandline
 mov    commandline,eax
 invoke winmain, hinstance,null,commandline, sw_showdefault
 invoke exitprocess,eax

winmain proc hinst:hinstance,hprevinst:hinstance,cmdline:lpstr,cmdshow:dword
 local wc:wndclassex
 local msg:msg
 local hwnd:hwnd
 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  hinstance
 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
 invoke createwindowex,null,addr classname,addr appname,\
           ws_overlappedwindow,cw_usedefault,\
           cw_usedefault,cw_usedefault,cw_usedefault,null,null,\
           hinst,null
 mov   hwnd,eax
 invoke showwindow, hwnd,sw_shownormal
 invoke updatewindow, hwnd

本文关键:asm
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top