Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Движение объекта


Автор: unistylett 6.5.2007, 09:47
Привет всем!!! Я создал окно и объект(линия) на Borland C+ 5.02.  Помогите сделать так чтобы, при движении она вращалась и когда достигнет границы окна отталкивалась и двигалась в другом направлении(можно по задданной траектории).
Вот то что у меня пока получилось

Код

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

#define ELL_TIMER    30000

static HINSTANCE hInst; //дескриптор приложения

//Функция главного окна
LRESULT CALLBACK _export WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
static char szClassName[] = "Garfika";

static char szWinTitle[] = "Движение объекта";

//Функция для регистрации класса окна
static BOOL RegCls(HINSTANCE h){           
    WNDCLASS wndcls;
    wndcls.style         = CS_HREDRAW | CS_VREDRAW;
    wndcls.lpfnWndProc   = WndProc;
    wndcls.cbWndExtra    = 0;
    wndcls.cbClsExtra    = 0;
    wndcls.hInstance     = h;
    wndcls.hIcon         = ::LoadIcon(h, MAKEINTRESOURCE(EXE_ICON));
    wndcls.hCursor       = ::LoadCursor(NULL, IDC_ARROW);
    wndcls.hbrBackground = (HBRUSH)(COLOR_WINDOW+2);   
    wndcls.lpszMenuName  = NULL;
    wndcls.lpszClassName = szClassName;
    return ::RegisterClass(&wndcls);
}

#pragma argsused
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE prevInst, LPSTR cmdline, int show){
    HWND hWnd;
    MSG  msg;
    //
    //Сохраняем идентификатор приложения
    hInst = hInstance;
    //регистрируем класс окна
    if (!RegCls(hInst)) return 0;
    //создаем окно
    hWnd = ::CreateWindow(szClassName, szWinTitle, WS_OVERLAPPED | WS_SYSMENU,
            CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, NULL, NULL, hInst, NULL);  
    //показываем обновляем окно
    ::ShowWindow(hWnd,show);
    ::UpdateWindow(hWnd);
    //Запускаем цикл обработки сообщений
    while (::GetMessage(&msg, NULL, 0, 0)) {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
    }
    return msg.wParam;
}

static POINT p;

#pragma argsused           
static BOOL WndCreate(HWND hWnd, LPCREATESTRUCT /*lpCreateStruct*/){
    ::SetTimer(hWnd, ELL_TIMER, 90, NULL);   
    p.x = 0;
    p.y = 100;
    return TRUE;
}

#pragma argsused
static void WndPaint(HWND hWnd){
    PAINTSTRUCT ps;
    HDC hdc = ::BeginPaint(hWnd, &ps); //
    //char szText[64];
    //::wsprintf(szText, "[%d]:[%d]", p.x, p.y);
    //::TextOut(hdc, p.x, p.y, szText, ::lstrlen(szText));
    ::Rectangle(hdc, p.x+0, p.y+0, p.x+130, p.y+5); 
    ::EndPaint(hWnd, &ps);        
}



#pragma argsused
static void WndTimer(HWND hWnd, UINT id){
    //::MessageBeep(-1);
    p.x += 10;
    p.y += 10;
    if ( p.x>=200 ) {
        p.x = 0;
     p.y = 0;
    }
    ::InvalidateRect(hWnd, NULL, TRUE);
}


#pragma argsused
static void WndDestroy(HWND hWnd){
    ::KillTimer(hWnd, ELL_TIMER);
    ::PostQuitMessage(0);
}


static LRESULT CALLBACK _export WndProc(HWND hWnd, UINT msg,
     WPARAM wParam, LPARAM lParam){
    switch (msg){
        HANDLE_MSG(hWnd, WM_CREATE,  WndCreate);
        HANDLE_MSG(hWnd, WM_PAINT,   WndPaint);
        HANDLE_MSG(hWnd, WM_TIMER,   WndTimer);
        HANDLE_MSG(hWnd, WM_DESTROY, WndDestroy);
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}


Выручайте мне через 4 дня сдавать эту задачу.
Заранее спасибо


M
Alexeis
Модератор: используйте подсветку кода  http://forum.vingrad.ru/index.php?show_typ...howtopic=126445

Указывайте язык программирования.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)