鱼C论坛

 找回密码
 立即注册
查看: 1816|回复: 0

[技术交流] 【学习笔记】设备环境分析列子

[复制链接]
发表于 2012-7-26 22:48:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
设备环境分析.ASM
=====================================================
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  .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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; EQU等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000h      ;图标
IDT_Time  equ 200
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  .data?
hInstance dd ?
hWinMain1 dd ?
hMenu  dd ?
hSubMenu dd ?
hWinMain2 dd ?
hTimer  dd ?
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  ;主窗口标题
szText  db '窗口【1】的文字!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 退出程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Quit  proc
  invoke KillTimer,NULL,hTimer
  invoke KillTimer,NULL,IDT_Time
  invoke DestroyWindow,hWinMain1    ;摧毁窗口
  invoke DestroyWindow,hWinMain2
  invoke DestroyWindow,hWinMain3
  invoke PostQuitMessage,NULL    ;退出消息循环
  ret
_Quit  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 定时器过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_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>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//宏命令
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define  ICO_MAIN 0x1000   //图标
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON  "Main.ico"




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 11:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表