Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
32 / 7 / 1
Регистрация: 10.09.2010
Сообщений: 850

Создание Windows-приложения с использованием собственных классов

09.01.2012, 12:41. Показов 1152. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Создание нового проекта Windows-приложения для реализации графического редактора.
2. Создание абстрактного класса, представляющего графический объект, и имеющего свойства цвет, цвет границы, толщина границы, тип граничной линии;
3. Наследование от этого абстрактного класса, классов представляющих следующие графические объекты: точка, линия, эллипс, прямоугольник. В данных классах должны быть заданы атрибуты для фиксирования координат, задание которых необходимо для графического построения этих объектов.
4. Создание конструкторов и деструкторов для наследованных классов, обеспечивающих выделение и чистку памяти, а также задание значений свойств данных классов;
5. Создание конструкторов копирования без параметров, обеспечивающих создание объектов со значениями по умолчанию.
6. Создание в базовом абстрактном классе виртуальных методов отображения и перемещения графических объектов и переопределение этих методов в каждом из наследованных классов;
7. Создание в окне программы панели инструментов, включающей кнопки для создания графических объектов, задания их цвета и параметров границ, а также поля для ввода размеров объектов. Отображение графических объектов на экране должно осуществляться по нажатию левой кнопки мыши;
8. Реализацию перемещения объектов и изменения их размеров при помощи мыши;
9. Реализацию выбора объектов при помощи мыши и изменение параметров выбранных объектов по нажатиям кнопок панели инструментов.
10. Реализация возможности создания надписей;
11. Реализация сохранения рисунка в каком-либо собственном формате и загрузки рисунков из файлов;
12. Реализация масштабирования рисунков;
13. Реализация функции удаления графических объектов из рисунка.

Что нужно еще дополнить в этом коде???

C++
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
#include <Windows.h>
 
long width = 0, height = 0; // ширина и высота картинки
HBITMAP hPicture = NULL;
DWORD *data = NULL; // указатель на область памяти, где будет лежать картинка
HDC hScreenDC = NULL, hMemoryDC = NULL; // контексты устройств - см. ниже
 
bool drag = false;
POINT anchor;
 
// инициализация контекстов устройств, создание "буфера" в памяти для рисования на нем
bool InitializeGraphics(HWND hw)
{
// проверка окна
if(!IsWindow(hw))
    return false;
 
// если процедура вызвана для РЕ-инициализации, освободим существующие объекты
if(hPicture)
    DeleteObject(hPicture);
if(hMemoryDC)
    DeleteDC(hMemoryDC);
if(hScreenDC)
    ReleaseDC(hw, hScreenDC);
 
// найдем размеры "окна" для рисования
RECT rect;
GetClientRect(hw, &rect);
 
width = rect.right - rect.left;
height = rect.bottom - rect.top;
 
// захват контекста устройства окна (клиентской области)
hScreenDC = GetDC(hw);
if(hScreenDC == NULL)
    return false;
 
// создание совместимого контекста устройства в памяти - будущий буфер
hMemoryDC = CreateCompatibleDC(hScreenDC);
if(hMemoryDC == NULL)
{
    ReleaseDC(hw, hScreenDC);
    return false;
}
 
// создание BITMAP для рисования 
LPBITMAPINFO lpbi;
lpbi = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER) + (3 * sizeof(RGBQUAD))];
BITMAPINFO &MSbi = *lpbi;
ZeroMemory(&MSbi, sizeof(BITMAPINFO));
 
// параметры хранения картинки в памяти
MSbi.bmiHeader.biBitCount = 32; // 32 бит на точку - одна точка - одно 32-битное слово
MSbi.bmiHeader.biClrImportant = 0;
MSbi.bmiHeader.biClrUsed = 0;
MSbi.bmiHeader.biCompression = BI_RGB; // без компрессии
MSbi.bmiHeader.biHeight = -height;  // знак "-" нужен чтобы битмап не был "перевернут" - 
                                    // при "+" первыми в буфере идут последние строчки битмапа
MSbi.bmiHeader.biPlanes = 1;// количество цветовых плоскостей, для RGB всегда 1
MSbi.bmiHeader.biSize = sizeof(BITMAPINFO);
MSbi.bmiHeader.biSizeImage = 0;
MSbi.bmiHeader.biWidth = width;
MSbi.bmiHeader.biXPelsPerMeter = 0;
MSbi.bmiHeader.biYPelsPerMeter = 0;
 
// создаем устройство-независимую битмап-секцию (Device-Independent Bitmap, DIB)
hPicture = CreateDIBSection(hMemoryDC, &MSbi, DIB_RGB_COLORS, (void**)&(data), NULL, NULL);
if(hPicture == NULL)
{
    DWORD k = GetLastError();
    ReleaseDC(hw, hScreenDC);
    DeleteDC(hMemoryDC);
    return false;
}
 
// выбираем созданную секцию на memoryDC - т.е. для буфера
SelectObject(hMemoryDC, hPicture);
 
delete lpbi;
lpbi = NULL;
 
return true;
}
 
LRESULT CALLBACK WndProc(HWND hw, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// создаем белый карандаш для рисования линий
static HPEN whitepen = CreatePen(PS_SOLID, 2, 0xFFFFFF);
 
switch(uMsg)
{
case WM_CLOSE:
    if(hPicture)
        DeleteObject(hPicture);
    if(hMemoryDC)
        DeleteDC(hMemoryDC);
    if(hScreenDC)
        ReleaseDC(hw, hScreenDC);
    DestroyWindow(hw);
    break;
case WM_DESTROY:
    PostQuitMessage(0);
    break;
case WM_CREATE: // при создании
case WM_SIZE:   // сворачивании/разворачивании
case WM_MOVE:   // перемещении/изменении размеров окна
    if(InitializeGraphics(hw)) // (пере)инициализируем графику
    {
        // и выбираем белый карандаш на оба контекста устройства
        SelectObject(hScreenDC, whitepen);
        SelectObject(hMemoryDC, whitepen);
    }
    if(uMsg != WM_CREATE)   // если окно уже было создано
        InvalidateRect(hw, NULL, false); // перерисуем
    break;
case WM_MOUSEMOVE: // при движении мыши
    if(data)
    {
        if(!drag) // если левая кнопка мыши не нажата
        {
            int x = LOWORD(lParam); // координаты курсора
            int y = HIWORD(lParam);
            data[width * y + x] = (rand() << 9) | rand();   // поместим точку случайного цвета (в буфере, 
                                                            // прямое рисование "в памяти")
            InvalidateRect(hw, NULL, false); // перерисуем
        }
        else // если нажата
        {
            BitBlt(hScreenDC, 0, 0, width, height, hMemoryDC, 0, 0, SRCCOPY); // перерисуем экран
            MoveToEx(hScreenDC, anchor.x, anchor.y, NULL);  // нарисуем на экране (не в буфере!)
            LineTo(hScreenDC, LOWORD(lParam), HIWORD(lParam)); // белую линию
        }
    }
    break;
case WM_LBUTTONDOWN: // нажали левую кнопку
    anchor.x = LOWORD(lParam); // запомним координаты курсора
    anchor.y = HIWORD(lParam);
    drag = true; // установим флаг нажатой левой кнопки
    break;
case WM_LBUTTONUP: // отпустили левую кнопку
    drag = false; // сбросили флаг нажатия
    MoveToEx(hMemoryDC, anchor.x, anchor.y, NULL); // нарисовали белую линию (в буфере! - т.е. сохранили)
    LineTo(hMemoryDC, LOWORD(lParam), HIWORD(lParam));
    InvalidateRect(hw, NULL, false); // перерисовали экран
    break;
case WM_PAINT: // необходимо перерисовать окно - перерисовываем
    BitBlt(hScreenDC, 0, 0, width, height, hMemoryDC, 0, 0, SRCCOPY); // копируем из буфера на экран
    ValidateRect(hw, NULL); // устанавливаем "нет нужды в перерисовке"
    return false;
default:
    return DefWindowProc(hw, uMsg, wParam, lParam);
}
 
return false;
}
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmd, int nShowCmd)
{
// регистрируем класс окна
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInst;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = TEXT("SPW");
wc.lpszMenuName = NULL;
wc.style = CS_VREDRAW | CS_HREDRAW;
RegisterClassEx(&wc);
 
// создаем окно
HWND wnd = CreateWindow(TEXT("SPW"), TEXT("Simple Paint"), WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
    0, 0, 800, 600, NULL, NULL, hInst, NULL);
// ShowWindow(wnd, SW_SHOW);
 
// запускаем очередь сообщений
MSG msg;
 
while(GetMessage(&msg, wnd, 0, 0) > 0)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
 
return msg.lParam;
}
 Комментарий модератора 
Используйте теги форматирования кода!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2012, 12:41
Ответы с готовыми решениями:

Создание программы с использованием собственных функций. Использование массивов и структур
Здравствуйте! Помогите, пожалуйста, решить задачу. Вот текст: Существует 3 категории учеников: отличник, хорошист, двоечник. ...

Создание всемирного времени с использованием классов
Подскажите как создать структуры классов(3-5 класса) всемирного времени то есть время из разных столиц мира,и использовать полиморфизм,...

Создание экземпляров COM объектов с использованием фабрики классов
Доброго времени суток! Помогите разобраться, пожалуйста. Есть сторонний ActiveX компонент. Проимпортировал его и положил на...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.01.2012, 12:41
Помогаю со студенческими работами здесь

Создание классов с использованием конструкторов различного типа
Здраствуйте!, появилась проблемка с работой, чего-то не доганаю....=) Задание: Разработать программу на С++ использующую класс...

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

Реализация собственных классов
Разработать прогнрамму, демонстрирующую работу с объектами 2х типов: Triangle(треугольник) и Quadrate(квадрат ).Каждый объект должен иметь...

CI - использование собственных классов
Делал небольшой проект для обучения себе на ci. Всё хорошо. Использовал массивы и не более. Появилось слишком много повторяющегося кода, да...

Возможно ли создание такого приложения с использованием WinAPI?
Стоит задача создать приложение, в котором создаётся новый вектор обработки прерывания, которое срабатывает при нажатии сочетания Ctrl +...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru