|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
设备环境使用的库
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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
IDB_BACK equ 100
ICO_MAIN equ 100
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
dwCount dd ?
dwPointArray dd 10 dup (?)
.data
.const
szClassName db 'Test',0
szCaptionMain db '库的对象使用!',0
dwPointConst dd 10,90,70,150,75,105,25,155,75,140
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_AdjustPoint proc ;改变坐标位置
pushad ;保护现场
mov esi,offset dwPointArray ;dwPointArray原来是缓冲区,现在存储了(x,Y)
inc dwCount ;dwCount==0 加1为1
.if dwCount == 6
mov dwCount,0 ;将dwCount置0
add dword ptr [esi+4],70 ;Y1 + 70
add dword ptr [esi+4*3],70 ;Y2 + 70
add dword ptr [esi+4*5],70 ;Y3 + 70
add dword ptr [esi+4*7],70 ;Y4 + 70
add dword ptr [esi+4*9],70 ;Y5 + 70
;>>>>>>>>>>>>>>>>>>>>>
sub dword ptr [esi],350 ;X1 - 350
sub dword ptr [esi+4*2],350 ;X2 - 350
sub dword ptr [esi+4*4],350 ;X3 - 350
sub dword ptr [esi+4*6],350 ;X4 - 350
sub dword ptr [esi+4*8],350 ;X5 - 350
.else
add dword ptr [esi],70 ;X1 + 70
add dword ptr [esi+4*2],70 ;X2 + 70
add dword ptr [esi+4*4],70 ;X3 + 70
add dword ptr [esi+4*6],70 ;X4 + 70
add dword ptr [esi+4*8],70 ;X5 + 70
.endif
popad ;恢复现场
ret
_AdjustPoint endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DrawLine proc _hDC,_dwPen,_dwPenWidth,_dwColor,_dwStartX,_dwEndX,_dwY ;设备环境句柄,画笔风格,画笔宽度,画笔颜色,开始的x坐标,结束的x坐标,y坐标
invoke CreatePen,_dwPen,_dwPenWidth,_dwColor ;创建自定义画笔,画笔风格,画笔的宽度,画笔的颜色
invoke SelectObject,_hDC,eax ;将对象句柄使用在设备环境句柄
invoke DeleteObject,eax ;删除上个对象句柄
invoke MoveToEx,_hDC,_dwStartX,_dwY,NULL
invoke LineTo,_hDC,_dwEndX,_dwY
ret
_DrawLine endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_TestPen proc _hDC ;开始测试绘画
local @hBrush,@stRect:RECT ;画刷环境句柄,矩形坐标
mov esi,offset dwPointConst ;将dwPointConst:10,90,70,150,75,105,25,155,75,140内存地址存入esi
mov edi,offset dwPointArray ;缓冲区 dd 10 dup (?)
push edi ;缓冲区地址放入堆栈
mov ecx,10 ;将数值10放入ecx寄存器
cld ;清方向标志使DF=0
rep movsd ;将 ESI 里的内容 按 ECX 大小 拷贝到 EDI
pop esi ;将堆栈缓冲存至esi寄存器
mov dwCount,0 ;将dwCount置0
;********************************************************************
; 测试画笔
;********************************************************************
invoke SetBkColor,_hDC,250*100h ;设置当前输出字体背景色、参数1:设置环境句柄、参数2:颜色
invoke _DrawLine,_hDC,PS_SOLID,2,210,10,420,10 ;设备环境句柄,画笔风格(实线),画笔宽度,画笔颜色,开始的x坐标,结束的x坐标,y坐标
;PS_SOLID:实心线[当宽度大于1会在边线上]
invoke _DrawLine,_hDC,PS_INSIDEFRAME,2,250,10,420,20
;PS_INSIDEFRAME:实心线[当宽度大于1会在边线里面]
invoke SetBkMode,_hDC,OPAQUE
;SetBkMode参数 OPAQUE :不透明背景色,即用户设置成什么背景色就显什么背景色
; TRANSPARENT :是透明背景色,不管用户设成什么背景色,显示的都是整个VIEW的的背景色
invoke _DrawLine,_hDC,PS_DASH,2,0,10,420,30 ;设备环境句柄,画笔风格(下划线),画笔宽度,画笔颜色,开始的x坐标,结束的x坐标,y坐标
invoke _DrawLine,_hDC,PS_DOT,2,0,10,420,40 ;设备环境句柄,画笔风格(点),画笔宽度,画笔颜色,开始的x坐标,结束的x坐标,y坐标
invoke SetBkMode,_hDC,TRANSPARENT ;设置输出文字背景是否透明[TRANSPARENT:透明]和[OPAQUE:不透明]
invoke _DrawLine,_hDC,PS_DASHDOT,2,0,10,420,50 ;设备环境句柄,画笔风格(划 点),画笔宽度,画笔颜色,开始的x坐标,结束的x坐标,y坐标
invoke _DrawLine,_hDC,PS_DASHDOTDOT,2,0,10,420,60 ;设备环境句柄,画笔风格(划 点 点),画笔宽度,画笔颜色,开始的x坐标,结束的x坐标,y坐标
;********************************************************************
; 测试画线函数
;********************************************************************
invoke GetStockObject,WHITE_PEN ;获取常用的对象:黑色画笔
invoke SelectObject,_hDC,eax ;将黑色画笔和当前绘画句柄关联
invoke DeleteObject,eax ;删除原来的对象
invoke GetStockObject,DKGRAY_BRUSH ;获取对象:浅灰色画刷的句柄
mov @hBrush,eax ;存储在局部变量@hBrush中
invoke SelectObject,_hDC,eax ;将浅灰色画刷和当前绘画句柄关联
invoke DeleteObject,eax ;释放对象:黑色画笔
invoke PolylineTo,_hDC,addr dwPointArray,5 ;从当前坐标开始画多条直线
;直接的就是X1,Y1 X2,Y2 X3,Y3 X4,Y4 X5.Y5 【10,90,70,150,75,105,25,155,75,140】
invoke _AdjustPoint ;第一次改变坐标位置
invoke PolyBezierTo,_hDC,addr dwPointArray,3 ;画贝塞尔曲线
invoke _AdjustPoint ;第二次改变坐标位置
invoke ArcTo,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3],\ ;从当前点画弧
[esi+4*4],[esi+4*5],[esi+4*6],[esi+4*7]
invoke _AdjustPoint ;第三次改变坐标位置
invoke Polyline,_hDC,addr dwPointArray,5 ;画多条直线
invoke _AdjustPoint ;第四次改变坐标位置
invoke PolyBezier,_hDC,addr dwPointArray,4 ;画贝塞尔曲线
invoke _AdjustPoint ;第五次改变坐标位置
invoke Arc,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3],\ ;画弧
[esi+4*4],[esi+4*5],[esi+4*6],[esi+4*7]
invoke _AdjustPoint ;第六次改变坐标位置
;********************************************************************
; 测试填充函数
;********************************************************************
invoke Chord,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3],\ ;画弧并将两端连接,弧会被填充
[esi+4*4],[esi+4*5],[esi+4*6],[esi+4*7]
invoke _AdjustPoint ;第七次改变坐标位置
invoke Pie,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3],\ ;画弧并将两端连接圆心连接,弧会被填充
[esi+4*4],[esi+4*5],[esi+4*6],[esi+4*7]
invoke _AdjustPoint ;第八次改变坐标位置
invoke Ellipse,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3] ;两点对角成矩形,相切里面的椭圆,并填充椭圆
invoke _AdjustPoint ;第九次改变坐标位置
invoke SetPolyFillMode,_hDC,ALTERNATE ;ALTERNATE :间隔填充
invoke Polygon,_hDC,addr dwPointArray,5 ;画多条直线并间隔填充
invoke _AdjustPoint ;第十次改变坐标位置
invoke SetPolyFillMode,_hDC,WINDING ;WINDING :全部填充
invoke Polygon,_hDC,addr dwPointArray,5 ;画多条直线并全部填充
invoke _AdjustPoint ;第十一次改变坐标位置
invoke _AdjustPoint ;第十二次改变坐标位置
;********************************************************************
invoke Rectangle,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3] ;两点对角的矩形并填充
invoke _AdjustPoint ;第十三次改变坐标位置
invoke RoundRect,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3],20,20 ;两点对角的园边矩形,四个角是小椭圆的高和宽.并填充
invoke _AdjustPoint ;第十四次改变坐标位置
push dwPointArray ;无画笔的填充矩形
pop @stRect.left
push dwPointArray+4
pop @stRect.top
push dwPointArray+4*2
pop @stRect.right
push dwPointArray+4*3
pop @stRect.bottom
invoke FillRect,_hDC,addr @stRect,@hBrush ;无画笔有填充
invoke _AdjustPoint ;第十五次改变坐标位置
push dwPointArray ;画笔的边线矩形无填充
pop @stRect.left
push dwPointArray+4
pop @stRect.top
push dwPointArray+4*2
pop @stRect.right
push dwPointArray+4*3
pop @stRect.bottom
invoke FrameRect,_hDC,addr @stRect,@hBrush ;无填充有边线的矩形
invoke _AdjustPoint ;第十六次改变坐标位置
push dwPointArray ;指定的矩形区域中颜色值取反
pop @stRect.left
push dwPointArray+4
pop @stRect.top
push dwPointArray+4*2
pop @stRect.right
push dwPointArray+4*3
pop @stRect.bottom
invoke InvertRect,_hDC,addr @stRect ;指定的矩形区域中颜色值取反
invoke _AdjustPoint ;第十七次改变坐标位置
invoke _AdjustPoint ;第十八次改变坐标位置
;********************************************************************
; 测试画刷
;********************************************************************
invoke CreateHatchBrush,HS_BDIAGONAL,250
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke Rectangle,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3] ;用图案线条填充矩形
invoke _AdjustPoint ;第十九次改变坐标位置
invoke CreateHatchBrush,HS_CROSS,250h
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke RoundRect,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3],8,8
invoke _AdjustPoint
invoke CreateHatchBrush,HS_DIAGCROSS,100*255*255h
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke Rectangle,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3]
invoke _AdjustPoint
invoke CreateHatchBrush,HS_FDIAGONAL,0
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke Rectangle,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3]
invoke _AdjustPoint
invoke CreateHatchBrush,HS_HORIZONTAL,0
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke Rectangle,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3]
invoke _AdjustPoint
invoke CreateHatchBrush,HS_VERTICAL,0
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke Rectangle,_hDC,[esi],[esi+4],[esi+4*2],[esi+4*3]
invoke _AdjustPoint
ret
_TestPen endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_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
invoke _TestPen,eax
invoke EndPaint,hWnd,addr @stPs
;********************************************************************
.elseif eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;********************************************************************
.elseif eax == WM_CREATE
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
;********************************************************************
.elseif eax == WM_RBUTTONUP
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
invoke LoadBitmap,hInstance,IDB_BACK
invoke CreatePatternBrush,eax ;创建位图刷子
;invoke GetStockObject,WHITE_BRUSH
mov @stWndClass.hbrBackground,eax ;将窗口使用这个画刷填充
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,\
300,200,440,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
RC文件
#define ICO_MAIN 100
#define IDB_BACK 100
ICO_MAIN ICON "Main.ico"
IDB_BACK BITMAP "other.bmp"
高考完后。理所应当的我进入的大专。。
神奇的室友玩游戏
一起玩到前几天。才醒悟过来了。。我得继续干了
LOL真心会上瘾
|
|