主页 > 游戏开发  > 

RadASM环境,win32汇编入门教程之七

RadASM环境,win32汇编入门教程之七

;运行效果

;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函数把原来创建的字体删除掉。

标签:

RadASM环境,win32汇编入门教程之七由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“RadASM环境,win32汇编入门教程之七