第一个窗口程序(一.开始了解窗口)
来源:互联网 发布:微数网络 编辑:程序博客网 时间:2024/05/15 21:11
- 窗口的形成:操作系统由单任务到多任务的转变,要求多个任务同时运行,各个程序在屏幕上的显示不能相互干扰。
- 窗口与程序之间的关系:一个程序可以创建多个窗口,也可以没有创建窗口;窗口采用层次结构,一个窗口可以创建多个子窗口。
- 窗口界面:大部分窗口界面风格一致,一致的窗口形状和行为模式为用户提供了便利,但也有少数奇形怪状的窗口,如office中的助手。
- 窗口程序的运行模式:由dos程序的过程驱动方式转变为事件驱动方式,程序中必须随时准备处理不同的消息。
- win32asm第一个窗口程序,代码如下:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by 罗云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; FirstWindow.asm
; 窗口程序的模板代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FirstWindow.asm
; Link /subsystem:windows FirstWindow.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
szButton db 'button',0
szButtonText db '&OK',0
.const
szClassName db 'MyClass',0
szCaptionMain db 'My first Window !',0
szText db 'Win32 Assembly, Simple and powerful !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg
;********************************************************************
.if eax == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax
invoke GetClientRect,hWnd,addr @stRect
invoke DrawText,@hDc,addr szText,-1,/
addr @stRect,/
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd,addr @stPs
;*******************************************************************
;建立按钮
;*******************************************************************
.elseif eax == WM_CREATE
invoke CreateWindowEx,NULL,offset szButton,offset szButtonText,WS_CHILD or WS_VISIBLE,10,10,65,22,/
hWnd,1,hInstance,NULL
;********************************************************************
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret
_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;********************************************************************
; 注册窗口类
;********************************************************************
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,/
WS_OVERLAPPEDWINDOW,/
100,100,600,400,/
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
- 窗口程序的运行过程:
- 主程序的结构流程:得到应用程序句柄(GetModuleHandle)->注册窗口类(RegisterClassEx)->建立窗口(CreatWindowEx)->显示窗口(ShowWindow)->刷新窗口客户区(UpdateWindow)->进入无限的消息获取和消息处理循环。
- 消息循环:获取消息(GetfMessage)->转换为ascii码消息(TranslateMessage)(不是必要的)->将消息分派到回调函数处理(DispatchMessage),如果是WM_QUIT,则退出消息循环。
- windows对消息的处理过程:程序执行到消息循环时从消息队列中读取,然后分派,调用窗口过程处理,在返回消息循环。
- 应用程序之间也可以互相发送消息:PostMessage,把一个消息放到其他应用程序的消息队列中去。SendMessage,越过消息队列直接调用目标程序的窗口过程。
- windows在RegisterClassEx的时候得到窗口过程的回调地址。
- 第一个窗口程序(一.开始了解窗口)
- (一)第一个窗口程序
- 一、第一个窗口程序
- 第一个窗口程序
- 第一个窗口程序
- 第一个窗口程序
- 第一个窗口程序(二.分析窗口程序)
- 第一个Win32窗口程序
- 第一个Win32窗口程序
- Win32汇编--开始了解窗口程序
- 【windows程序设计】第一个小窗口程序
- 第二篇 第一个窗口程序
- WIN32汇编-第一个窗口程序
- win32 002 第一个窗口程序
- Windows程序设计--第一个窗口程序
- 第一个VC++2010 窗口程序
- 【实操】第一个C++窗口程序
- 第四章 第一个窗口程序
- Web App使用Quartz实现java schedule job
- COBOL语言初级教程(1)--COBOL简介
- VS.NET检测到的Web服务器运行的不是Asp.net 1.1版
- 中高移动互联应用平台
- 我买本了,哈哈!
- 第一个窗口程序(一.开始了解窗口)
- 中文字符转换
- 从纪敏佳被淘汰看中国新一代人的音乐素养
- 不能忽略细节问题
- 正则表达式相关
- .Net Framework下的PHP编译工具
- 缺点,不知不觉中的缺点.
- 可以吗?
- 当 今 社 会 的 十 句 大 实 话