#include "stdafx.h"
int g_xs=100;
int g_ys=100;
int LEFTS=1;
int RIGHTS=0;
int TOPS=1;
int BOTTOMS=0;
HINSTANCE g_hInstance;
#define LEN 100void OnPaints(HWND hWnd)
{
    HDC hDC=GetDC(NULL);
    HPEN nPen=CreatePen(PS_DASH,6,RGB(192,168,026));
    HGDIOBJ nOldPen = SelectObject(hDC,nPen);
    HBRUSH nBrush2 = CreateHatchBrush(HS_HORIZONTAL,RGB(87,11,11));
    HGDIOBJ nOldBrush2 = SelectObject(hDC, nBrush2);
    Ellipse(hDC,g_xs,g_ys,g_xs+LEN,g_ys+LEN);
SelectObject(hDC,nOldBrush2);
    DeleteObject(nBrush2);
    SelectObject(hDC,nOldPen);
    DeleteObject(nPen);
    //SetBkMode( hDC, TRANSPARENT );
ReleaseDC(hWnd,hDC);
}void OnTimer(HWND hWnd)
{
//HWND hWndc=GetDesktopWindow(VOID);
RECT rect={0};
    GetWindowRect( hWnd, &rect );
    if(g_xs>=rect.right)
    {
        RIGHTS=1;
        LEFTS=0;
    }
    if(g_xs<=rect.left)
    {
        RIGHTS=0;
        LEFTS=1;
    }
    if(g_ys>=rect.bottom)
    {
        TOPS=0;
        BOTTOMS=1;
    }
    if(g_ys<=rect.top)
    {
        TOPS=1;
        BOTTOMS=0;
    }
    if(LEFTS) g_xs += 5;
    if(RIGHTS) g_xs -= 5;
    if(TOPS) g_ys += 5;
    if(BOTTOMS) g_ys -= 5;
InvalidateRect(hWnd,NULL,TRUE);
}
void OnSetTimer(HWND hWnd)
{
SetTimer(hWnd,1,15,NULL);
}LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam ){
switch( uMsg ){
case WM_CREATE:
    OnSetTimer(hWnd);
break;
case WM_TIMER:
OnTimer(hWnd);
break;
case WM_PAINT:
OnPaints(hWnd);
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
}
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}BOOL Register( LPSTR pszClassName,WNDPROC pszWndProc)
{
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof( wce );
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_GRAYTEXT+2);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInstance;
wce.lpfnWndProc = pszWndProc;
wce.lpszClassName = pszClassName;
wce.lpszMenuName =NULL;
wce.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
ATOM nAtom = RegisterClassEx( &wce );
if( nAtom == 0 )
{
return FALSE;
}
return TRUE;
}HWND Create( LPSTR pszClassName, LPSTR pszWndName )
{
HWND hWnd = CreateWindowEx( 0, pszClassName, pszWndName,
WS_OVERLAPPEDWINDOW, 
CW_USEDEFAULT, CW_USEDEFAULT, 
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, g_hInstance, NULL );
return hWnd;
}void Display( HWND hWnd )
{
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );
}void Message()
{
MSG nMsg = {0};
while( GetMessage( &nMsg, NULL, 0, 0 ) )
{
TranslateMessage( &nMsg );
DispatchMessage( &nMsg );
}
}int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
g_hInstance = hInstance;
BOOL nRet = Register("Main",(WNDPROC)WindowProc);
if(nRet==0)
{
MessageBox(NULL, "Register failed", "Infor", MB_OK);
return 0;
}
HWND hMain = Create("Main", "main window");
Display(hMain);
Message();
return 0;
}

解决方案 »

  1.   

    在你要进行下一次重画的时候,先建立一个背景颜色的画刷,把上次的小球的坐标保存了,用背景颜色画了,再选择新的颜色,画新的小球,那样以前的小球就看不到了。
    Ellipse(hDC,g_xs,g_ys,g_xs+LEN,g_ys+LEN);
      

  2.   

    如果只在客服区移动,为什么不需要重新上色?用while循环保存上一次坐标与重新画啊(我怎么保存与使用新的坐标呀)?
      

  3.   


    #include "stdafx.h"
    int g_xs=100;
    int g_ys=100;
    int LEFTS=1;
    int RIGHTS=0;
    int TOPS=1;
    int BOTTOMS=0;
    HINSTANCE g_hInstance;
    #define LEN 100void OnPaints(HWND hWnd)
    {
    PAINTSTRUCT ps;
        HDC hDC=BeginPaint(hWnd, &ps);
        HPEN nPen=CreatePen(PS_DASH,6,RGB(192,168,026));
        HGDIOBJ nOldPen = SelectObject(hDC,nPen);
        HBRUSH nBrush2 = CreateHatchBrush(HS_HORIZONTAL,RGB(87,11,11));
        HGDIOBJ nOldBrush2 = SelectObject(hDC, nBrush2);
        Ellipse(hDC,g_xs,g_ys,g_xs+LEN,g_ys+LEN);
        SelectObject(hDC,nOldBrush2);
        DeleteObject(nBrush2);
        SelectObject(hDC,nOldPen);
        DeleteObject(nPen);
           //SetBkMode( hDC, TRANSPARENT );
        ReleaseDC(hWnd,hDC);
    EndPaint(hWnd, &ps);
    }void OnTimer(HWND hWnd)
    {
        //HWND hWndc=GetDesktopWindow(VOID);
        RECT rect={0};
        GetWindowRect( hWnd, &rect );
        if(g_xs>=rect.right)
        {
            RIGHTS=1;
            LEFTS=0;
        }
        if(g_xs<=rect.left)
        {
            RIGHTS=0;
            LEFTS=1;
        }
        if(g_ys>=rect.bottom)
        {
            TOPS=0;
            BOTTOMS=1;
        }
        if(g_ys<=rect.top)
        {
            TOPS=1;
            BOTTOMS=0;
        }
        if(LEFTS) g_xs += 5;
        if(RIGHTS) g_xs -= 5;
        if(TOPS) g_ys += 5;
        if(BOTTOMS) g_ys -= 5;
        InvalidateRect(hWnd,NULL,TRUE);
    }
    void OnSetTimer(HWND hWnd)
    {
        SetTimer(hWnd,1,15,NULL);
    }LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg,
                            WPARAM wParam, LPARAM lParam ){
        switch( uMsg ){
        case WM_CREATE:
            OnSetTimer(hWnd);
            break;
        case WM_TIMER:
            OnTimer(hWnd);
            break;
        case WM_PAINT:
            OnPaints(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage( 0 );
            break;
        }
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }BOOL Register( LPSTR pszClassName,WNDPROC pszWndProc)
    {
        WNDCLASSEX wce = { 0 };
        wce.cbSize = sizeof( wce );
        wce.cbClsExtra = 0;
        wce.cbWndExtra = 0;
        wce.hbrBackground = (HBRUSH)(COLOR_GRAYTEXT+2);
        wce.hCursor = NULL;
        wce.hIcon = NULL;
        wce.hIconSm = NULL;
        wce.hInstance = g_hInstance;
        wce.lpfnWndProc = pszWndProc;
        wce.lpszClassName = pszClassName;
        wce.lpszMenuName =NULL;
        wce.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
        ATOM nAtom = RegisterClassEx( &wce );
        if( nAtom == 0 )
        {
            return FALSE;
        }
        return TRUE;
    }HWND Create( LPSTR pszClassName, LPSTR pszWndName )
    {
        HWND hWnd = CreateWindowEx( 0, pszClassName, pszWndName,
                        WS_OVERLAPPEDWINDOW, 
                        CW_USEDEFAULT, CW_USEDEFAULT, 
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, g_hInstance, NULL );
        return hWnd;
    }void Display( HWND hWnd )
    {
        ShowWindow( hWnd, SW_SHOW );
        UpdateWindow( hWnd );
    }void Message()
    {
        MSG nMsg = {0};
        while( GetMessage( &nMsg, NULL, 0, 0 ) )
        {
            TranslateMessage( &nMsg );
            DispatchMessage( &nMsg );
        }
    }int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
         // TODO: Place code here.
        g_hInstance = hInstance;
        BOOL nRet = Register("Main",(WNDPROC)WindowProc);
        if(nRet==0)
        {
            MessageBox(NULL, "Register failed", "Infor", MB_OK);
            return 0;
        }
        HWND hMain = Create("Main", "main window");
        Display(hMain);
        Message();
        return 0;
    }
      

  4.   

    SetTimer(hWnd,1,15,NULL);
    太快了!
      

  5.   

    void OnPaints(HWND hWnd)
    {
        PAINTSTRUCT ps;    
        HDC hDC=BeginPaint(hWnd, &ps);
    //    HDC hDC=GetDC(NULL);
        HPEN nPen=CreatePen(PS_DASH,6,RGB(192,168,026));
        HGDIOBJ nOldPen = SelectObject(hDC,nPen);
        HBRUSH nBrush2 = CreateHatchBrush(HS_HORIZONTAL,RGB(87,11,11));
        HGDIOBJ nOldBrush2 = SelectObject(hDC, nBrush2);
        Ellipse(hDC,g_xs,g_ys,g_xs+LEN,g_ys+LEN);
        SelectObject(hDC,nOldBrush2);
        DeleteObject(nBrush2);
        SelectObject(hDC,nOldPen);
        DeleteObject(nPen);
           //SetBkMode( hDC, TRANSPARENT );
        ReleaseDC(hWnd,hDC);
        EndPaint(hWnd, &ps);}
    红的是你的和3楼的差别,你的其实没有绘出了!
      

  6.   

    void OnTimer(HWND hWnd)
    {
        //HWND hWndc=GetDesktopWindow(VOID);
        RECT rect={0};
        GetWindowRect( hWnd, &rect );
    得到的不是客户区。
    case WM_PAINT:
            OnPaints(hWnd);
            break;
    只能绘制客户区,WM_NCPAINT才是非客户区。
    不知道你把园画到外面干什么?
      

  7.   

    要在桌面上移动 必须:
    1》画Ball前把ball下的位图取出保存。
    2》画ball。
    3》恢复ball下的位图。
    4》取新的ball下的位图。
      

  8.   

    我给你特别做了个。
    1》他是一个在桌面上移动的窗口(a red ball),(不是移动的图)。
    2》在桌面上移动,使用位图的办法难解决ball内闪烁的问题,因为有个ball内背景被恢复的问题。
    3》本程序 用左键点击这个 ball 可以‘停止或移动’,点击右键退出程序。// DeskBall.cpp : Defines the entry point for the application.
    //#include "stdafx.h"#define BALL_SIZE 60
    #define MOVING_STEP 2
    #define TIME 20int LEFTS=1;
    int RIGHTS=0;
    int TOPS=1;
    int BOTTOMS=0;HINSTANCE g_hInstance;
    int  g_DeskWid;
    int  g_DeskHei;void SetupRegion(HWND hWnd)
    {
    RECT rc;
    HRGN wndRgn, rgnTemp; HDC pDC = GetDC(hWnd);
    GetWindowRect(hWnd,&rc); //
    wndRgn=CreateRectRgn(0, 0, BALL_SIZE, BALL_SIZE);
    rgnTemp=CreateEllipticRgn(0, 0, BALL_SIZE, BALL_SIZE);
    CombineRgn(wndRgn, wndRgn, rgnTemp, RGN_AND);// minimun
    //
    SetWindowRgn(hWnd , wndRgn, TRUE);
    DeleteObject(wndRgn);
    DeleteObject(rgnTemp);
    }//char Prompt[80];
    void OnTimer(HWND hWnd)
    {
    RECT rc;
    GetWindowRect(hWnd, &rc); if(rc.right >= g_DeskWid )
        {
            RIGHTS=1;// arrive at
            LEFTS=0;
        }
        if(rc.left < 0)
        {
    // sprintf(Prompt,"X=%d;Y=%d\r\n",g_xs,g_ys);
    // OutputDebugString(Prompt);
            RIGHTS=0;
            LEFTS=1;// arrive at
        }
        if(rc.bottom >= g_DeskHei)
        {
            TOPS=0;
            BOTTOMS=1;// arrive at
        }
        if(rc.top <0 )
        {
            TOPS=1;// arrive at
            BOTTOMS=0;
        }
    //
        if(LEFTS)
    {
    rc.left  += MOVING_STEP; rc.right += MOVING_STEP;
    }
        if(RIGHTS)
    {
    rc.left  -= MOVING_STEP; rc.right -= MOVING_STEP;
    }
        if(TOPS)
    {
    rc.top += MOVING_STEP; rc.bottom += MOVING_STEP;
    }
        if(BOTTOMS)
    {
    rc.top -= MOVING_STEP; rc.bottom -= MOVING_STEP;
    }
    MoveWindow(hWnd,rc.left,rc.top, rc.right-rc.left, rc.bottom-rc.top,TRUE);
    }void OnSetTimer(HWND hWnd)
    {
        SetTimer(hWnd,1,TIME,NULL);
    }
    //
    LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
        switch( uMsg )
    {
        case WM_CREATE:
    {
    g_DeskWid=GetSystemMetrics(SM_CXSCREEN);
    g_DeskHei=GetSystemMetrics(SM_CYSCREEN);
    //
    SetupRegion(hWnd);
    //
    OnSetTimer(hWnd);
            break;
    }
    case WM_ERASEBKGND:
    {// draw the ball
    HDC hdc = (HDC) wParam;
    HRGN rgnTemp=CreateRectRgn(0,0,0,0);
    GetWindowRgn(hWnd,rgnTemp);
    HBRUSH br=0;
    br=CreateSolidBrush(RGB(255,0,0));
    ::FillRgn(hdc,rgnTemp,br);
    DeleteObject(rgnTemp);
    DeleteObject(br);
    ReleaseDC(hWnd,hdc);
    }
    return 0;
        case WM_TIMER:
            OnTimer(hWnd);
    return 0;
        case WM_LBUTTONDOWN:
    {// stop or start moving
    static BOOL sw=FALSE;
    sw = ~sw;
    if(sw) KillTimer(hWnd,1);
    else   SetTimer(hWnd,1,30,0);
    }
    return 0;
    case WM_RBUTTONDOWN:// exit
    KillTimer(hWnd,1);
     // full through
    case WM_DESTROY:
    PostQuitMessage( 0 );
            break;
        }
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }
    //
    BOOL Register( LPSTR pszClassName,WNDPROC pszWndProc)
    {
        WNDCLASSEX wce = { 0 };
        wce.cbSize = sizeof( wce );
        wce.cbClsExtra = 0;
        wce.cbWndExtra = 0;
        wce.hbrBackground = (HBRUSH)(COLOR_GRAYTEXT+2);
        wce.hCursor = NULL;
        wce.hIcon = NULL;
        wce.hIconSm = NULL;
        wce.hInstance = g_hInstance;
        wce.lpfnWndProc = pszWndProc;
        wce.lpszClassName = pszClassName;
        wce.lpszMenuName =NULL;
        wce.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
        ATOM nAtom = RegisterClassEx( &wce );
    //
        return TRUE;
    }//
    HWND Create( LPSTR pszClassName, LPSTR pszWndName )
    {
        HWND hWnd = CreateWindowEx( 0, pszClassName, pszWndName,
                        WS_VISIBLE | WS_POPUP, 
                        0, 0, BALL_SIZE, BALL_SIZE,
                        NULL, NULL, g_hInstance, NULL );
        return hWnd;
    }void Display( HWND hWnd )
    {
       ShowWindow( hWnd, SW_SHOW );
       UpdateWindow( hWnd );
    }void Message()
    {
        MSG nMsg = {0};
        while( GetMessage( &nMsg, NULL, 0, 0 ) )
        {
            TranslateMessage( &nMsg );
            DispatchMessage( &nMsg );
        }
    }
    //
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        g_hInstance = hInstance;
    //
        BOOL nRet = Register("Main",(WNDPROC)WindowProc);
        if(nRet==0)
        {
            MessageBox(NULL, "Register failed", "Infor", MB_OK);
            return 0;
        }
        HWND hMain = Create("Main", "main window");
    //
        Display(hMain);
    //
    Message();
    //
        return 0;
    }
      

  9.   

    另外在客户区移动的代码如下:#include <stdio.h>
    #include <windows.h>//
    int g_xs=0;
    int g_ys=0;
    int LEFTS=1;
    int RIGHTS=0;
    int TOPS=1;
    int BOTTOMS=0;
    HINSTANCE g_hInstance;
    HPEN g_nPen=0;
    HBRUSH g_nBrush2=0;#define PEN 4
    #define LEN (60-PEN)void OnPaints(HWND hWnd)
    {
        PAINTSTRUCT ps;    
        HDC hDC=BeginPaint(hWnd, &ps);
        HGDIOBJ nOldPen = SelectObject(hDC,g_nPen);
        HGDIOBJ nOldBrush2 = SelectObject(hDC, g_nBrush2);
        Ellipse(hDC,g_xs+PEN/2,g_ys+PEN/2,g_xs+LEN,g_ys+LEN);
        SelectObject(hDC,nOldBrush2);
        SelectObject(hDC,nOldPen);
           //SetBkMode( hDC, TRANSPARENT );
        ReleaseDC(hWnd,hDC);
        EndPaint(hWnd, &ps);
    }char Prompt[80];
    void OnTimer(HWND hWnd)
    {
        RECT rect;
    GetClientRect(hWnd, &rect);
        if((g_xs+LEN+PEN/2) >= rect.right)
        {
            RIGHTS=1;// arrive at
            LEFTS=0;
        }
        if((g_xs) <= PEN/2)//rect.left)
        {
    // sprintf(Prompt,"X=%d;Y=%d\r\n",g_xs,g_ys);
    // OutputDebugString(Prompt);
            RIGHTS=0;
            LEFTS=1;// arrive at
        }
        if((g_ys+LEN+PEN/2) >= rect.bottom)
        {
            TOPS=0;
            BOTTOMS=1;// arrive at
        }
        if((g_ys) <= PEN/2)//rect.top)
        {
            TOPS=1;// arrive at
            BOTTOMS=0;
        }
    //
        if(LEFTS) g_xs += 5;
        if(RIGHTS) g_xs -= 5;
        if(TOPS) g_ys += 5;
        if(BOTTOMS) g_ys -= 5;
    InvalidateRect(hWnd,0,TRUE);
    }void OnSetTimer(HWND hWnd)
    {
        SetTimer(hWnd,1,50,NULL);
    }LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
        switch( uMsg )
    {
        case WM_CREATE:
    {
    g_nPen = CreatePen(PS_DASH,PEN,RGB(192,168,026));
    g_nBrush2 = CreateHatchBrush(HS_HORIZONTAL,RGB(87,11,11));
    //
    OnSetTimer(hWnd);
            break;
    }
    case WM_ERASEBKGND:
    {
    HDC hdc = (HDC) wParam;
    // new ball does not need erase back ground !
    RECT rect;
    GetClientRect(hWnd,&rect);
    HRGN rgnTemp;  
    rgnTemp=::CreateRectRgn(0,0,rect.right-rect.left,rect.bottom-rect.top);
    //new ball
    HRGN wndRgn;
    wndRgn=::CreateEllipticRgn(g_xs,g_ys,g_xs+LEN,g_ys+LEN);
    //
    CombineRgn(rgnTemp, rgnTemp, wndRgn, RGN_XOR);//RGN_DIFF);
    FillRgn(hdc,rgnTemp,(HBRUSH)GetStockObject(BLACK_BRUSH));
    // free
    DeleteObject(rgnTemp);
    DeleteObject(wndRgn);
    }
    return 0;
        case WM_TIMER:
            OnTimer(hWnd);
            break;
        case WM_PAINT:
            OnPaints(hWnd);
            break;
        case WM_DESTROY:
    DeleteObject(g_nPen);
      DeleteObject(g_nBrush2);
    PostQuitMessage( 0 );
            break;
        }
        return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }BOOL Register( LPSTR pszClassName,WNDPROC pszWndProc)
    {
        WNDCLASSEX wce = { 0 };
        wce.cbSize = sizeof( wce );
        wce.cbClsExtra = 0;
        wce.cbWndExtra = 0;
        wce.hbrBackground = (HBRUSH)(COLOR_GRAYTEXT+2);
        wce.hCursor = NULL;
        wce.hIcon = NULL;
        wce.hIconSm = NULL;
        wce.hInstance = g_hInstance;
        wce.lpfnWndProc = pszWndProc;
        wce.lpszClassName = pszClassName;
        wce.lpszMenuName =NULL;
        wce.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
        ATOM nAtom = RegisterClassEx( &wce );
        if( nAtom == 0 )
        {
            return FALSE;
        }
        return TRUE;
    }HWND Create( LPSTR pszClassName, LPSTR pszWndName )
    {
        HWND hWnd = CreateWindowEx( 0, pszClassName, pszWndName,
                        WS_OVERLAPPEDWINDOW, 
                        CW_USEDEFAULT, CW_USEDEFAULT, 
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, g_hInstance, NULL );
        return hWnd;
    }void Display( HWND hWnd )
    {
       ShowWindow( hWnd, SW_SHOW );
       UpdateWindow( hWnd );
    }void Message()
    {
        MSG nMsg = {0};
        while( GetMessage( &nMsg, NULL, 0, 0 ) )
        {
            TranslateMessage( &nMsg );
            DispatchMessage( &nMsg );
        }
    }int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
         // TODO: Place code here.
        g_hInstance = hInstance;
        BOOL nRet = Register("Main",(WNDPROC)WindowProc);
        if(nRet==0)
        {
            MessageBox(NULL, "Register failed", "Infor", MB_OK);
            return 0;
        }
        HWND hMain = Create("Main", "main window");
        Display(hMain);
        Message();
        return 0;
    }
    重点是如何消除ball内闪烁!
      

  10.   

    #include "stdafx.h"
    #pragma comment(lib,"Msimg32.lib")int g_xs=100;
    int g_ys=100;
    int LEFTS=1;
    int RIGHTS=0;
    int TOPS=1;
    int BOTTOMS=0;
    HINSTANCE g_hInstance;
    int cxClient, cyClient, LEN;
    HBITMAP hBitmap, hBitmapScr;
    int gxs, gys, MOVE;
    void OnSize(HWND hWnd)
    {
    cxClient = GetSystemMetrics (SM_CXSCREEN);
    cyClient = GetSystemMetrics (SM_CYSCREEN);
    LEN      = min (cxClient / 8, cyClient / 8);
    MOVE     = LEN / 4; HDC hdc       = GetDC(hWnd);
    HDC hdcMem    = CreateCompatibleDC (hdc);
    hBitmap       = CreateCompatibleBitmap (hdc, LEN , LEN);
    HDC hdcMemScr = CreateCompatibleDC (hdc);
    hBitmapScr    = CreateCompatibleBitmap (hdc, LEN , LEN);
    ReleaseDC(hWnd,hdc); SelectObject (hdcMem, hBitmap);
    SelectObject (hdcMemScr, hBitmapScr);
    Rectangle (hdcMem, -1, -1, LEN + 1, LEN + 1); HBRUSH nBrush2 = CreateHatchBrush(HS_DIAGCROSS,0L);
    SelectObject(hdcMem, nBrush2);
    SetBkColor (hdcMem, RGB (255,0,255));
    Ellipse(hdcMem,0,0,LEN,LEN); DeleteObject(nBrush2);
    DeleteDC (hdcMem);
    DeleteDC (hdcMemScr);
    }void OnTimer(HWND hWnd)
    {
    if (hBitmap)
    {
    HWND hWndc    = GetDesktopWindow();
    HDC hdc       = GetDC (hWndc);
    HDC hdcMem    = CreateCompatibleDC (hdc);
    HDC hdcMemScr = CreateCompatibleDC (hdc);        SelectObject (hdcMem, hBitmap);
        SelectObject (hdcMemScr, hBitmapScr); if (!(g_xs == 100 && g_ys == 100 )){
    BitBlt (hdc, gxs,gys,
        LEN, LEN,hdcMemScr, 0, 0, SRCCOPY);
    }
    BitBlt (hdcMemScr, 0, 0, LEN, LEN,
        hdc, g_xs, g_ys, SRCCOPY); TransparentBlt (hdc, g_xs, g_ys, LEN, LEN,
        hdcMem, 0, 0, LEN, LEN, RGB (255,255,255)); DeleteDC  (hdcMem);
    DeleteDC  (hdcMemScr);
    ReleaseDC (hWndc, hdc); RECT rect;
    GetClientRect( hWndc, &rect );
    if(g_xs>=rect.right-LEN)
    {
    RIGHTS=1;
    LEFTS=0;
    }
    if(g_xs<=rect.left)
    {
    RIGHTS=0;
    LEFTS=1;
    }
    if(g_ys>=rect.bottom-LEN)
    {
    TOPS=0;
    BOTTOMS=1;
    }
    if(g_ys<=rect.top)
    {
    TOPS=1;
    BOTTOMS=0;
    }
    gxs = g_xs;
    gys = g_ys;
    if(LEFTS)   g_xs += MOVE;
    if(RIGHTS)  g_xs -= MOVE;
    if(TOPS)    g_ys += MOVE;
    if(BOTTOMS) g_ys -= MOVE;
    }
    }
    void OnSetTimer(HWND hWnd)
    {
    SetTimer(hWnd,1,50,NULL);
    }LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg,
    WPARAM wParam, LPARAM lParam )
    {
    switch( uMsg )
    {
    case WM_CREATE:
    OnSetTimer(hWnd);
    break;
    case WM_SIZE:
    OnSize(hWnd);
    break;
    case WM_TIMER:
    OnTimer(hWnd);
    break;
    case WM_DESTROY:
    if (hBitmap)
    DeleteObject (hBitmap);
    if (hBitmapScr)
    DeleteObject (hBitmapScr);
    KillTimer (hWnd,1);
    PostQuitMessage( 0 );
    break;
    }
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }BOOL Register( LPCWSTR pszClassName,WNDPROC pszWndProc)
    {
    WNDCLASSEX wce = { 0 };
    wce.cbSize = sizeof( wce );
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.hbrBackground = (HBRUSH)(COLOR_GRAYTEXT);
    wce.hCursor = NULL;
    wce.hIcon = NULL;
    wce.hIconSm = NULL;
    wce.hInstance = g_hInstance;
    wce.lpfnWndProc = pszWndProc;
    wce.lpszClassName = pszClassName;
    wce.lpszMenuName =NULL;
    wce.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
    ATOM nAtom = RegisterClassEx( &wce );
    if( nAtom == 0 )
    {
    return FALSE;
    }
    return TRUE;
    }HWND Create( LPCWSTR pszClassName, LPCWSTR pszWndName )
    {
    HWND hWnd = CreateWindowEx( 0, pszClassName, pszWndName,
    WS_OVERLAPPEDWINDOW, 
    CW_USEDEFAULT, CW_USEDEFAULT, 
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, g_hInstance, NULL );
    return hWnd;
    }void Display( HWND hWnd )
    {
    ShowWindow( hWnd, SW_SHOWMINIMIZED);
    UpdateWindow( hWnd );
    }void Message()
    {
    MSG nMsg = {0};
    while( GetMessage( &nMsg, NULL, 0, 0 ) )
    {
    TranslateMessage( &nMsg );
    DispatchMessage( &nMsg );
    }
    }int APIENTRY WinMain(HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPSTR     lpCmdLine,
     int       nCmdShow)
    {
    // TODO: Place code here.
    g_hInstance = hInstance;
    BOOL nRet = Register(TEXT("Main"),(WNDPROC)WindowProc);
    if(nRet==0)
    {
    MessageBox(NULL, TEXT("Register failed"), TEXT("Infor"), MB_OK);
    return 0;
    }
    HWND hMain = Create(TEXT("Main"), TEXT("main window"));
    Display(hMain);
    Message();
    return 0;
    }
    按照LZ的算法做一些修改