?? lion-tut-c03.htm
字號:
<html>
<head>
<link rel="stylesheet" href="../../asm.css">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Iczelion 的 Win32asm 教程</title>
</head>
<body bgcolor="#FFFFFF" background="../../images/back01.jpg">
<p align="center"><font size="5"><u><strong><font color="#0000FF">第三課 創建簡單的窗口</font></strong></u></font></p>
<hr size="1">
<p>在本課中我們將寫一個 Windows 程序,它會在桌面顯示一個標準的窗口。</p>
<p> <font color="#FF0000">理論:</font></p>
<p> Windows 程序中,在寫圖形用戶界面時需要調用大量的標準 Windows Gui 函數。其實這對用戶和程序員來說都有好處,對于用戶,面對的是同一套標準的窗口,對這些窗口的操作都是一樣的,所以使用不同的應用程序時無須重新學習操作。對程序員來說,這些
Gui 源代碼都是經過了微軟的嚴格測試,隨時拿來就可以用的。當然至于具體地寫程序對于程序員來說還是有難度的。為了創建基于窗口的應用程序,必須嚴格遵守規范。作到這一點并不難,只要用模塊化或面向對象的編程方法即可。</p>
<p> 下面我就列出在桌面顯示一個窗口的幾個步驟:</p>
<ol>
<li>得到您應用程序的句柄(必需);</li>
<li>得到命令行參數(如果您想從命令行得到參數,可選);</li>
<li>注冊窗口類(必需,除非您使用 Windows 預定義的窗口類,如 MessageBox 或 dialog box;</li>
<li>產生窗口(必需);</li>
<li>在桌面顯示窗口(必需,除非您不想立即顯示它);</li>
<li>刷新窗口客戶區;</li>
<li>進入無限的獲取窗口消息的循環;</li>
<li>如果有消息到達,由負責該窗口的窗口回調函數處理;</li>
<li>如果用戶關閉窗口,進行退出處理。</li>
</ol>
<p> 相對于單用戶的 DOS 下的編程來說,Windows 下的程序框架結構是相當復雜的。但是 Windows 和 DOS 在系統架構上是截然不同的。Windows
是一個多任務的操作系統,故系統中同時有多個應用程序彼此協同運行。這就要求 Windows 程序員必須嚴格遵守編程規范,并養成良好的編程風格。</p>
<p> <font color="#FF0000">內容:</font></p>
<p> 下面是我們簡單的窗口程序的源代碼。在進入復雜的細節前,我將提綱挈領地指出幾點要點:</p>
<ol>
<li> 您應當把程序中要用到的所有常量和結構體的聲明放到一個頭文件中,并且在源程序的開始處包含這個頭文件。這么做將會節省您大量的時間,也免得一次又一次的敲鍵盤。目前,最完善的頭文件是
hutch 寫的,您可以到 hutch 或我的網站下載。您也可以定義您自己的常量和結構體,但最好把它們放到獨立的頭文件中</li>
<li> 用 includelib 指令,包含您的程序要引用的庫文件,譬如:若您的程序要調用 "MessageBox", 您就應當在源文件中加入如下一行:
includelib user32.lib 這條語句告訴 MASM 您的程序將要用到一些引入庫。如果您不止引用一個庫,只要簡單地加入 includelib
語句,不要擔心鏈接器如何處理這么多的庫,只要在鏈接時用鏈接開關 /LIBPATH 指明庫所在的路徑即可。</li>
<li> 在其它地方運用頭文件中定義函數原型,常數和結構體時,要嚴格保持和頭文件中的定義一致,包括大小寫。在查詢函數定義時,這將節約您大量的時間;</li>
<li> 在編譯,鏈接時用makefile文件,免去重復敲鍵。</li>
</ol>
<p><font color="#006666">.386 <br>
.model flat,stdcall <br>
option casemap:none <br>
include \masm32\include\windows.inc <br>
include \masm32\include\user32.inc <br>
includelib \masm32\lib\user32.lib
; calls to functions in user32.lib and kernel32.lib <br>
include \masm32\include\kernel32.inc <br>
includelib \masm32\lib\kernel32.lib </font></p>
<p><font color="#006666">WinMain proto :DWORD,:DWORD,:DWORD,:DWORD </font>
<p><font color="#006666">.DATA
; initialized data <br>
ClassName db "SimpleWinClass",0 ;
the name of our window class <br>
AppName db "Our First Window",0 ;
the name of our window </font>
<p><font color="#006666">.DATA?
; Uninitialized data <br>
hInstance HINSTANCE ? ; Instance handle
of our program <br>
CommandLine LPSTR ? <br>
.CODE
; Here begins our code <br>
start: <br>
invoke GetModuleHandle, NULL
; get the instance handle of our program. <br>
; Under Win32, hmodule==hinstance mov hInstance,eax <br>
mov hInstance,eax <br>
invoke GetCommandLine
; get the command line. You don't have to call this function IF <br>
; your program doesn't process the command line. <br>
mov CommandLine,eax <br>
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
; call the main function <br>
invoke ExitProcess, eax
; quit our program. The exit code is returned in eax from WinMain. </font>
<p><font color="#006666">WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
<br>
LOCAL wc:WNDCLASSEX
; create local variables on stack <br>
LOCAL msg:MSG <br>
LOCAL hwnd:HWND </font>
<p><font color="#006666"> mov wc.cbSize,SIZEOF WNDCLASSEX
; fill values in members of wc <br>
mov wc.style, CS_HREDRAW or CS_VREDRAW <br>
mov wc.lpfnWndProc, OFFSET WndProc <br>
mov wc.cbClsExtra,NULL <br>
mov wc.cbWndExtra,NULL <br>
push hInstance <br>
pop wc.hInstance <br>
mov wc.hbrBackground,COLOR_WINDOW+1 <br>
mov wc.lpszMenuName,NULL <br>
mov wc.lpszClassName,OFFSET ClassName <br>
invoke LoadIcon,NULL,IDI_APPLICATION <br>
mov wc.hIcon,eax <br>
mov wc.hIconSm,eax <br>
invoke LoadCursor,NULL,IDC_ARROW <br>
mov wc.hCursor,eax <br>
invoke RegisterClassEx, addr wc
; register our window class <br>
invoke CreateWindowEx,NULL,\ <br>
ADDR ClassName,\ <br>
ADDR AppName,\ <br>
WS_OVERLAPPEDWINDOW,\ <br>
CW_USEDEFAULT,\ <br>
CW_USEDEFAULT,\ <br>
CW_USEDEFAULT,\ <br>
CW_USEDEFAULT,\ <br>
NULL,\ <br>
NULL,\ <br>
hInst,\ <br>
NULL <br>
mov hwnd,eax <br>
invoke ShowWindow, hwnd,CmdShow
; display our window on desktop <br>
invoke UpdateWindow, hwnd
; refresh the client area </font>
<p><font color="#006666"> .WHILE TRUE
; Enter message loop <br>
invoke GetMessage, ADDR msg,NULL,0,0 <br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -