运行了一个例子 截图~~~ 但是没有效果
图片 不知道为什么上不来
[ 本帖最后由 诸葛修勤 于 2011-8-13 17:31 编辑 ]
程序代码:;MASMPlus 代码模板 - 普通的 Windows 程序代码
.386
.model flat, stdcall
option casemap:none
include windows.inc
include gdi32.inc
includelib gdi32.lib
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
ICO_MAIN equ 1000
.data?
hInstance dd ?
hWin1 dd ?
hWin2 dd ?
.const
szText db 'yu xun feng yi ding ke yi zuo dao geng hao', 0
szClassName1 db 'the first name', 0
szClassName2 db 'the second name', 0
szClassCaption db 'title name...', 0
.code
ProcTimer proc _hWnd, _uMsg, _wParam, _lParam
local @hDc1, @hDc2
local @stRect:RECT
invoke GetDC, hWin1
mov @hDc1, eax
invoke GetDC, hWin2
mov @hDc2, eax
invoke GetClientRect, hWin1, addr @stRect
invoke BitBlt, @hDc2, 0, 0, @stRect.right, @stRect.bottom,\
@hDc1, 0, 0, SRCCOPY
invoke ReleaseDC, hWin1, @hDc1
invoke ReleaseDC, hWin2, @hDc2
ret
ProcTimer endp
WndProc_ proc uses esi edi edx, hWnd, uMsg, wParam, lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax, uMsg
mov ecx, hWnd
.if eax == WM_CLOSE
invoke PostQuitMessage, NULL
invoke DestroyWindow, hWnd
.elseif eax == WM_PAINT && ecx == hWin1
invoke BeginPaint, hWnd, addr @stPs
mov @hDc, eax
invoke GetClientRect, hWnd, addr @stRect
invoke DrawText, @hDc, addr szText, -1, \
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint, hWnd, addr @stPs
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WndProc_ endp
WinMain_ proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
local @hTimer
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke RtlZeroMemory, addr @stWndClass, sizeof WNDCLASSEX
invoke LoadIcon, hInstance, ICO_MAIN
mov @stWndClass.hIcon, eax
invoke LoadCursor, hInstance, IDC_ARROW
mov @stWndClass.hCursor, eax
mov @stWndClass.cbSize, sizeof WNDCLASSEX
mov @stWndClass.style, CS_VREDRAW or CS_HREDRAW
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.hbrBackground, COLOR_WINDOW+1
mov @stWndClass.lpfnWndProc, offset WndProc_
mov @stWndClass.lpszClassName, offset szClassName1
invoke RegisterClassEx, addr @stWndClass
invoke CreateWindowEx,WS_EX_CLIENTEDGE, offset szClassName1,\
offset szClassCaption, WS_OVERLAPPEDWINDOW,\
100, 100, 300, 300,\
NULL, NULL, hInstance, NULL
mov hWin1, eax
invoke ShowWindow, hWin1, SW_SHOWNORMAL
invoke UpdateWindow, hWin1
mov @stWndClass.lpszClassName, offset szClassName2
invoke RegisterClassEx, addr @stWndClass
invoke CreateWindowEx, WS_EX_CLIENTEDGE, offset szClassName2,\
offset szClassCaption, WS_OVERLAPPEDWINDOW,\
450, 100, 300, 300,\
NULL, NULL, hInstance, NULL
mov hWin2, eax
invoke ShowWindow, hWin2, SW_SHOWNORMAL
invoke UpdateWindow, hWin1
invoke SetTimer, NULL, NULL, 100, addr ProcTimer
mov @hTimer, eax
.while TRUE
invoke GetMessage, addr @stMsg, 0, 0, 0
.break .if eax == 0
invoke TranslateMessage, addr @stMsg
invoke DispatchMessage, addr @stMsg
.endw
invoke KillTimer, NULL, @hTimer
ret
WinMain_ endp
Begin:
invoke WinMain_
invoke ExitProcess, NULL
end Begin
程序代码:;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 3rd Edition>
; by 罗云彬, http://www.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; DcCopy.asm
; 测试设备环境的代码,将一个窗口 DC 对应的象素拷贝到另一个窗口中
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff DcCopy.asm
; Link /subsystem:windows DcCopy.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ID_TIMER equ 1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWin1 dd ?
hWin2 dd ?
.const
szClass1 db 'SourceWindow',0
szClass2 db 'DestWindow',0
szCaption1 db '请尝试用别的窗口覆盖本窗口!',0
szCaption2 db '本窗口图像拷贝自另一窗口',0
szText db 'Win32 Assembly, Simple and powerful !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 定时器过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcTimer proc _hWnd,uMsg,_idEvent,_dwTime
local @hDc1,@hDc2
local @stRect:RECT
invoke GetDC,hWin1
mov @hDc1,eax
invoke GetDC,hWin2
mov @hDc2,eax
invoke GetClientRect,hWin1,addr @stRect
invoke BitBlt,@hDc2,0,0,@stRect.right,@stRect.bottom,\
@hDc1,0,0,SRCCOPY
invoke ReleaseDC,hWin1,@hDc1
invoke ReleaseDC,hWin2,@hDc2
ret
_ProcTimer endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg
mov ecx,hWnd
;********************************************************************
.if eax == WM_PAINT && ecx == hWin1
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax
invoke GetClientRect,hWnd,addr @stRect
invoke DrawText,@hDc,addr szText,-1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd,addr @stPs
;********************************************************************
.elseif eax == WM_CLOSE
invoke PostQuitMessage,NULL
invoke DestroyWindow,hWin1
invoke DestroyWindow,hWin2
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret
_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
local @hTimer
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
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClass1
invoke RegisterClassEx,addr @stWndClass
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClass1,offset szCaption1,\
WS_OVERLAPPEDWINDOW,\
450,100,300,300,\
NULL,NULL,hInstance,NULL
mov hWin1,eax
invoke ShowWindow,hWin1,SW_SHOWNORMAL
invoke UpdateWindow,hWin1
;********************************************************************
mov @stWndClass.lpszClassName,offset szClass2
invoke RegisterClassEx,addr @stWndClass
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClass2,offset szCaption2,\
WS_OVERLAPPEDWINDOW,\
100,100,300,300,\
NULL,NULL,hInstance,NULL
mov hWin2,eax
invoke ShowWindow,hWin2,SW_SHOWNORMAL
invoke UpdateWindow,hWin2
;********************************************************************
; 设置定时器
;********************************************************************
invoke SetTimer,NULL,NULL,100,addr _ProcTimer
mov @hTimer,eax
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
;********************************************************************
; 清除定时器
;********************************************************************
invoke KillTimer,NULL,@hTimer
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start