;运行效果
;RadASM环境,win32汇编入门教程之七
;在上一个教程里面,我们学习如何把数据显示出来。但是感觉太丑了,在这一教程里,我们来学习一下怎样让它们变漂亮点。
;主要的内容是如何创建字体,设置字体的大小,设置背景色及文本色等。
;下列就是上一节教程的代码中加一些内容,可以直接复制下来,然后编译运行看看效果
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA
ClassName db "SimpleWinClass",0
AppName db "窗口程序的模版",0
sz_FontName01 db "方正姚体",0
sz_FontName02 db "隶书",0
sF db "%d",0
hA dd 168
hD db "世界,你好!",0
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hB dd ?
.const;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
hC equ 16800
.CODE
start:
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,100,100,400,300, NULL,NULL,hInst, NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.break .if (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax,msg.wParam
ret
WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @stPs:PAINTSTRUCT
LOCAL @szBuffer[256]:byte
LOCAL @hDc
LOCAL @hFont01,@hOldFont01 ;设置字体变量
LOCAL @hFont02,@hOldFont02
.if uMsg == WM_CREATE
.elseif uMsg == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax
invoke CreateFont,23,12,0,0,FW_BLACK,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SWISS,addr sz_FontName01 ;创建新字体
mov @hFont01,eax
invoke SelectObject,@hDc,@hFont01
mov @hOldFont01,eax
;设置新字体及各种参数
invoke SetTextAlign,@hDc,TA_TOP or TA_LEFT ;左对齐或顶端对齐
invoke SetTextCharacterExtra,@hDc,1 ;设置字符间距
invoke SetTextColor,@hDc,663366H ;设置文本颜色
;下面显示168
invoke wsprintf,addr @szBuffer,addr sF,hA
invoke lstrlen,addr @szBuffer
invoke TextOut,@hDc,100,30,addr @szBuffer,eax ;显示函数
;下面显示1680
mov hB,1680
invoke wsprintf,addr @szBuffer,addr sF,hB
invoke lstrlen,addr @szBuffer
invoke TextOut,@hDc,100,80,addr @szBuffer,eax
invoke SelectObject,@hDc,@hOldFont01 ;恢复原来的字体
invoke DeleteObject,@hFont01 ;删除创建的字体
invoke CreateFont,28,14,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SWISS,addr sz_FontName01 ;创建新字体
mov @hFont02,eax
invoke SelectObject,@hDc,@hFont02
mov @hOldFont02,eax
;设置新字体及各种参数
invoke SetTextAlign,@hDc,TA_TOP or TA_LEFT
invoke SetTextCharacterExtra,@hDc,1
invoke SetTextColor,@hDc,0000CDH
;下面显示16800
invoke wsprintf,addr @szBuffer,addr sF,hC
invoke lstrlen,addr @szBuffer
invoke TextOut,@hDc,100,130,addr @szBuffer,eax
;下面显示"世界,你好!"
invoke lstrlen,addr hD
invoke TextOut,@hDc,100,180,addr hD,eax
invoke SelectObject,@hDc,@hOldFont02
invoke DeleteObject,@hFont02
invoke EndPaint,hWnd,addr @stPs
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
;在教程六里面,我们尝试着显示了4样东西,但看起来总是丑,显得很不专业
;在这个教程里,我们添加了一些代码,让它看起来没那么突兀。下面看添加的句子的意思
;sz_FontName db "方正姚体",0 这一句的意思是,定义一种字体的字符串名称,后面在创建新字体时使用。这种字体必须是电脑里面已经安装的。
;mov wc.hbrBackground,COLOR_WINDOW + 1 这一句的意思是,把窗口背景色加1,就可以和显示文本的背景色一样。
;当然,也可以另外设置文本的背景色。可以调用SetBkColor函数
;COLOR_WINDOW的值是5,像这种的是系统预定义的符号,它在一某些头文件里定义了,直接用就可以。
;所以,把COLOR_WINDOW + 1改成6,也是一样的意思
;如果编译运行后发现窗口不见了,再次编译运行又说无法删除,则可以在电脑最下面的那一栏,点右键。选启动任务管理器,在进程里找到这个程序,按右键,选结束进程。再重新编译运行。
;这里有个理论要知道。有一种叫显示设备上下文,就是窗口怎么显示,通过BeginPaint得到
;在这里,可以设置显示出来的东西,比如字符串的字体、大小或颜色等。
;如果设置了新的,就要把原来旧的设置保存下来,在离开的时候把旧的恢复回去
;如果不恢复回去,就会所系统的设置搞乱了。
;CreateFont的函数是创建新的字体,这个创建不是从零开始创建,只是使用电脑已经安装有的字体,从新设置字体的各项参数。
;SelectObject函数是把新创建的字体选入设备,就是在显示的时候使用这种字体。同时它的返回值,就是原来旧的字体,所以要保存起来。
;SetTextAlign、SetTextCharacterExtra、SetTextColor这三个函数我们看边上的解释就大概的明白它的意思。
;上面的例子创建了2种字体,产生了不同的效果。
;在新的设置使用完后,记得再次使用SelectObject函数,把原来旧的字体又设置回去。我们可以观察每次参数的不同,参数来自哪里。
;在恢复为原状后,要调用DeleteObject函数把原来创建的字体删除掉。