Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 25.05.2018
Сообщений: 7
1

Не могу разобраться с доступом к объекту

25.05.2018, 16:21. Просмотров 339. Ответов 3
Метки нет (Все метки)

CBall
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#pragma once
#include <windows.h>
#include <windowsx.h>
 
 
 
class CBall
{
    
public:
    double x, y;
    double v_x, v_y;
    double r;
    RECT rect; //описывает прямоугольник границ окна
 
 
    CBall(void);
    virtual ~CBall(void);
 
    virtual void SetParams(double x, double y, double r, double v_x, double v_y, RECT rect);
    virtual void Draw(HDC dc);
    virtual void Move(DWORD delta_ticks);
    void SetBounds(RECT bnds);
};
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "CBall.h"
 
 
 
 
void CBall::SetParams(double x, double y, double r, double v_x, double v_y, RECT rect)
{
    this->x = x;
    this->y = y;
    this->r = r;
    this->v_x = v_x;
    this->v_y = v_y;
    this->rect = rect;
}
 
void CBall::Move(DWORD delta_ticks)
{
    //рассчет времени между движениями в секундах
    double s_delta = ((double)(delta_ticks)) / 1000.0;
 
    if ((this->x >= rect.right - r) && (this->v_x > 0))
        this->v_x = -(this->v_x);
    if ((this->x <= r) && (this->v_x < 0))
        this->v_x = -(this->v_x);
    if ((this->y >= rect.bottom - r) && (this->v_y > 0))
        this->v_y = -(this->v_y);
    if ((this->y <= r) && (this->v_y < 0))
        this->v_y = -(this->v_y);
 
 
 
 
    double dx = v_x*s_delta;
    double dy = v_y*s_delta;
 
    this->x += dx;
    this->y += dy;
}
 
CBall::CBall(void) {}
CBall::~CBall(void) {}
 
 
 
 
 
void CBall::Draw(HDC dc)
{
    //HBRUSH hOldBrush;
    //hOldBrush = SelectBrush(dc, hBrush);
    Ellipse(dc, x - r, y - r, x + r, y + r);
    //SelectBrush(dc, hOldBrush);
}
 
 
 
void CBall::SetBounds(RECT bnds)
{
    this->rect = bnds;
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
#include "CBall.h"
#include "CColoredBall.h"
 
 
class CBallsArray
{
    CBall* *balls; //массив шаров 
    int count; //число шаров в массиве
    int max_balls; //максимальное число шаров в массиве
public:
    CBallsArray(int max_balls);
    virtual ~CBallsArray(void);
    CColoredBall* AddColoredBall();
    CBall* Add();
    void SetBounds(RECT bnds);
    void Move(DWORD ticks);
    void Draw(HDC dc);
 
 
};
CBallsArray
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "CBallsArray.h"
 
 
 
CBallsArray::CBallsArray(int max_balls)
{
    this->count = 0;
    this->max_balls = max_balls;
    this->balls = new CBall*[max_balls];
}
 
CBallsArray::~CBallsArray(void)
{
    for (int i = 0; i < count; i++)
        delete this->balls[i];
    delete[] this->balls;
}
 
CBall* CBallsArray::Add()
{
    if (count >= max_balls)
        return NULL;
    count++;
    balls[count - 1] = new CBall();
    return balls[count - 1];
}
 
CColoredBall* CBallsArray::AddColoredBall()
{
    if (count >= max_balls)
        return NULL;
    count++;
    balls[count - 1] = new CColoredBall();
    return (CColoredBall*)(balls[count - 1]);
}
 
void CBallsArray::SetBounds(RECT bnds)
{
    for (int i = 0; i < count; i++)
        balls[i]->SetBounds(bnds);
}
 
void CBallsArray::Move(DWORD ticks)
{
    CBall* ball1;
    CBall* ball2;
 
    for (int i = 0; i < count; i++)
    {
        for (int j = i + 1; j < count; j++)
        {
            ball1 = this->balls[i];
            ball2 = this->balls[j];
 
            double C_x = ball2->x - ball1->x;
            double C_y = ball2->y - ball1->y;
            double C2 = C_x * C_x + C_y * C_y;
 
            if (C2 <= ((ball1->r + ball2->r) * (ball1->r + ball2->r)))
            {
                double AC_scaler = ball1->v_x * C_x + ball1->v_y * C_y;
                double BC_scaler = ball2->v_x * C_x + ball2->v_y * C_y;
 
                double Ap_v_x = (C_x * AC_scaler) / C2;
                double Ap_v_y = (C_y * AC_scaler) / C2;
                double At_v_x = ball1->v_x - Ap_v_x;
                double At_v_y = ball1->v_y - Ap_v_y;
 
                double Bp_v_x = (C_x * BC_scaler) / C2;
                double Bp_v_y = (C_y * BC_scaler) / C2;
                double Bt_v_x = ball2->v_x - Bp_v_x;
                double Bt_v_y = ball2->v_y - Bp_v_y;
 
                ball1->v_x = Bp_v_x + At_v_x;
                ball1->v_y = Bp_v_y + At_v_y;
                ball2->v_x = Ap_v_x + Bt_v_x;
                ball2->v_y = Ap_v_y + Bt_v_y;
            }
        }
    }
 
    for (int i = 0; i <count; i++)
        balls[i]->Move(ticks);
}
 
void CBallsArray::Draw(HDC dc)
{
 
    for (int i = 0; i <count; i++)
        balls[i]->Draw(dc);
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#pragma once
#include <windows.h>
#include <windowsx.h>
#include "CBall.h"
#include "CColoredBall.h"
#include "math.h"
 
 
class CBallSettingsMonitor
{
    double angle;
    double speed;
public:
    CBallSettingsMonitor(void);
    ~CBallSettingsMonitor(void);
    void Draw(HDC dc);
    void SpeedUp();
    void SpeedDown();
    void AngleUp();
    void AngleDown();
 
    void GetVXVY(double& v_x, double& v_y);
 
};
CBallSettingsMonitor
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "CBallSettingsMonitor.h"
 
 
 
CBallSettingsMonitor::CBallSettingsMonitor(void)
{
    this->angle = 45;
    this->speed = 50;
 
}
CBallSettingsMonitor::~CBallSettingsMonitor(void) {}
 
 
void CBallSettingsMonitor::SpeedUp()
{
    if (this->speed < 120)
        speed++;
}
 
void CBallSettingsMonitor::SpeedDown()
{
    if (this->speed > 10)
        speed--;
}
 
void CBallSettingsMonitor::AngleUp()
{
    angle++;
    if (angle >= 360)
        angle = 0;
}
 
void CBallSettingsMonitor::AngleDown()
{
    angle--;
    if (angle <= 0)
        angle = 360;
}
 
void CBallSettingsMonitor::GetVXVY(double& v_x, double& v_y)
{
    double rad_angle = (this->angle / 180) * 3.1415;
    v_x = this->speed * cos(rad_angle);
    v_y = this->speed * sin(rad_angle);
}
 
void CBallSettingsMonitor::Draw(HDC dc)
{
    double halfspeed = ((this->speed / 120) * 30) / 2;
    double rad_angle = (this->angle / 180) * 3.1415;
 
    double x = halfspeed * cos(rad_angle);
    double y = halfspeed * sin(rad_angle);
 
    Rectangle(dc, 0, 0, 30, 30);
    MoveToEx(dc, 15 - x, 15 - y, NULL);
    LineTo(dc, 15 + x, 15 + y);
    Ellipse(dc, 15 + x - 2, 15 + y - 2, 15 + x + 2, 15 + y + 2);
}

CColoredBall
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "CColoredBall.h"
 
 
CColoredBall::CColoredBall(void)
{
    this->brush = CreateSolidBrush(RGB(0, 0, 0));
 
}
 
CColoredBall::~CColoredBall(void)
{
    DeleteBrush(this->brush);
}
 
void CColoredBall::SetColor(unsigned char r, unsigned char g, unsigned char b)
{
    DeleteBrush(this->brush);
    this->brush = CreateSolidBrush(RGB(r, g, b));
}
 
void CColoredBall::Draw(HDC dc)
{
    HBRUSH old = SelectBrush(dc, this->brush);
    Ellipse(dc, x - r, y - r, x + r, y + r);
    SelectBrush(dc, old);
 
}
 
void CBall::SetParams(double x, double y, double r, double v_x, double v_y, RECT rect)
{
    this->x = x;
    this->y = y;
    this->r = r;
    this->v_x = v_x;
    this->v_y = v_y;
    this->rect = rect;
}
Основной файл программы

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#include <windows.h>
#include <WindowsX.h>
#include "CBall.h"
#include "CBallsArray.h"
#include "CBallSettingsMonitor.h"
#include "CColoredBall.h"
 
 
 
HINSTANCE g_hInstance;
int g_nCmdShow;
HWND g_mainWnd;
CBallsArray balls(50);
CBallSettingsMonitor monitor;
DWORD prev_frame_time;
RECT rect_wndSize;
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
 
BOOL InitAppClass() //реализация оконного интерфейса
{
    ATOM class_id;
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = g_hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszClassName = L"LabWork1";
    class_id = RegisterClass(&wc);
 
    if (class_id != 0)
        return TRUE;
 
    return FALSE;
}
 
BOOL InitWindow()
{
    g_mainWnd = CreateWindow(L"labWork1", L"Лабораторная работа №1",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        400, 400,
        0, 0,
        g_hInstance,
        0);
    if (!g_mainWnd) return FALSE;
    ShowWindow(g_mainWnd, g_nCmdShow);
    UpdateWindow(g_mainWnd);
 
    return TRUE;
}
 
void OnIdle()
{
    DWORD cur_time = GetTickCount();
    DWORD delta_time = cur_time - prev_frame_time;
    balls.Move(delta_time);
    prev_frame_time = cur_time;
    InvalidateRect(g_mainWnd, NULL, TRUE);
}
 
WPARAM StartMessageLoop()
{
    MSG msg;
    while (1)
    {
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;
            DispatchMessage(&msg);
        }
        else
        {
            Sleep(20);
            OnIdle();
        }
    }
    return msg.wParam;
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    default:
        break;
 
    case WM_PAINT:
    {
        HDC hDC;
        PAINTSTRUCT ps;
        hDC = BeginPaint(hWnd, &ps);
        balls.Draw(hDC);
        monitor.Draw(hDC);
        EndPaint(hWnd, &ps);
        return 0;
    }
 
    case WM_SIZE: //изменение размера окна
    {
        //RECT rect_wndSize;
        rect_wndSize.top = 0;
        rect_wndSize.left = 0;
        rect_wndSize.bottom = HIWORD(lParam);
        rect_wndSize.right = LOWORD(lParam);
        balls.SetBounds(rect_wndSize);
        return 0;
    }
    case WM_LBUTTONUP:
    {
        double xpos = GET_X_LPARAM(lParam);
        double ypos = GET_Y_LPARAM(lParam);
        CBall* ball = balls.Add();
        if (ball != NULL)
        {
            double v_x, v_y;
            monitor.GetVXVY(v_x, v_y);
            ball->SetParams(xpos, ypos, 2, v_x, v_y, rect_wndSize);
        }
        return 0;
    }
    case WM_RBUTTONUP:
    {
        double xpos = GET_X_LPARAM(lParam);
        double ypos = GET_Y_LPARAM(lParam);
        CColoredBall* ball = balls.AddColoredBall();
        if (ball != NULL)
        {
            double v_x, v_y;
            monitor.GetVXVY(v_x, v_y);
            ball->SetParams(xpos, ypos, 2, v_x, v_y, rect_wndSize);
            ball->SetColor(255, 5, 255);
        }
        return 0;
    }
 
    case WM_KEYDOWN:
    {
        switch (wParam)
        {
        case VK_DOWN:
            monitor.SpeedDown();
            return 0;
        case VK_UP:
            monitor.SpeedUp();
            return 0;
        case VK_LEFT:
            monitor.AngleUp();
            return 0;
        case VK_RIGHT:
            monitor.AngleDown();
            return 0;
        }
    }
    break;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
 
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hprevinstance, LPSTR lpCmdline, int nCmdshow) //главная функция 
{
    prev_frame_time = GetTickCount();
 
    CBall* ball;
    ball = balls.Add();
    ball->SetParams(10, 10, 2, 50, 50, rect_wndSize);
    ball = balls.Add();
    ball->SetParams(100, 10, 2, -70, -70, rect_wndSize);
 
 
    g_hInstance = hInstance;
    g_nCmdShow = nCmdshow;
 
    if (!InitAppClass())
        return 0;
    if (!InitWindow())
        return 0;
 
    RECT cr;
    GetClientRect(g_mainWnd, &cr);
    //b1.SetBounds(cr);
    //b1.SetHLimiter(&h1);
    //b1.SetHLimiters(&h2);
 
    return StartMessageLoop();
}
Задача, сделать так чтобы при ударении цветные шары обменивались цветами, а обычные нет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2018, 16:21
Ответы с готовыми решениями:

Не могу разобраться с доступом к файлам......
Здравствуйте! Надеюсь на вашу помощь...как говорится одна голова хорошо, а 402 еще лучше! Дело...

Ситуация с доступом к объекту на веб - странице
Когда жму на объект 2 раза (синий) на web-странице он превращается в красный.(Это я использую...

Задали работу, не могу разобраться. Используется делфи 10, не могу разобраться, как это сделать
В одномерном массиве, состоящем из n вещественных элементов, вычислить: минимальный элемент массива...

Не могу разобраться разобраться с кодом меню
Добрый день. Я понимаю, что тут все, наверное, элементарно. Но я только начала изучение js и пока...

3
2053 / 628 / 235
Регистрация: 10.02.2018
Сообщений: 1,473
25.05.2018, 17:06 2
Вопрос не в определении столкновений, а именно обмене свойствами?
Для определения типа исходного объекта по указателю на базовый класс можно использовать "рантайм информацию о типах" и dynamic_cast. Для объектов базового класса вернётся 0.
C++
1
2
3
4
5
6
7
8
    MyClass m1;
    MyClass2 m2; // class MyClass2 : public MyClass
 
    MyClass* pm1 = &m1;
    MyClass* pm2 = &m2;
 
    MyClass2* pm21 = dynamic_cast<MyClass2*>(pm1); // 0
    MyClass2* pm22 = dynamic_cast<MyClass2*>(pm2); // всё ок
Если включение "рантайм информации о типах" по каким-то причинам нежелательно, то можно добавить собственную виртуальную функцию возвращающую "тип" в базовый класс и использовать её.
0
0 / 0 / 0
Регистрация: 25.05.2018
Сообщений: 7
25.05.2018, 17:44  [ТС] 3
Цитата Сообщение от Ygg Посмотреть сообщение
Вопрос не в определении столкновений, а именно обмене свойствами?
Для определения типа исходного объекта по указателю на базовый класс можно использовать "рантайм информацию о типах" и dynamic_cast. Для объектов базового класса вернётся 0.
C++
1
2
3
4
5
6
7
8
    MyClass m1;
    MyClass2 m2; // class MyClass2 : public MyClass
 
    MyClass* pm1 = &m1;
    MyClass* pm2 = &m2;
 
    MyClass2* pm21 = dynamic_cast<MyClass2*>(pm1); // 0
    MyClass2* pm22 = dynamic_cast<MyClass2*>(pm2); // всё ок
Если включение "рантайм информации о типах" по каким-то причинам нежелательно, то можно добавить собственную виртуальную функцию возвращающую "тип" в базовый класс и использовать её.
Ygg, Мне нужно именно получение свойств через отдельную функцию. У меня есть виртуальная функция SetColor, и сделать на ее подобии функцию GetColor, которая будет получать от шарика значения цвета. Только вот я не пойму, как из объекта HBRUSH вытащить эти значение, с данной библиотекой слабо знаком. Не подскажите как правильнее записать такую функцию?
0
2053 / 628 / 235
Регистрация: 10.02.2018
Сообщений: 1,473
25.05.2018, 18:12 4
Не знаю, возможно ли делать подобное через HBRUSH.
Самый простой вариант, сохранять помимо кисти и COLORREF, результат макроса RGB.
Ну, или просто меняйте местами кисти (HBRUSH) у объектов.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2018, 18:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не могу получить достук к объекту в другом xml
Есть такая задача, поставил пример с боковым меню, оно соответственно работает с фрагментами. По...

Приветствую, не могу разобраться с кодом программы и не могу сделать .obj файл
.model tiny; нужно будет получить исполняемый файл формата СОМ .code org 100h start: mov ax,...

Не могу написать комментарии для функции поиска, не могу разобраться...
void __fastcall TForm1::FindDialog1Find(TObject *Sender) { int found, start, end; //...

Не могу найти ошибку!! не могу не как разобраться! надо до завтра.
условие: Для 7 человек, среди которых есть мужчины и женщины, хранятся следующие данные: имя, пол...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.