2011-10-15 40 views
0

好吧,所以我在Windows中嘗試了一些非常基本的動畫的東西(如果你甚至可以稱之爲動畫)。我弄亂了TextOut的參數(文本的座標)不是動畫。基本上,它會在幾個不同的地方打印「你好」,一次又一次,似乎沒有任何事情發生。問題在於文本正在屏幕上繪製,而沒有前一次調用的文本將InvisibleateRect從屏幕上清除。另外,當將一些簡單的遞增序列值(如1,2,3,4,5等)作爲參數傳遞給TextOut時,不存在這樣的問題。簡單的動畫在c + +

#include <Windows.h> 

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); 
struct point 
{ 
    double x; 
    double y; 
    double t; 
}; 


point obj={30,30,1}; 

int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPWSTR cmdLine,int cmdShow) 
{ 
    WNDCLASSEX windowsClass={0}; 



    windowsClass.hCursor=LoadCursor(NULL,IDC_ARROW); 
    windowsClass.cbSize=sizeof(WNDCLASSEX); 
    windowsClass.hInstance=hInstance; 
    windowsClass.lpfnWndProc=WndProc; 
    windowsClass.cbClsExtra=NULL; 
    windowsClass.style=CS_HREDRAW | CS_VREDRAW; 
    windowsClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); 
    windowsClass.hbrBackground=(HBRUSH)GetStockObject(NULL_BRUSH); 
    windowsClass.lpszClassName="Devjeet's Window"; 

    if(!RegisterClassExA(&windowsClass)) 
     return -1; 
    HWND hWnd = CreateWindowExA(NULL,"Devjeet's Window","Animation V1 By Devjeet",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,400,NULL,NULL,hInstance,NULL); 

    if(!hWnd) 
     return -1; 
    ShowWindow(hWnd,cmdShow); 


    MSG msg={0}; 

    while(msg.message!=WM_QUIT) 
    { 
     if(PeekMessage(&msg,0,0,0,PM_REMOVE)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 
    return static_cast<int>(msg.wParam); 
} 

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) 
{ 
    HDC hDC; 
    PAINTSTRUCT paintStruct; 

    switch(message) 
    { 

    case WM_PAINT: 
     hDC=BeginPaint(hWnd,&paintStruct); 

     TextOut(hDC,(int)(obj.x),(int)(obj.y),"Hello",sizeof("Hello")); 
     obj.y=(double)(30*obj.t+(obj.t*obj.t*9.8/2)); 
     obj.x=(double)(30*obj.t+(obj.t*obj.t*9.8/2)); 
     obj.t+=.8; 


     EndPaint(hWnd,&paintStruct); 
     if(obj.y>100.0) 
     { 
      obj.x=30.0; 
      obj.y=30.0; 
      obj.t=1.0; 
     } 

     Sleep(800); 
     InvalidateRect(hWnd,NULL,TRUE); 
     break; 
    case WM_DESTROY: 
     PostQuitMessage(NULL); 
     break; 
    default: 
     return DefWindowProc(hWnd,message,wParam,lParam); 
     break; 
    } 
    return 0; 
} 
+0

你的問題是什麼? – sth

+0

我的問題是爲什麼會發生這種情況?這個方程有什麼問題嗎?或者有什麼關於Windows的東西我不知道? – devjeetroy

+1

@devjeetroy:你的問題標題與你的問題有什麼關係? – Mat

回答

1

第一:永遠,永遠,從WM_PAINT處理程序調用Sleep。你會鎖定你的用戶界面。

在Windows上執行簡單動畫的推薦方法是使用SetTimer,並處理WM_TIMER消息。您的WM_TIMER處理程序將處理您的精靈需要的地方,並調用InvalidateRect。您可以使整個窗口無效,或者只是移動的精靈的舊位置和新位置。

爲了響應InvalidateRect,Windows會向您發送WM_PAINT消息,允許您重新繪製窗口。

至於爲什麼它沒有擦除舊的:你已經指定NULL_BRUSH作爲窗口背景,這意味着默認的WM_ERASEBKGND處理程序(其中Windows將擦除你的窗口內容)什麼也不做。您或者需要自己處理WM_ERASEBKGND(使用 - 例如 - FillRect來擦除窗口),或者您也需要在WM_PAINT處理程序中處理該部分。

哦,以及簡單的位置增量起作用的原因可能是因爲(如果我正確記得),TextOut將擦除給定文本的邊界框的背景。由於這可能比文本大兩個像素,因此如果它只有一個像素,它將刪除以前的文本。