鱼C论坛

 找回密码
 立即注册
查看: 2100|回复: 1

[技术交流] 【学习笔记】设备环境使用的库

[复制链接]
发表于 2012-12-6 10:13:56 | 显示全部楼层 |阅读模式

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

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

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真心会上瘾


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-6 12:40:37 | 显示全部楼层
惭愧,图形那章被我跳过去了,有空补。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-8 00:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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