2011-11-21 15 views
0

多くの四角形のモーションをアニメーション化したいと思います。この例では、2つの正方形を作成します。私が構築して実行すると、私はそれらの2つの正方形を見ることができますが、彼らは動いていません。GDIを使用したアニメーション化C++

私は正方形の

#pragma once 
#include <windows.h> 

class Square { 


private: 
    int x,y; 

    int moveWith_x, moveWith_y; 

public: 
    void DrawSquare(HDC,int,int,int,int); 
    void MoveSquare(int,int); 

    Square(void); 
    ~Square(void); 
}; 

と実装ファイル(ここで私はDrawSquareに四角形機能を使用して四角形を作成する)とMoveSquaresの動きをアニメーション化しようとするを表すクラスを作成しました:私は

#include "Square.h" 

    void Square::DrawSquare(HDC hdc,int rx,int ry, int lx, int ly) { 

     Rectangle(hdc,rx,ry,lx,ly); 
    } 

void Square::MoveSquare(int mod_x_Size,int mod_y_Size) { 

     x=x+ moveWith_x; 
     y=y+ moveWith_y; 

      if (x >= mod_x_Size - 30) { 

       x= mod_x_Size - 30 ; 
       moveWith_x = -moveWith_x++; 
      } 


      if (y >= mod_y_Size -30) { 
        y=mod_y_Size - 30 ; 
       moveWith_y= -moveWith_y++; 
      } 

      if (x < 30) { 

      x=30; 
      moveWith_x= -moveWith_x++; 
      } 

      if (y <30) { 

       y=50; 
       moveWith_y= -moveWith_x++; 
      } 
    } 

Square::Square(void) { 
     x=0; 
     y=0; 

     moveWith_x = 0; 
     moveWith_y = 0; 
    } 

    Square::~Square(void) { 

    } 

をmain.cpp私はタイマーを設定し、与えられた数のod四角形を作成して描画します(白いブラシ付き)

#include <windows.h> 
#include <windowsx.h> 

#include "Square.h" 

#define NUMARUL_DE_FIGURI 2 


LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM); 
void moveObject(int,int); 

    //Coordonatele in caz de redimensionare a ferestrei 
    static int mod_x_Size, mod_y_Size; 

    // Crearea ferestrei de lucru 
HWND hwnd; 

int WINAPI WinMain (HINSTANCE hInt, HINSTANCE,LPSTR,int) { 

char atitle[] = "Drawing with GDI"; 
char className[] = "Main Window"; 

MSG msg; 

// Crearea si initializarea ferestrei principale 
WNDCLASS wnd; 
ZeroMemory(&wnd,sizeof(wnd)); 

wnd.lpfnWndProc = WndProc; 
wnd.hInstance = hInt; 
wnd.hIcon = LoadIcon (NULL,IDI_APPLICATION); 
wnd.hCursor = LoadCursor (NULL,IDC_ARROW); 
wnd.hbrBackground = GetStockBrush (BLACK_BRUSH); 
wnd.lpszClassName = className; 

// Inregistrarea clasei in SO 
RegisterClass (&wnd); 


    // Crearea unui timer 
SetTimer (hwnd, 1, 40, NULL) ; 

hwnd = CreateWindow (className,atitle,WS_OVERLAPPEDWINDOW,200,200,600,600,HWND_DESKTOP,NULL,hInt,NULL); 

//Afisarea ferestrei in mod obisnuit 
ShowWindow (hwnd,SW_SHOWNORMAL); 

// Daca aplicatia primeste mesaj de la SO are loc transmiterea p-u prelucrare 
while (GetMessage(&msg,NULL,0,0)) DispatchMessage(&msg); 

    return 0; 
} 

// Prelucrarea mesajelor 
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { 

    // Structura ce detine informatii despre dispozitivul de desenare 
    PAINTSTRUCT ps; 

    // Descriptorul dispozitivului de desen 
    HDC hdc; 

    Square square[NUMARUL_DE_FIGURI]; 

    // Culoarea figurii 
    HBRUSH shapeColor; 

    switch (msg) { 

// Prelucrarea mesajelor primite la modificarea dimensiunilor ferestrei 
case WM_SIZE :  

     //La fiecare redimensionare a ferestrei se reinnoiesc coordonatele speciale 
     mod_x_Size = LOWORD (lparam) ; 
     mod_y_Size = HIWORD (lparam) ; 
     break ; 

// Prelucrarea mesajelor primite la fiecare interval al timerului 
case WM_TIMER: 

    InvalidateRect (hwnd, NULL, TRUE) ; 

for (int i=0;i<NUMARUL_DE_FIGURI;i++) { 

    square[i].MoveSquare(mod_x_Size, mod_y_Size); 

} 



// Prelucrarea mesajului de desenare 
case WM_PAINT: 

    // Permite desenarea pe dispozitivul de desenare 
    hdc = BeginPaint(hwnd, &ps); 

    // Crearea patratelor 
    for (int i=0;i<NUMARUL_DE_FIGURI;i++) { 

     shapeColor = (HBRUSH)SelectObject(hdc, CreateSolidBrush(RGB(255,255,255))); 

     square[i].DrawSquare(hdc,mod_x_Size-((i*200)+50),mod_y_Size-((i*200)+50),mod_x_Size-((i*20)+100),mod_y_Size-((i*20)+100)); 
    } 

    // 
    //ReleaseDC(hwnd,hdc); 

    // Finiseaza procesul de desenare pe dispozitiv 
    EndPaint(hwnd, &ps); 

    break; 

// Distrugerea ferestrei aplicatiei 
case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 

    default: 
     return DefWindowProc(hwnd, msg, wparam, lparam); 
    } 

    return 0; 
} 

どこが間違っていますか? コードのコメントを私に許してください(それは私の言語です)。

+0

期待どおりに機能しません。 – pezcode

+1

私はこの例では2つの正方形を作成します。私が構築して実行すると、私はそれらの2つの正方形を見ることができますが、彼らは動いていません。とにかくそれは働いていない – develoops

答えて

3
// Crearea unui timer 
SetTimer (hwnd, 1, 40, NULL) ; 

hwnd = CreateWindow (className,atitle,WS_OVERLAPPEDWINDOW,200,200,600,600,HWND_DESKTOP,NULL,hInt,NULL); 

あなたはHWNDにウィンドウハンドルを割り当てる前SetTimerを呼び出し、それがCreateWindow後に呼び出される必要があります。

また、メインウィンドウのサイズが変更されるたびに、コードはクライアント領域のサイズを変更します。 それがあなたの意図したものかどうかはわかりません。

+0

私のせいですが、とにかく助けにならなかった – develoops

+0

@pez良いキャッチ+1 – sehe

0
// Prelucrarea mesajelor primite la fiecare interval al timerului 
case WM_TIMER: 
    InvalidateRect (hwnd, NULL, TRUE); 
    for (int i=0;i<NUMARUL_DE_FIGURI;i++) { 
     square[i].MoveSquare(mod_x_Size, mod_y_Size); 
    } 

これは間違っているようだ、これは、得られた位置がi==NUMARUL_DE_FIGURI毎時間になります - ループのためのタイマーメッセージが受信されるたびに行い、そして ます。

あなたはint i(クラスメンバー?)状態変数を作成する必要があり、ちょうど

case WM_TIMER: 
    if (i<0) i =0; 
    if (i<NUMARUL_DE_FIGURI) 
    { 
     square[i].MoveSquare(mod_x_Size, mod_y_Size); 
     InvalidateRect (hwnd, NULL, TRUE);   
    } 
    i++; 
+0

。あなたがデバッグすると、まだ混乱した – develoops

+1

、あなたはタイマーさえ、トリガーされ、私は増加の値を見ることができますか? – sehe

+0

はい、値が増えています – develoops