Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zmei89
31 / 6 / 1
Регистрация: 10.09.2010
Сообщений: 835
#1

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

09.01.2012, 12:41. Просмотров 564. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 12:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание Windows-приложения с использованием собственных классов (C++):

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

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

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

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

Приведение типов собственных классов - C++
Добрый день, пусть есть класс class Line { public int x1,x2 ; public int y1,y2 ; Line (int X1,int X2, int...

Как правильно перегрузить операторы для собственных классов? - C++
Операторы перегрузки не выполняются. Мне кажется, я не правильно передаю объекты класса в функцию. Прошу обратить внимание на файл ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 12:41
Привет! Вот еще темы с ответами:

Создание собственных исключений - C++
Vsem privet. Kto mojet reshit sleduushee, Sam ne ponyal. budu blagodaren. source.h: class StackOfIntegers { public: ...

Создание и использование собственных библиотек - C++
Создал я библиотеку с таким вот простым кодом (компилятор mingw):int foo() { return 100; }Получился у меня файл...

Вычисление собственных значений и собственных векторов матрицы. Метод скалярных произведений - C++
Курсовая работа!! Задание: &quot;Вычисление собственных значений и собственных векторов матрицы. Метод скалярных произведений&quot; Матрицу...

Метод итераций: нахождение собственных векторов и собственных значений матрицы - C++
Доброго времени суток. метод итерации нахождение собственных векторов и собственных значений матрицы - вот тема на которую нужно написать...


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

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

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