当前位置: 代码迷 >> 汇编语言 >> 关于罗云彬的《windows环境下32位汇编语言程序设计》的DcCopy例子,该怎么解决
  详细解决方案

关于罗云彬的《windows环境下32位汇编语言程序设计》的DcCopy例子,该怎么解决

热度:8401   发布时间:2013-02-26 00:00:00.0
关于罗云彬的《windows环境下32位汇编语言程序设计》的DcCopy例子
怎么这个例子没有书中介绍的那种效果啊?我用别的窗口覆盖右边的程序窗口,左边的那个根本就没有反应啊
有高手介绍一下为什么?
源代码如下
Assembly code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Sample code for < Win32ASM Programming 2nd Edition>; by 罗云彬, http://asm.yeah.net;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; DcCopy.asm; 测试设备环境的代码,将一个窗口 DC 对应的象素拷贝到另一个窗口中;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 使用 nmake 或下列命令进行编译和链接:; ml /c /coff DcCopy.asm; Link /subsystem:windows DcCopy.obj;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        .386        .model flat,stdcall        option casemap:none;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Include 文件定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>include        windows.incinclude        gdi32.incincludelib    gdi32.libinclude        user32.incincludelib    user32.libinclude        kernel32.incincludelib    kernel32.lib;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ID_TIMER    equ    1;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        .data?hInstance    dd        ?hWin1        dd        ?hWin2        dd        ?        .constszClass1    db    'SourceWindow',0szClass2    db    'DestWindow',0szCaption1    db    '请尝试用别的窗口覆盖本窗口!',0szCaption2    db    '本窗口图像拷贝自另一窗口',0szText        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
  相关解决方案