汇编语言学习笔记-按指定的字体输出文本
2010-01-16 16:52
609 查看
代码
.386 .model flat,stdcall;内存平坦,参数传递约定 option casemap:none;大小写敏感 ;;;;;;引用一些必要的数据 include D:\masm32\include\windows.inc include D:\masm32\include\user32.inc include \masm32\include\gdi32.inc includelib D:\masm32\lib\user32.lib include D:\masm32\include\kernel32.inc includelib D:\masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD;函数声明,将在后面进行函数的定义 RGB macro red,green,blue;宏定义 xor eax,eax;eax置零 mov ah,blue shl eax,8;左移8位 mov ah,green mov al,red endm ;;;;;;已定义数据的数据段 .DATA ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 OurText db "hello world",0 FontName db "script",0 ;;;;;;未定义数据的数据段 .DATA? hInstance HINSTANCE ? CommandLine LPSTR ? ;;;;;;代码段 .CODE start: ;程序的入口与end start对应 invoke GetModuleHandle,NULL;调用API函数获取应用程序句柄并把句柄存入eax寄存器 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,CmdShow;显示窗口 invoke UpdateWindow,hwnd;刷新窗口 ;开始消息循环 .WHILE TRUE invoke GetMessage,ADDR msg,NULL,0,0;获取消息队列中的消息 .BREAK .IF (!eax);如果获取的消息为WM_QUIT就退出消息循环 invoke TranslateMessage,ADDR msg;按键消息的转义 invoke DispatchMessage,ADDR msg;把消息发送到负责消息处理的函数,回调方法 .ENDW mov eax,msg.wParam;把退出的消息代码码放到EAX里然后回到主函数 ret WinMain endp WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM;消息处理函数,此函数可以随便命名 LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL rect:RECT LOCAL hfont:HFONT .IF uMsg == WM_DESTROY;销毁窗口的消息 invoke PostQuitMessage,NULL .ELSEIF uMsg == WM_PAINT invoke BeginPaint,hWnd,ADDR ps mov hdc,eax invoke CreateFont,64,56,0,0,400,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,ADDR FontName invoke SelectObject,hdc,eax;把指向字体的句柄放入设备环境 mov hfont,eax RGB 200,200,50 invoke SetTextColor,hdc,eax;设置文本颜色 RGB 0,0,255 invoke SetBkColor,hdc,eax;设置文本背景颜色 invoke GetClientRect,hWnd,ADDR rect;得到当前窗体的大小 ;invoke TextOut,hdc,0,0,ADDR OurText,SIZEOF OurText;写文本 invoke DrawText,hdc,ADDR OurText,-1,ADDR rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER;画文本 ;invoke SelectObject,hdc,hfont;如果是text out 则必须调用这一句 invoke EndPaint,hWnd,ADDR ps;释放环境句柄 .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam;默认的消息处理函数 ret;退出此子程序 .ENDIF xor eax,eax;eax置零 ret WndProc endp end start
相关文章推荐
- 汇编语言学习笔记-在窗口打印文本
- 汇编语言学习笔记(4)
- 【学习笔记之汇编语言】【二】寄存器
- 汇编语言学习笔记(四)
- 汇编语言学习笔记(3)
- ARM汇编语言学习笔记之一(ARM简介)
- 王爽汇编语言第二版学习笔记之实验13(1)
- 32位汇编语言学习笔记(14)--递归函数的调用
- 汇编语言学习笔记(1)
- 用汇编实现类似于C语言中的printf函数--学习笔记
- 32位汇编语言学习笔记(24)--HexDump程序
- 32位汇编语言学习笔记(10)--分析for循环的汇编代码
- 32位汇编语言学习笔记(12)--分析switch语句的汇编代码
- 80x86汇编语言学习笔记(二)二次修改版
- windows下32位汇编语言学习笔记 第四章 第一个窗口程序 1 (消息的使用和入口代码)
- 如何使用汇编在dos界面上显示字体和颜色--学习心得笔记
- 汇编语言学习笔记(随笔记) 端口
- 汇编语言学习笔记(可持续补充)
- 王爽汇编语言学习笔记(二)--寄存器
- 汇编语言学习笔记(五)