Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ WinAPI Ошибка при компиляции при переходе с vs 2012 на 2015 https://www.cyberforum.ru/ win-api/ thread2252890.html
#pragma once #include <windows.h> #include <windowsx.h> class CBall { public:
Отслеживание изменений буфера обмена (Си) C++ WinAPI
Приветствую. Есть код на C, который выводит в консоль содержимое буфера обмена (текст или путь к файлам): #include <stdio.h> #include <stdlib.h> #include "Windows.h" #include <locale.h> ...
Winapi Диски c++ C++ WinAPI
Есть функция , которая ищет файлы по маске. BOOL Search(LPCTSTR FileName, BOOL bInnerFolders = TRUE) { LPTSTR part; char tmp; // временный массив char name; HANDLE hSearch =...
C++ WinAPI Как работает функция SetProcessWorkingSetSize? Здравствуйте. У меня есть вопрос. Как работает функция SetProcessWorkingSetSize, которая уменьшает объём оперативной памяти? Заранее спасибо за ответ. https://www.cyberforum.ru/ win-api/ thread2251419.html
C++ WinAPI Создание скроллбара (вертикального и горизонтального) https://www.cyberforum.ru/ win-api/ thread2251175.html
Разработать программу, которая создает окно с горизонтальной и вертикальной полосами прокрутки. При щелчке кнопки мыши по вертикальной полосе прокрутки окна блокируется горизонтальная прокрутка....
Автозагрузка и моя программа C++ WinAPI
Как в C++ добавить программу в автозагрзку после первого её запуска? Я гуглил и даже нашёл какой-то код, но он не работает. Если кому-то это облегчит жизнь я приведу этот код: void...
Через некоторое время программа перестаёт рисовать линии C++ WinAPI
Здравствуйте. Я создал простой графический редактор, используя данный код: #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int lastx,lasty,x,y; int WINAPI WinMain...
C++ WinAPI Оконные сообщения Добрый день! Есть проблема. Есть приложение условно назовем AppMain, которое отправляет в определенный момент оконное сообщение WM_SETTEXT и меняет title своего окна. Я перехватываю(хук ... https://www.cyberforum.ru/ win-api/ thread2250844.html
C++ WinAPI Использование NtReadVirtualMemory https://www.cyberforum.ru/ win-api/ thread2250067.html
Можно ли использовать напрямую NtReadVirtualMemory в обычном консольном (exe) приложении?
C++ WinAPI Навигация стрелками в консоли Здравствуйте хотел добавить в свое приложения навигацию стрелками по меню и нашел на форуме подходящий код и добавил его в свой но при выборе какого либо варианта хочу что бы обратно вернулось в меню... https://www.cyberforum.ru/ win-api/ thread2250049.html
0 / 0 / 0
Регистрация: 25.05.2018
Сообщений: 7
0

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

25.05.2018, 16:21. Просмотров 357. Ответов 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
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.