运行了一个例子 截图~~~ 但是没有效果
图片 不知道为什么上不来[ 本帖最后由 诸葛修勤 于 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