⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lion-tut-c26.htm

📁 内有一些代码
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!-- saved from url=(0022)http://internet.e-mail -->
<html>

<head>
<link rel="stylesheet" href="../../asm.css">

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Iczelion's win32 asm tutorial</title>
</head>

<body bgcolor="#FFFFFF" background="../../images/back01.jpg">
<p align="center"><font size="3" color="#0000FF"><b>第26章: 启动画面</b></font></p>
<hr size="1">
<strong> </strong>&nbsp;&nbsp;&nbsp;&nbsp;上一章我们学习了位图的使用.在这一章我们要用
上帝赋予我们的创造力来融会贯通上一章我们学到的知识.那就是研究如何用位图来创建启动画面.
你可以在这里下载示范:
<a href="files/tut26.zip">the 
example</a>. 
<h3> <b>理论</b></h3>
&nbsp;&nbsp;&nbsp;&nbsp;首先,我们先要搞清楚什么是启动画面.举个简单的例子:我们启动某些作
的专业一点的程序时(比如Netscape,Adobe&nbsp;Acrobat等)会先跳出一个启动画面.上面通常有一
些版权信息,版本号等.与此同时,程序后台正做着一些程序的加载或初始化工作.这个启动画面有别于
一般的窗口.它没有标题栏,没有系统菜单,也没有边框.只有一张位图在屏幕上显示一会儿,然后消失
.在这一章我们来试试自己做一个. <br>
&nbsp;&nbsp;&nbsp;&nbsp;第一步你可能会想到把要显示的位图包含到资源文件中去.但是这样做
有一个缺点.你的程序只在启动的时候显示这张位图,可是它却至始至终存在于你的内存中,直到你
把程序关掉.这不能不说是对内存的极大浪费.好办法是:创建一个"资源"DLL(动态连接库)来包含位图
和它独特的显示代码.这样,你就可以在想显示启动画面的时候加载他,用完了就卸载它.所以,我们的
程序需要2个模块:主程序和启动画面DLL.我们要把位图放到这个DLL的资源中去.
 <br>
&nbsp;&nbsp;&nbsp;&nbsp;基本步骤如下: 
<ol>
  <li> 把位图作为一个位图资源放到DLL中去.</li>
  <li> 主程序调用 LoadLibrary 把 dll 加载到内存中去.</li>
  <li> DLL 被调用后,它会建立一个定时器用于管理启动画面显示的时间.然后,注册并创建一个没有
  标题和边框的窗口.同时在窗口的客户区显示位图.</li>
  <li> 等启动画面的显示时间长度到达你预先的设定值,启动画面消失,控制权回到主程序手中.</li>
  <li> 主程序调用 FreeLibrary 从内存中卸载 DLL .然后,做它该做的事去.</li>
</ol>
&nbsp&nbsp&nbsp&nbsp下面我们来研究细节部分
<h3> 加载/卸载 DLL</h3>
你可以用 LoadLibrary 灵活的加载一个 DLL ,它的格式如下: 
<blockquote>LoadLibrary&nbsp; proto lpDLLName:DWORD</blockquote>
它只有一个参数: 你想要加载的 DLL 的名称所在的地址.调用成功返回指向该DLL模块的句柄,反之返回NULL.
<br>
要卸载 DLL, 则调用 FreeLibrary: 
<blockquote>FreeLibrary&nbsp; proto&nbsp; hLib:DWORD</blockquote>
它也只有一个参数: 你想要卸载的 DLL 模块的句柄(通常就是上面那个函数返回的啦). 
<h3> <b>怎样使用定时器</b></h3>
首先, 你要用 SetTimer 创建一个定时器: 
<blockquote>SetTimer&nbsp; proto&nbsp; hWnd:DWORD, TimerID:DWORD, uElapse:DWORD, 
  lpTimerFunc:DWORD 
  <p><b>hWnd</b>接受这个定时器消息的窗口的句柄.如果,你的定时器不需要窗口接受它的消息,你也可以
  用NULL作为参数<br>
    <b>TimerID</b>定时器的 ID 值. 由你自己定义.
    <br>
    <b>uElapse </b>定时器定的时间.以ms(千分之一秒)为单位. <br>
    <b>lpTimerFunc </b>处理该定时器消息的函数所在的地址.如果你用NULL作为该参数,那么定时器的消息会被送给 hWnd 参数所指定的窗口.
  <p>SetTimer 如果成功则返回定时器的 ID 否则返回 NULL. 所以最好不要把定时器的ID设为0(Pheadnius:NULL代表0, 记得吗?).
</blockquote>
你可以用2种方法创建定时器: 
<ul>
  <li> 如果你有一个窗口并且定时器把消息传给这个窗口.那么你需要把所有的4个参数都传送给 Settimer 函数
  (lpTimerFunc参数必须为NULL).</li>
  <li> 如果你没有窗口或者你不想让窗口处理定时器的消息,那么你必须在窗口句柄中传送一个NULL.同时你要指定
用于处理定时器消息的函数的地址.</li>
</ul>
在这个例子中我们要使用第一种方法. <br>
当你设定的时间到了, 与定时器相连的窗口会收到 WM_TIMER 消息.例如,你指定 uElapse 的值为 1000, 你的窗口每
过一秒都会收到 WM_TIMER 消息.<br>
等到你再也不需要这个定时器了,就用 KillTimer 来去除定时器.<blockquote>KillTimer&nbsp; proto&nbsp; hWnd:DWORD, TimerID:DWORD</blockquote>
<h3> <b>例子:</b></h3>
 ;-----------------------------------------------------------------------  
<br>
 ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
主程序  <br>
 ;-----------------------------------------------------------------------  
<br>
 .386  <br>
 .model flat,stdcall  <br>
 option casemap:none  <br>
 include \masm32\include\windows.inc  <br>
 include \masm32\include\user32.inc  <br>
 include \masm32\include\kernel32.inc  <br>
 includelib \masm32\lib\user32.lib  <br>
 includelib \masm32\lib\kernel32.lib  
<p> WinMain proto :DWORD,:DWORD,:DWORD,:DWORD  
<p> .data  <br>
   ClassName db "SplashDemoWinClass",0  <br>
   AppName&nbsp; db "Splash Screen Example",0  <br>
  <b> Libname db "splash.dll",0 </b> 
<p> .data?  <br>
   hInstance HINSTANCE ?  <br>
   CommandLine LPSTR ?  <br>
   .code  <br>
   start:  <br>
  <b> &nbsp;invoke LoadLibrary,addr Libname </b> <br>
  <b> &nbsp;.if eax!=NULL </b> <br>
  <b> &nbsp;&nbsp;&nbsp; invoke FreeLibrary,eax </b> <br>
  <b> &nbsp;.endif </b> <br>
   &nbsp;invoke GetModuleHandle, NULL  <br>
   &nbsp;mov&nbsp;&nbsp;&nbsp; hInstance,eax  <br>
   &nbsp;invoke GetCommandLine  <br>
   &nbsp;mov&nbsp;&nbsp;&nbsp; CommandLine,eax  <br>
   &nbsp;invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT  <br>
   &nbsp;invoke ExitProcess,eax  
<p> WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD  
  <br>
   &nbsp;LOCAL wc:WNDCLASSEX  <br>
   &nbsp;LOCAL msg:MSG  <br>
   &nbsp;LOCAL hwnd:HWND  <br>
   &nbsp;mov&nbsp;&nbsp; wc.cbSize,SIZEOF WNDCLASSEX  <br>
   &nbsp;mov&nbsp;&nbsp; wc.style, CS_HREDRAW or CS_VREDRAW  <br>
   &nbsp;mov&nbsp;&nbsp; wc.lpfnWndProc, OFFSET WndProc  <br>
   &nbsp;mov&nbsp;&nbsp; wc.cbClsExtra,NULL  <br>
   &nbsp;mov&nbsp;&nbsp; wc.cbWndExtra,NULL  <br>
   &nbsp;push&nbsp; hInstance  <br>
   &nbsp;pop&nbsp;&nbsp; wc.hInstance  <br>
   &nbsp;mov&nbsp;&nbsp; wc.hbrBackground,COLOR_WINDOW+1  <br>
   &nbsp;mov&nbsp;&nbsp; wc.lpszMenuName,NULL  <br>
   &nbsp;mov&nbsp;&nbsp; wc.lpszClassName,OFFSET ClassName  <br>
   &nbsp;invoke LoadIcon,NULL,IDI_APPLICATION  <br>
   &nbsp;mov&nbsp;&nbsp; wc.hIcon,eax  <br>
   &nbsp;mov&nbsp;&nbsp; wc.hIconSm,eax  <br>
   &nbsp;invoke LoadCursor,NULL,IDC_ARROW  <br>
   &nbsp;mov&nbsp;&nbsp; wc.hCursor,eax  <br>
   &nbsp;invoke RegisterClassEx, addr wc  <br>
   &nbsp;INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\  <br>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\  
  <br>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\  
  <br>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hInst,NULL  
  <br>
   &nbsp;mov&nbsp;&nbsp; hwnd,eax  <br>
   &nbsp;invoke ShowWindow, hwnd,SW_SHOWNORMAL  <br>
   &nbsp;invoke UpdateWindow, hwnd  <br>
   &nbsp;.while TRUE  <br>
   &nbsp; invoke GetMessage, ADDR msg,NULL,0,0  <br>
   &nbsp; .break .if (!eax)  <br>
   &nbsp; invoke TranslateMessage, ADDR msg  <br>
   &nbsp; invoke DispatchMessage, ADDR msg  <br>
   &nbsp;.endw  <br>
   &nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; eax,msg.wParam  <br>
   &nbsp;ret  <br>
   WinMain endp  
<p> WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM  <br>
   &nbsp;.IF uMsg==WM_DESTROY  <br>
   &nbsp; invoke PostQuitMessage,NULL  <br>
   &nbsp;.ELSE  <br>
   &nbsp; invoke DefWindowProc,hWnd,uMsg,wParam,lParam  <br>
   &nbsp; ret  <br>
   &nbsp;.ENDIF  <br>
   &nbsp;xor eax,eax  <br>
   &nbsp;ret  <br>
   WndProc endp  <br>
   end start  
<p> ;--------------------------------------------------------------------  
  <br>
   ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  位图 DLL  <br>
   ;--------------------------------------------------------------------  
  <br>
   .386  <br>
   .model flat, stdcall  <br>
   include \masm32\include\windows.inc  <br>
   include \masm32\include\user32.inc  <br>
   include \masm32\include\kernel32.inc  <br>
   include \masm32\include\gdi32.inc  <br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -