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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Наследование http://www.cyberforum.ru/cpp-beginners/thread424895.html
Помогите пожалуйста найти ошибку в коде. Тема: Наследование классов и виртуальные функции. Ошибка заключается в том, что переменные из первого класса не передаются во второй, хотя по идее имеют свойства protected (public тоже пробовал), а тип наследования public. #include "stdafx.h" #include <iostream> using namespace std; class detail {
C++ Базовые интерфейсные компоненты Windows Forms Может где то на форуме есть похожие???или может у кого то есть 1. Создание нового проекта Windows-приложения, его компиляция и запуск; 2. Разработка некоторого меню произвольного содержания для главной формы приложения; 3. Включение в меню пункта «Выход» и создание кнопки «Закрыть» в главном окне приложения, по выбору которых должно производиться закрытие приложения. 4. Разработка формы... http://www.cyberforum.ru/cpp-beginners/thread424874.html
[C++] Указатели C++
Помогите сделать эту же программу но с использованием указателей #include "stdafx.h" #include <conio.h> #include <iostream> #include <math.h> using namespace std; void main() { int n, i, j, nom, min; int a;
Использование подставляемых функций и включение файла заголовка. C++
Приветствую Вас форумчане! У меня вопрос и он опять связан с подключением заголовочного файла в старом формате, а может и не только. Думал, может опечатка, как это было не раз в предыдущих главах книги Джесса Либерти. Пытался менять расширения, не помогает, попробовал совсем убрать и вставить строку<using namespace std;> ,все равно ошибка. Посоветуйте, может в настройках компилятора, что то...
C++ Работа с Массивами Структур http://www.cyberforum.ru/cpp-beginners/thread424826.html
Вновь с вопросом о помощи по заданию, которое само собой не понимаю... 1. Поля структуры: инвентарный номер книги, название, число страниц. Операция: найти инвентарный номер книги с введенным названием Подготовить 3 тестовых варианта (c входными и выходными данными). Кому не сложно помогите...
C++ Математические задачи Вот математические задачки, нуждаюсь в помощи решения... Сам на данный момент не способен, так как тёмный в этом деле. Ещё раз заранее извиняюсь что прошу так много сделать, но увы зачислен был поздно, и разобраться в материале просто физически был не способен, вот сейчас потихоньку разбираю, кому не сложно помогите пожалуйста. 1. Составьте алгоритм расчета значений z1 и z2 по двум формулам,... подробнее

Показать сообщение отдельно
zmei89
31 / 6 / 1
Регистрация: 10.09.2010
Сообщений: 810
09.01.2012, 12:41     Создание Windows-приложения с использованием собственных классов
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;
}
 Комментарий модератора 
Используйте теги форматирования кода!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 12:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru