从窗口客户区的左上角向右下角下滑,在下滑过程中,三角形做逆时钟旋转,到达右下角时,正好以一条底边和客户区边框重合并停止,在改变窗口大小时,停止三角形的下落,重新从左上角开始下落。

解决方案 »

  1.   


    #include <windows.h>
    #include <math.h>#define   PI   3.1415926
    #define   ID_TIMER   1000LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    void DrawTriangle(HDC hdc,int r,int angle);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
    {
    static TCHAR szAppName[] = TEXT("Triangle");
    HWND         hWnd;
    MSG  msg;
    WNDCLASS     wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName; if (!RegisterClass (&wndclass))
    {
    MessageBox(NULL,TEXT("窗口类注册失败!"),szAppName,MB_ICONERROR);
    return 0;
    } hWnd = CreateWindow(szAppName,TEXT("旋转的三角形"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,
    CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,NULL,hInstance,NULL);
    ShowWindow(hWnd,iCmdShow);
    UpdateWindow(hWnd); while (GetMessage(&msg,NULL,0,0) )
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.wParam ;
    }LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    HDC hdc,hMem;
    HBITMAP     hBitmap;
    PAINTSTRUCT ps;
    RECT        rect;
    BOOL        back;
    static  int    r,angle;
    static  POINT  pos;
    static  int    width,height;
    static  double grade;      
    switch ( message )
    {
    case WM_SIZE:
    GetClientRect(hWnd,&rect);
    width  = rect.right  - rect.left;
    height = rect.bottom - rect.top;
    r      = (int)(sqrt(pow((double)width,2.0) + pow((double)height,2.0)) / 20.0);
    angle  = 0;
    grade  = atan((double)height / width);
    pos.x  = pos.y = r;
    return 0;
    case WM_CREATE:
    SetTimer(hWnd,ID_TIMER,100,NULL);
    return 0;
    case WM_TIMER:
    angle = (angle + 20) % 360;
    pos.x += r * 0.5 * cos(grade);
    pos.y += r * 0.5 * sin(grade);
    InvalidateRect(hWnd,NULL,FALSE);
    return 0; case WM_PAINT:
    hdc = BeginPaint(hWnd,&ps);
    GetClientRect(hWnd,&rect);

    hBitmap = CreateCompatibleBitmap(hdc,width,height);
    hMem    = CreateCompatibleDC(hdc);
    SelectObject(hMem,hBitmap); SelectObject(hMem,GetStockObject(BLACK_BRUSH));
    Rectangle(hMem,rect.left,rect.top,rect.right,rect.bottom); SetMapMode(hMem,MM_ANISOTROPIC);
    SetViewportExtEx(hMem,width,height,NULL);
    SetWindowExtEx(hMem,width,-height,NULL); back = FALSE;
    if (pos.x + r * 0.866 > width || pos.y + r * 0.5 > height) 
    {
    //pos.x = width - r * 0.866;
    //pos.y = height - r * 0.5;
    angle = 0;
    back  = TRUE;
    }
    SetViewportOrgEx(hMem,pos.x,pos.y,NULL); DrawTriangle(hMem,r,angle); SetMapMode(hMem,MM_TEXT);
    SetViewportOrgEx(hMem,0,0,NULL); BitBlt(hdc,0,0,width,height,hMem,0,0,SRCCOPY); DeleteDC(hMem);
    DeleteObject(hBitmap);
    EndPaint(hWnd,&ps);
    if (back)
    {
    pos.x = pos.y = r;
    angle = 0;
    Sleep(500);
    }
    return 0; case WM_DESTROY :
    PostQuitMessage(0);
    return 0;
    }
    return DefWindowProc(hWnd,message,wParam,lParam);
    }void DrawTriangle(HDC hdc,int r,int angle)
    {
    POINT   A,B,C;
    HPEN    hPen;
    HBRUSH  hBrush; A.x = (long)(r * cos(((90 + angle)  % 360) * PI / 180));
    A.y = (long)(r * sin(((90 + angle)  % 360) * PI / 180)); B.x = (long)(r * cos(((210 + angle) % 360) * PI / 180));
    B.y = (long)(r * sin(((210 + angle) % 360) * PI / 180)); C.x = (long)(r * cos(((330 + angle) % 360) * PI / 180));
    C.y = (long)(r * sin(((330 + angle) % 360) * PI / 180)); hPen = CreatePen(PS_SOLID,1,RGB(255,255,0));
    hBrush = CreateSolidBrush(RGB(255,255,0));
    SelectObject(hdc,hPen);
    SelectObject(hdc,hBrush); MoveToEx(hdc,A.x,A.y,NULL);
    LineTo(hdc,B.x,B.y);
    LineTo(hdc,C.x,C.y);
    LineTo(hdc,A.x,A.y);
    FloodFill(hdc,0,0,RGB(255,255,0)); DeleteObject(SelectObject(hdc,GetStockObject(WHITE_BRUSH)));
    DeleteObject(SelectObject(hdc,GetStockObject(GRAY_BRUSH)));
    }