xing59741 发表于 2012-7-26 22:48:55

【学习笔记】设备环境分析列子

设备环境分析.ASM
=====================================================
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
includewindows.inc
includegdi32.inc
includelib gdi32.lib
includeuser32.inc
includelib user32.lib
includekernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; EQU等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000h      ;图标
IDT_Timeequ 200
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain1 dd ?
hMenudd ?
hSubMenu dd ?
hWinMain2 dd ?
hTimerdd ?
hWinMain3 dd ?
.const
szClassName1 db 'My Class1',0   ;窗口类名称
szClassName2 db 'My Class2',0
szClassName3 db 'My Class3',0
szCaptionMain1 db '窗口【1】:请覆盖本窗口再观察窗口2',0;主窗口标题
szCaptionMain2 db '窗口【2】:本窗口显示窗口1的GDI',0   ;主窗口标题
szCaptionMain3 db '窗口【3】:本窗口显示窗口1的反色GDI',0;主窗口标题
szTextdb '窗口【1】的文字!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 退出程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Quitproc
invoke KillTimer,NULL,hTimer
invoke KillTimer,NULL,IDT_Time
invoke DestroyWindow,hWinMain1    ;摧毁窗口
invoke DestroyWindow,hWinMain2
invoke DestroyWindow,hWinMain3
invoke PostQuitMessage,NULL    ;退出消息循环
ret
_Quitendp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 定时器过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcTimer proc
local @hDc1,@hDc2
local @stRect:RECT
invoke GetDC,hWinMain1
mov @hDc1,eax
invoke GetDC,hWinMain2
mov @hDc2,eax
invoke GetClientRect,hWinMain1,addr @stRect
invoke BitBlt,@hDc2,0,0,@stRect.right,@stRect.bottom,@hDc1,0,0,SRCCOPY
   ;函数功能 :该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境
   ;hdcDest:指向目标设备环境的句柄
   ;nXDest:指定目标矩形区域左上角的X轴逻辑坐标
   ;nYDest:指定目标矩形区域左上角的Y轴逻辑坐标
   ;nWidth:指定目标矩形区域的逻辑宽度
   ;nHeight:指定目标矩形区域的逻辑高度
   ;hdcSrc:指向源设备环境的句柄
   ;nXSrc:指定源矩形区域左上角的X轴逻辑坐标
   ;nYSrc:指定源矩形区域左上角的Y轴逻辑坐标
   ;dwRop:指定光栅操作代码这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色
;光栅操作代码
;BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
;DSTINVERT:表示使目标矩形区域颜色取反。
;MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
;MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
;NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
;NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
;PATCOPY:将特定的模式拷贝到目标位图上。
;PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
;PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
;SRCAND   :通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
;SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
;SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
;SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
;SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
;WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
invoke ReleaseDC,hWinMain1,@hDc1
invoke ReleaseDC,hWinMain2,@hDc2
ret
_ProcTimer endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam;窗口过程开始
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc,@hDc1,@hDc3
mov eax,uMsg
mov ecx,hWnd
;********************************************************************
.if eax == WM_TIMER
mov eax,wParam
.if eax == IDT_Time
invoke GetDC,hWinMain1
mov @hDc1,eax
invoke GetDC,hWinMain3
mov @hDc3,eax
invoke GetClientRect,hWinMain1,addr @stRect
invoke BitBlt,@hDc3,0,0,@stRect.right,@stRect.bottom,@hDc1,0,0,NOTSRCCOPY
invoke ReleaseDC,hWinMain1,@hDc1
invoke ReleaseDC,hWinMain2,@hDc3
.endif
.elseif eax == WM_PAINT && ecx == hWinMain1
invoke BeginPaint,hWnd,addr @stPs   ;@stPs:接收绘画的消息放入PAINTSTRUCT结构体中
mov @hDc,eax   ;返回值是 无效矩形
invoke GetClientRect,hWnd,addr @stRect   ;获取客户区矩形信息放入RECT结构体中
invoke DrawText,@hDc,addr szText,-1,addr @stRect,DT_SINGLELINE or DT_CENTER or DT_VCENTER
   ;函数功能:该函数在指定的矩形里写入格式化文本,根据指定的方法对文本格式化(扩展的制表符,字符对齐、折行等)
   ;hdc:设备环境句柄
   ;lpString:指向将被写入的字符串的指针,如果参数nCount是-1,则字符串必须是以\0结束的
   ;:如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符
   ;nCount:指向字符串中的字符数如果nCount为-1,则lpString指向的字符串被认为是以\0结束的,DrawText会自动计算字符数
   ;lpRect:指向结构RECT的指针,其中包含正文将被置于其中的矩形的信息(按逻辑坐标)
   ;uFormat:指定格式化正文的方法它可以下列值的任意组合,各值描述如下:
;DT_BOTTOM:将正文调整到矩形底部此值必须和DT_SINGLELINE组合
;DT_CALCRECT:决定矩形的宽和高如果正文有多行,DrawText使用lpRect定义的矩形的宽度,并扩展矩形的底训以容纳正文的最后一行,如果正文只有一行,则DrawText改变矩形的右边界,以容纳下正文行的最后一个字符,上述任何一种情况,DrawText返回格式化正文的高度而不是写正文
;DT_EDITCONTROL:复制多行编辑控制的正文显示特性,特殊地,为编辑控制的平均字符宽度是以同样的方法计算的,此函数不显示只是部分可见的最后一行
;DT_END_ELLIPSIS或DT_PATH_ELLIPSIS:可以指定DT_END_ELLIPSIS来替换在字符串末尾的字符,或指定DT_PATH_ELLIPSIS来替换字符串中间的字符如果字符串里含有反斜扛,DT_PATH_ELLIPSIS尽可能地保留最后一个反斜杠之后的正文
;DT_EXPANDTABS:扩展制表符,每个制表符的缺省字符数是8
;DT_EXTERNALLEADING :在行的高度里包含字体的外部标头,通常,外部标头不被包含在正文行的高度里
;DT_INTERNAL:用系统字体来计算正文度量
;DT_MODIFYSTRING :修改给定的字符串来匹配显示的正文,此标志必须和DT_END_ELLIPSIS或DT_PATH_ELLIPSIS同时使用
;DT_NOCLIP:无裁剪绘制当DT_NOCLIP使用时DrawText的使用会有所加快
;DT_NOPREFIX:关闭前缀字符的处理,通常DrawText解释助记前缀字符,&为给其后的字符加下划线,解释&&为显示单个&指定DT_NOPREFIX,这种处理被关闭
;DT_RTLREADING:当选择进设备环境的字体是Hebrew或Arabicf时,为双向正文安排从右到左的阅读顺序都是从左到右的
;DT_SINGLELINE:显示正文的同一行,回车和换行符都不能折行
;DT_TABSTOP:设置制表,参数uFormat的15-18位(低位字中的高位字节)指定每个制表符的字符数,每个制表符的缺省字符数是8
;DT_CENTER:使正文在矩形中水平居中
;DT_LEFT   :正文左对齐
;DT_RIGHT:正文右对齐
;DT_TOP   :正文顶端对齐(仅对单行)
;DT_VCENTER:正文水平居中(仅对单行)
;DT_WORDBREAK:断开字当一行中的字符将会延伸到由lpRect指定的矩形的边框时,此行自动地在字之间断开一个回车一换行也能使行折断
;DT_WORD_ELLIPSIS :截短不符合矩形的正文,并增加椭圆
;注意   :DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP, DT_NOPREFIX值不能和DT_TABSTOP值一起使用
;返回值   :如果函数调用成功,返回值是正文的高度,如果函数调用失败,返回值是0
;备注:函数DrawText用设备环境中的字体选择、正文颜色和背景颜色来写正文,除非DT_NOCLIP被使用,DrawText裁剪正文,所以它不会出现在指定矩形的外面,除DT_SINGLELINE格式化,其余的格式都认为正文有多行
;如果选择的字体对指定的矩形而言太大,DrawText不会试图去换成一种小字体
invoke EndPaint,hWnd,addr @stPs
;********************************************************************
.elseif eax == WM_CLOSE   ;处理关闭消息
call _Quit
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam;将剩下的消息交给WINDOWS处理
ret       ;直接返回
.endif
;********************************************************************
xor eax,eax       ;将EAX寄存器致零
ret      ;直接返回
_ProcWinMain endp       ;窗口过程结束
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc       ;主模块执行
local @stWndClass:WNDCLASSEX   ;申请注册窗口类的结构体@stWndClass
local @stMsg:MSG      ;申请消息结构体@stMsg
invoke GetModuleHandle,NULL   ;获取本程序句柄
mov hInstance,eax      ;保存句柄到hInstance变量
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass;将结构体@stWndClass全部清0
;********************************************************************
; 注册窗口类
;********************************************************************
invoke LoadIcon,hInstance,ICO_MAIN
mov @stWndClass.hIcon,eax
mov @stWndClass.hIconSm,eax
push hInstance      ;将程序的实例句柄压栈
pop @stWndClass.hInstance   ;将程序的实例句柄出栈存储到结构体中
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
;类的风格 CS_HREDRAW当窗口水平方向的宽度变化时重绘整个窗口
;CS_VREDRAW 当窗口垂直方向的宽度变化时重绘整个窗口
mov @stWndClass.lpfnWndProc,offset _ProcWinMain;窗口回调过程的地址存储到结构体中
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1;画刷:颜色是白色..后面规定要+1
mov @stWndClass.lpszClassName,offset szClassName1;给定类名称
invoke RegisterClassEx,addr @stWndClass    ;注册窗口类
;********************************************************************
; 建立并显示窗口1
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName1,offset szCaptionMain1,\
    WS_OVERLAPPEDWINDOW,100,400,400,300,NULL,NULL,hInstance,NULL
;建立窗口窗口风格扩展client客户 + edge边缘,后面的是类名称,窗口标题,复合窗口风格
mov hWinMain1,eax      ;将返回句柄存储到hWinMain
invoke ShowWindow,hWinMain1,SW_SHOWNORMAL    ;显示窗口:SW_SHOWNORMAL普通状态显示
invoke UpdateWindow,hWinMain1   ;更新窗口
;********************************************************************
; 建立并显示窗口2
;********************************************************************
mov @stWndClass.lpszClassName,offset szClassName2
invoke RegisterClassEx,addr @stWndClass
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName2,offset szCaptionMain2,\
    WS_OVERLAPPEDWINDOW,700,200,400,300,NULL,NULL,hInstance,NULL
;建立窗口窗口风格扩展client客户 + edge边缘,后面的是类名称,窗口标题,复合窗口风格
mov hWinMain2,eax      ;将返回句柄存储到hWinMain
invoke ShowWindow,hWinMain2,SW_SHOWNORMAL    ;显示窗口:SW_SHOWNORMAL普通状态显示
invoke UpdateWindow,hWinMain2
;********************************************************************
; 建立并显示窗口3
;********************************************************************
mov @stWndClass.lpszClassName,offset szClassName3
invoke RegisterClassEx,addr @stWndClass
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName3,offset szCaptionMain3,\
    WS_OVERLAPPEDWINDOW,700,600,400,300,NULL,NULL,hInstance,NULL
;建立窗口窗口风格扩展client客户 + edge边缘,后面的是类名称,窗口标题,复合窗口风格
mov hWinMain3,eax      ;将返回句柄存储到hWinMain
invoke ShowWindow,hWinMain3,SW_SHOWNORMAL    ;显示窗口:SW_SHOWNORMAL普通状态显示
invoke UpdateWindow,hWinMain3
;********************************************************************
; 设置定时器
;********************************************************************
invoke SetTimer,NULL,NULL,100,addr _ProcTimer
mov hTimer,eax
invoke SetTimer,hWinMain3,IDT_Time,99,NULL
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE       ;TRUE==1
invoke GetMessage,addr @stMsg,NULL,0,0   ;取得本程序所有的消息放入@stMsg
.break .if eax == 0   ;如果EAX返回0(收到退出函数就等于0)则立即中断并退出消息循环
invoke TranslateMessage,addr @stMsg   ;转译@stMsg里面的消息到窗口过程
invoke DispatchMessage,addr @stMsg   ;派发@stMsg里面的消息到窗口过程
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain      ;调用子程序_WinMain
invoke ExitProcess,NULL      ;退出程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start      ;程序从start开始执行






设备环境分析.RC
===============================================================
#include<resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//宏命令
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#defineICO_MAIN 0x1000   //图标
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON"Main.ico"



页: [1]
查看完整版本: 【学习笔记】设备环境分析列子