xing59741 发表于 2012-12-6 10:13:56

【学习笔记】设备环境使用的库


设备环境使用的库

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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
IDB_BACK equ 100
ICO_MAIN equ 100
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
dwCountdd ?
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 ,70   ;Y1 + 70
   add dword ptr ,70   ;Y2 + 70
   add dword ptr ,70   ;Y3 + 70
   add dword ptr ,70   ;Y4 + 70
   add dword ptr ,70   ;Y5 + 70
   ;>>>>>>>>>>>>>>>>>>>>>
   sub dword ptr ,350      ;X1 - 350
   sub dword ptr ,350   ;X2 - 350
   sub dword ptr ,350   ;X3 - 350
   sub dword ptr ,350   ;X4 - 350
   sub dword ptr ,350   ;X5 - 350
.else
   add dword ptr ,70      ;X1 + 70
   add dword ptr ,70   ;X2 + 70
   add dword ptr ,70   ;X3 + 70
   add dword ptr ,70   ;X4 + 70
   add dword ptr ,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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_TestPenproc _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   ;设置输出文字背景是否透明和
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,,,,,\    ;从当前点画弧
   ,,,
invoke _AdjustPoint       ;第三次改变坐标位置
invoke Polyline,_hDC,addr dwPointArray,5   ;画多条直线
invoke _AdjustPoint       ;第四次改变坐标位置
invoke PolyBezier,_hDC,addr dwPointArray,4   ;画贝塞尔曲线
invoke _AdjustPoint       ;第五次改变坐标位置
invoke Arc,_hDC,,,,,\    ;画弧
   ,,,
invoke _AdjustPoint       ;第六次改变坐标位置
;********************************************************************
; 测试填充函数
;********************************************************************
invoke Chord,_hDC,,,,,\    ;画弧并将两端连接,弧会被填充
   ,,,
invoke _AdjustPoint       ;第七次改变坐标位置
invoke Pie,_hDC,,,,,\    ;画弧并将两端连接圆心连接,弧会被填充
   ,,,
invoke _AdjustPoint       ;第八次改变坐标位置
invoke Ellipse,_hDC,,,,    ;两点对角成矩形,相切里面的椭圆,并填充椭圆
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,,,,    ;两点对角的矩形并填充
invoke _AdjustPoint       ;第十三次改变坐标位置
invoke RoundRect,_hDC,,,,,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,,,,    ;用图案线条填充矩形
invoke _AdjustPoint       ;第十九次改变坐标位置
invoke CreateHatchBrush,HS_CROSS,250h
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke RoundRect,_hDC,,,,,8,8
invoke _AdjustPoint
invoke CreateHatchBrush,HS_DIAGCROSS,100*255*255h
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke Rectangle,_hDC,,,,
invoke _AdjustPoint
invoke CreateHatchBrush,HS_FDIAGONAL,0
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke Rectangle,_hDC,,,,
invoke _AdjustPoint
invoke CreateHatchBrush,HS_HORIZONTAL,0
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke Rectangle,_hDC,,,,
invoke _AdjustPoint
invoke CreateHatchBrush,HS_VERTICAL,0
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke Rectangle,_hDC,,,,
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_MAIN100
#define IDB_BACK100
ICO_MAIN ICON"Main.ico"
IDB_BACK BITMAP"other.bmp"



高考完后。理所应当的我进入的大专。。
神奇的室友玩游戏
一起玩到前几天。才醒悟过来了。。我得继续干了

LOL真心会上瘾


メ㊣逆ご帅☆ 发表于 2012-12-6 12:40:37

惭愧,图形那章被我跳过去了,有空补。
页: [1]
查看完整版本: 【学习笔记】设备环境使用的库