⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 见招拆招 windows 程序设计 (四) .txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
szShow30 db "Relative diagonal of pixel:",0 

szShow31 db "LOGPIXELSX",0 
szShow32 db "Horizontal dots per inch:",0 

szShow33 db "LOGPIXELSY",0 
szShow34 db "Vertical dots per inch:",0 

szShow35 db "SIZEPALETTE",0 
szShow36 db "Number of palette entries:",0 

szShow37 db "NUMRESERVED",0 
szShow38 db "Reserved palette entries:",0 

szShow39 db "COLORRES",0 
szShow40 db "Actual color resolution:",0 

devcaps dd HORZSIZE, offset szShow01, offset szShow02
dd VERTSIZE, szShow03,offset szShow04
dd HORZRES,offset szShow05,offset szShow06
dd VERTRES,offset szShow07,offset szShow08 
dd BITSPIXEL,offset szShow09,offset szShow10 
dd PLANES,offset szShow11,offset szShow12 
dd NUMBRUSHES,offset szShow13,offset szShow14 
dd NUMPENS,offset szShow15,offset szShow16 
dd NUMMARKERS,offset szShow17,offset szShow18 
dd NUMFONTS,offset szShow19,offset szShow20 
dd NUMCOLORS,offset szShow21,offset szShow22 
dd PDEVICESIZE,offset szShow23,offset szShow24
dd ASPECTX,offset szShow25,offset szShow26 
dd ASPECTY,offset szShow27,offset szShow28 
dd ASPECTXY,offset szShow29,offset szShow30
dd LOGPIXELSX,offset szShow31,offset szShow32 
dd LOGPIXELSY,offset szShow33,offset szShow34 
dd SIZEPALETTE,offset szShow35,offset szShow36 
dd NUMRESERVED,offset szShow37,offset szShow38 
dd COLORRES,offset szShow39,offset szShow40 
devcapsEnd label DWORD

.DATA?
hInstance dd ?
cxChar dd ?
cxCaps dd ?
cyChar dd ?

.CODE
START: ;从这里开始执行

invoke GetModuleHandle,NULL
mov hInstance,eax
invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
invoke ExitProcess,0

WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,iCmdShow:DWORD
LOCAL wndclass :WNDCLASSEX
LOCAL msg :MSG
local hWnd :HWND
mov wndclass.cbSize,sizeof WNDCLASSEX 
mov wndclass.style,CS_HREDRAW or CS_VREDRAW 
mov wndclass.lpfnWndProc,offset WndProc

mov wndclass.cbClsExtra,0
mov wndclass.cbWndExtra,0

push hInst
pop wndclass.hInstance

invoke LoadIcon,NULL,IDI_APPLICATION
mov wndclass.hIcon,eax 

invoke LoadCursor,NULL,IDC_ARROW
mov wndclass.hCursor,eax 

invoke GetStockObject,WHITE_BRUSH
mov wndclass.hbrBackground,EAX

mov wndclass.lpszMenuName,NULL
mov wndclass.lpszClassName,offset szAppName

mov wndclass.hIconSm,0

invoke RegisterClassEx, ADDR wndclass
.if (EAX==0)
invoke MessageBox,NULL,CTXT("This program requires Windows NT!"),addr szAppName,MB_ICONERROR 
ret
.endif

invoke CreateWindowEx,
NULL,
ADDR szAppName, ;window class name
CTXT("Device Capabilities"), ;window caption
WS_OVERLAPPEDWINDOW, ;window style
CW_USEDEFAULT, ;initial x position
CW_USEDEFAULT, ;initial y position
CW_USEDEFAULT, ;initial x size
CW_USEDEFAULT, ;initial y size
NULL, ;parent window handle
NULL, ;window menu handle
hInstance, ;program instance handle
NULL ;creation parameters
mov hWnd,eax

invoke ShowWindow,hWnd,iCmdShow
invoke UpdateWindow,hWnd

StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:

mov eax,msg.wParam
ret
WinMain endp

WndProc proc hwnd:DWORD,message:DWORD,wParam :DWORD,lParam :DWORD

LOCAL szBuffer[10] :BYTE
LOCAL hdc :HDC
LOCAL i :DWORD
LOCAL ps :PAINTSTRUCT 
LOCAL tm :TEXTMETRIC
LOCAL tmp1,tmp2 :DWORD

.if message==WM_CREATE

invoke GetDC,hwnd
mov hdc,eax
invoke GetTextMetrics,hdc,addr tm
mov eax,tm.tmAveCharWidth 
mov cxChar,eax ;cxChar = tm.tmAveCharWidth 

mov eax,2 ;cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2
test DWORD ptr tm.tmPitchAndFamily,1
jNz @f
inc eax
@@:
push eax
mov eax,cxChar
pop ebx
mul ebx
shr eax,1
mov cxCaps,eax

mov eax,tm.tmHeight ;cyChar = tm.tmHeight + tm.tmExternalLeading 
add eax,DWORD ptr tm.tmExternalLeading
mov cyChar,eax

invoke ReleaseDC,hwnd, hdc

ret

.elseif message == WM_PAINT
invoke BeginPaint,hwnd,addr ps
mov hdc,eax

mov DWORD ptr i,0
lea esi,devcaps
add esi,4 ;指向后面的字符串的地址
@@:
mov ebx,i
mov eax,cyChar ;tmp2 = cyChar * i
mul ebx
mov tmp2,eax

mov edi,[esi] ;esi指向字符串的地址
;edi指向字符串
invoke lstrlen,edi ;取字符串长度
mov ebx,eax

;TextOut(hdc, 0, cyChar * i,devcaps[i].szLabel,lstrlen (devcaps[i].szLabel))
invoke TextOut,hdc,0,tmp2,edi,ebx
add esi,4

mov ebx,16 ;ecx = cxCaps * 14 原代码为14,但我发现具体太近遂做一点修改
mov eax,cxCaps
mul ebx
mov tmp1,eax 

mov edi,[esi] ;指向一个字符串地址

invoke lstrlen,edi
mov ebx,eax

;TextOut(hdc, 14 * cxCaps, cyChar * i,devcaps[i].szDesc,lstrlen (devcaps[i].szDesc))
invoke TextOut,hdc,tmp1,tmp2,edi,ebx
invoke SetTextAlign,hdc,TA_RIGHT or TA_TOP 

sub esi,8 
mov eax,cxChar ;tmp=14 * cxCaps + 35 * cxChar
mov ebx,35
mul ebx
add tmp1,eax

mov edi,[esi] ;edi=devcaps[i].iIndex

invoke GetDeviceCaps,hdc,edi
invoke wsprintf,addr szBuffer,CTXT("%5d"),eax
mov ebx,eax

invoke TextOut,hdc,tmp1,tmp2,addr szBuffer,ebx

invoke SetTextAlign,hdc,TA_LEFT or TA_TOP

inc i
add esi,16

cmp DWORD ptr i,NUMLINES
jNz @b



invoke EndPaint,hwnd,addr ps
ret

.elseif message == WM_DESTROY

invoke PostQuitMessage,NULL 

.endif

invoke DefWindowProc,hwnd, message, wParam, lParam

ret
WndProc endp
END START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -