📄 见招拆招 windows 程序设计 (四) .txt
字号:
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 + -