С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

Сборник классов для работы с графикой

02.10.2014, 15:03. Показов 2405. Ответов 40
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
от нефиг делать захотелось накидать аналоги дельфийских функций и классов вот для начала так мелочи:

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
struct Point
{
    int x, y;
    Point() : x(0), y(0) {}
    Point(int x, int y) : x(x), y(y) {}
    Point(const POINT& point) : x(point.x), y(point.y) {}
    Point(const Point& point) : x(point.x), y(point.y) {}
    POINT tagPOINT() { return { x, y }; }
    Point& operator = (const POINT& pt) { return x = pt.x, y = pt.y, *this; }
    Point& operator = (const Point& pt) { return x = pt.x, y = pt.y, *this; }
    bool operator == (const POINT& pt) { return x == pt.x && y == pt.y; }
    bool operator == (const Point& pt) { return x == pt.x && y == pt.y; }
};
 
struct Rect
{
    int left, top, right, bottom;
    Rect() : left(0), top(0), right(0), bottom(0) {}
    Rect(int left, int top, int right, int bottom) : left(left), top(top), right(right), bottom(bottom) {}
    Rect(const POINT& lt, const Point& rb) : left(lt.x), top(lt.y), right(rb.x), bottom(rb.y) {}
    Rect(const Point& lt, const Point& rb) : left(lt.x), top(lt.y), right(rb.x), bottom(rb.y) {}
    Rect(const RECT& rect) : left(rect.left), top(rect.top), right(rect.right), bottom(rect.bottom) {}
    Rect(const Rect& rect) : left(rect.left), top(rect.top), right(rect.right), bottom(rect.bottom) {}
    RECT tagRECT() { return { left, top, right, bottom }; }
    Point LeftTop() { return Point(left, top); }
    Point RightBottom() { return Point(right, bottom); }
    int width() { return right - left; }
    int height() { return bottom - top; }
    Rect& operator = (const RECT& rc) { return left = rc.left, top = rc.top, right = rc.right, bottom = rc.bottom, *this; }
    Rect& operator = (const Rect& rc) { return left = rc.left, top = rc.top, right = rc.right, bottom = rc.bottom, *this; }
    bool operator == (const RECT& rc) { return left == rc.left && top == rc.top && right == rc.right && bottom == rc.bottom; }
    bool operator == (const Rect& rc) { return left == rc.left && top == rc.top && right == rc.right && bottom == rc.bottom; }  
};
 
struct HRGB
{
    unsigned char r, g, b;
    HRGB() : r(0), g(0), b(0) {}
    HRGB(unsigned char r, unsigned char g, unsigned char b) : r(r), g(g), b(b) {}
    HRGB(COLORREF color) : r(GetRValue(color)), g(GetGValue(color)), b(GetBValue(color)) {}
    HRGB(const HRGB& rgb) : r(rgb.r), g(rgb.g), b(rgb.b) {}
    COLORREF color() { return RGB(r, g, b); }
    HRGB& operator = (COLORREF color)
    {
        r = GetRValue(color);
        g = GetGValue(color);
        b = GetBValue(color);
        return *this;
    }
    HRGB& operator = (const HRGB& rgb) { return r = rgb.r, g = rgb.g, b = rgb.b, *this; }
    bool operator == (const HRGB& rgb) { return r == rgb.r && g == rgb.g && b == rgb.b; }
};
еще немного недописанный Font
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
class Font
{
private:
    HFONT m_font;
    HDC m_dc;
    std::string m_name;
    unsigned m_size;
    bool m_bold;
    bool m_italic;
    bool m_underline;
    bool m_strikeout;
    double m_orientation;
    COLORREF m_color;
    DWORD m_charset;
 
    void update()
    {
        SetTextColor(m_dc, m_color);
        m_font = CreateFont( m_size,
                             0,
                             static_cast<int>(m_orientation * 10),
                             0,
                             m_bold ? FW_BOLD : FW_NORMAL,
                             m_italic,
                             m_underline,
                             m_strikeout,
                             m_charset,
                             OUT_DEFAULT_PRECIS,
                             CLIP_DEFAULT_PRECIS,
                             PROOF_QUALITY,
                             DEFAULT_PITCH | FF_DONTCARE,
                             AnsiStringToWide(m_name).c_str());
        SelectObject(m_dc, m_font);
    }
public:
    Font(HDC dc = 0)
    {
        m_font = 0;
        m_dc = dc;
        m_name = "";
        m_size = 20;
        m_bold = false;
        m_italic = false;
        m_strikeout = false;
        m_underline = false;
        m_orientation = 0;
        m_color = 0x000000;
        m_charset = DEFAULT_CHARSET;
        SetBkMode(m_dc, TRANSPARENT);
        update();
    }
 
    HFONT HFONT() { return m_font; };
 
    HDC SetDC(HDC value) { return m_dc = value, update(), m_dc; }
    __declspec(property(get = m_dc, put = SetDC)) HDC dc;
 
    DWORD SetCharset(DWORD value) { m_charset = value, update(); }
    __declspec(property(get = m_charset, put = SetCharset)) DWORD charset;
 
    COLORREF SetColor(COLORREF value) { return m_color = value, update(), m_color; }
    __declspec(property(get = m_color, put = SetColor)) COLORREF color;
 
    unsigned SetSize(unsigned value) { return m_size = value, update(), m_size; }
    __declspec(property(get = m_size, put = SetSize)) unsigned size;
 
    const std::string& SetName(const std::string& value) { return m_name = value, update(), m_name; }
    __declspec(property(get = m_name, put = SetName)) const std::string& name;
 
    bool SetBold(bool value) { return m_bold = value, update(), m_bold; }
    __declspec(property(get = m_bold, put = SetBold)) bool bold;
 
    bool SetItalic(bool value) { return m_italic = value, update(), m_italic; }
    __declspec(property(get = m_italic, put = SetItalic)) bool italic;
 
    bool SetUnderline(bool value) { return m_underline = value, update(), m_underline; }
    __declspec(property(get = m_underline, put = SetUnderline)) bool underline;
 
    bool SetStrikeout(bool value) { return m_strikeout = value, update(), m_strikeout; }
    __declspec(property(get = m_strikeout, put = SetStrikeout)) bool strikeout;
 
    double SetOrientation(double value) { return m_orientation = value, update(), m_orientation; }
    __declspec(property(get = m_orientation, put = SetOrientation)) bool orientation;
};
щас дописываю Font и займусь Pen, Brush и Canvas собственно

з.ы. зацените
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2014, 15:03
Ответы с готовыми решениями:

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

Библиотека для работы с графикой и текстом С++
Всем привет! Решил написать игру, в которой пользователь должен с клавиатуры писать команды роботу,...

Что лучше начать изучать для работы с 3D графикой?
Какой язык, фреймворк будет удобнее для разработки приложений, работающих с 3D графикой программно?...

Code::Blocks подключение библиотек для работы с графикой
Взялся за графику, первая простенькая cpp с тремя строчками для настройки так сказать И сразу...

40
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.10.2014, 17:22  [ТС] 21
Author24 — интернет-сервис помощи студентам
0x10, наверное is_enum бы подошло, только я че то не понял почему там в примере в 4 строке выводит false? что int это не перечисляемый тип?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.10.2014, 17:24 22
Цитата Сообщение от GetHelp Посмотреть сообщение
что int это не перечисляемый тип?
Вполне логично, что нет.
Еще можно было бы посмотреть на std::enable_if, но я прост боюсь, что это совсем порвет шаблон.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.10.2014, 17:25  [ТС] 23
Цитата Сообщение от 0x10 Посмотреть сообщение
Вполне логично, что нет.
ахаха с какой стати? а что же по вашему считать перечисляемым типом если int уже не перечисляемый? что за бред !
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.10.2014, 17:28 24
Цитата Сообщение от GetHelp Посмотреть сообщение
а что же по вашему считать перечисляемым типом если int уже не перечисляемый?
enum, enum class.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.10.2014, 17:29 25
Цитата Сообщение от Voivoid Посмотреть сообщение
Кстати нет у кого каких идей на тему возможности сделать strong typedef? В частности для типов Position и Size.
Заинтересовало. А что конкретно хочется сделать? И чем не подходит что-то вроде http://www.boost.org/doc/libs/... ypedef.hpp?
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.10.2014, 18:02  [ТС] 26
кажется мне подойдет is_arithmetic

Добавлено через 32 минуты
значит так вот что вышло:
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
//Класс определяет точку в двухмерной системе координат
template <typename T>
struct Point
{
    //Координаты точки
    T x, y;
 
    //Конструктор по умолчанию
    Point()
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            x = 0, y = 0;
    }
 
    //Конструктор, задающий координаты
    Point(T x, T y)
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            this->x = x, this->y = y;
    }
 
    //Конструктор копирования из объекта POINT
    Point(const POINT& point)
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            x = point.x, y = point.y;
    }
 
    //Конструктор копирования из объекта Point
    Point(const Point& point)
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            x = point.x, y = point.y;
    }
 
    //Функция возвращает объект POINT с координатами текущего объекта
    POINT tagPOINT() const { return { x, y }; }
 
    //Перегруженный оператор = для объекта POINT
    Point<T> &operator = (const POINT& pt)
    {
        x = pt.x, y = pt.y;
        return *this;
    }
 
    //Перегруженный оператор = для объекта Point
    Point<T> &operator = (const Point& pt)
    {
        x = pt.x, y = pt.y;
        return *this;
    }
 
    //Перегруженный оператор == для объекта POINT
    bool operator == (const POINT& pt) const
    {
        return x == pt.x && y == pt.y;
    }
 
    //Перегруженный оператор == для объекта Point
    bool operator == (const Point<T> &pt) const
    {
        return x == pt.x && y == pt.y;
    }
};
 
//Класс определяет область в двухмерной системе координат
template <typename T>
struct Rect
{
    //Координаты области
    T left, top, right, bottom;
 
    //Конструктор по умолчанию
    Rect()
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            left = 0, top = 0, right = 0, bottom = 0;
    }
 
    //Конструктор, задающий координаты
    Rect(T left, T top, T right, T bottom)
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            this->left = left, this->top = top, this->right = right, this->bottom = bottom;
    }
 
    //Конструктор, задающий координаты из двух точек класса POINT
    Rect(const POINT& lt, const POINT& rb)
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            left = lt.x, top = lt.y, right = rb.x, bottom = rb.y;
    }
 
    //Конструктор, задающий координаты из двух точек класса Point
    Rect(const Point<T> &lt, const Point<T> &rb)
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            left = lt.x, top = lt.y, right = rb.x, bottom = rb.y;
    }
 
    //Конструктор копирования из объекта RECT
    Rect(const RECT& rect)
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            left = rect.left top = rect.top, right = rect.right, bottom = rect.bottom;
    }
 
    //Конструктор копирования из объекта Rect
    Rect(const Rect<T> &rect)
    {
        if (!std::is_arithmetic<T>::value)
            throw std::exception("Type is not arithmetical");
        else
            left = rect.left top = rect.top, right = rect.right, bottom = rect.bottom;
    }
 
    //Функция возвращает объект RECT с координатами текущего объекта
    RECT tagRECT() const { return { left, top, right, bottom }; }
 
    //Функция возвращает объект Point, с координатами левой верхней точки области
    Point<T> LeftTop() const { return Point<T>(left, top); }
 
    //Функция возвращает объект Point, с координатами правой нижей точки области
    Point<T> RightBottom() const { return Point<T>(right, bottom); }
 
    //Функция возвращает ширину области
    T width() const { return right - left; }
 
    //Функция возвращает высоту области
    T height() const { return bottom - top; }
 
    //Перегруженный оператор = для объекта RECT
    Rect<T> &operator = (const RECT& rc)
    {
        left = rc.left, top = rc.top, right = rc.right, bottom = rc.bottom;
        return *this;
    }
 
    //Перегруженный оператор = для объекта Rect
    Rect<T> &operator = (const Rect<T> &rc)
    {
        left = rc.left, top = rc.top, right = rc.right, bottom = rc.bottom;
        return *this;
    }
 
    //Перегруженный оператор == для объекта RECT
    bool operator == (const RECT& rc) const
    {
        return left == rc.left && top == rc.top && right == rc.right && bottom == rc.bottom;
    }
 
    //Перегруженный оператор == для объекта Rect
    bool operator == (const Rect<T> &rc) const
    {
        return left == rc.left && top == rc.top && right == rc.right && bottom == rc.bottom;
    }
};
 
//Класс определяет составляющие цвета в системе RGB
struct HRGB
{
    //Составляющие цвета
    unsigned char r, g, b;
 
    //Конструктор по умолчанию
    HRGB() : r(0), g(0), b(0) {}
 
    //Конструктор, задающий составляющие цвета
    HRGB(unsigned char r, unsigned char g, unsigned char b) : r(r), g(g), b(b) {}
 
    //Конструктор, задающий составляющие цвета из значения типа COLORREF
    HRGB(COLORREF color) : r(GetRValue(color)), g(GetGValue(color)), b(GetBValue(color)) {}
 
    //Конструктор копирования из объекта HRGB
    HRGB(const HRGB& rgb) : r(rgb.r), g(rgb.g), b(rgb.b) {}
 
    //Функция возвращает значение цвета типа HRGB, соответствующее составляющим
    COLORREF color() const { return RGB(r, g, b); }
 
    //Перегруженный оператор = для значения типа COLORREF
    HRGB& operator = (COLORREF color)
    {
        r = GetRValue(color);
        g = GetGValue(color);
        b = GetBValue(color);
        return *this;
    }
 
    //Перегруженный оператор = для объекта HRGB
    HRGB& operator = (const HRGB& rgb) { return r = rgb.r, g = rgb.g, b = rgb.b, *this; }
 
    //Перегруженный оператор == для объекта HRGB
    bool operator == (const HRGB& rgb) const { return r == rgb.r && g == rgb.g && b == rgb.b; }
};
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.10.2014, 18:04 27
GetHelp, не, это ж сделано для того, чтобы реализовывать проверки на этапе компиляции. Потому и сказал смотреть на static_assert и enable_if
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.10.2014, 18:05  [ТС] 28
Цитата Сообщение от 0x10 Посмотреть сообщение
GetHelp, не, это ж сделано для того, чтобы реализовывать проверки на этапе компиляции. Потому и сказал смотреть на static_assert и enable_if
а у меня что? и потом у меня все работает...
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.10.2014, 18:10 29
Цитата Сообщение от GetHelp Посмотреть сообщение
а у меня что? и потом у меня все работает...
Исключение времени выполнения. Что хуже ошибки этапа компиляции.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.10.2014, 18:17  [ТС] 30
Цитата Сообщение от 0x10 Посмотреть сообщение
Исключение времени выполнения. Что хуже ошибки этапа компиляции.
согласен, ошибка компиляции смотрелась бы лучше... тогда подскажите как заюзать этот static_assert? я че то никак не врублюсь...
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.10.2014, 18:21 31
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <type_traits>
 
template<typename T>
struct Test {
    static_assert(std::is_arithmetic<T>::value, "T must be arithmetic type");   
};
 
int main() {
    // Ok
    Test<int> obj;
    
    // Compilation error
    // Test<std::ostream> obj2;
}
Добавлено через 3 минуты
Хм... По ссылке, кстати, пример был.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.10.2014, 18:38  [ТС] 32
0x10, воо тема !!! спс
Цитата Сообщение от 0x10 Посмотреть сообщение
Хм... По ссылке, кстати, пример был.
да я просто не допер что мне надо все также юзать std::is_arithmetic там были какие то std::is_copy_constructible и т.п. я и сбился с толку...

Добавлено через 5 минут
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
//Класс определяет точку в двухмерной системе координат
template <typename T>
struct Point
{
    static_assert(std::is_arithmetic<T>::value, "Type is not arithmetical");
 
    //Координаты точки
    T x, y;
 
    //Конструктор по умолчанию
    Point() : x(0), y(0) {}
 
    //Конструктор, задающий координаты
    Point(T x, T y) : x(x), y(y) {}
 
    //Конструктор копирования из объекта POINT
    Point(const POINT& point) : x(point.x), y(point.y) {}
 
    //Конструктор копирования из объекта Point
    Point(const Point& point) : x(point.x), y(point.y) {}
 
    //Функция возвращает объект POINT с координатами текущего объекта
    POINT tagPOINT() const { return { x, y }; }
 
    //Перегруженный оператор = для объекта POINT
    Point<T> &operator = (const POINT& pt)
    {
        x = pt.x, y = pt.y;
        return *this;
    }
 
    //Перегруженный оператор = для объекта Point
    Point<T> &operator = (const Point& pt)
    {
        x = pt.x, y = pt.y;
        return *this;
    }
 
    //Перегруженный оператор == для объекта POINT
    bool operator == (const POINT& pt) const
    {
        return x == pt.x && y == pt.y;
    }
 
    //Перегруженный оператор == для объекта Point
    bool operator == (const Point<T> &pt) const
    {
        return x == pt.x && y == pt.y;
    }
};
 
//Класс определяет область в двухмерной системе координат
template <typename T>
struct Rect
{
    static_assert(std::is_arithmetic<T>::value, "Type is not arithmetical");
 
    //Координаты области
    T left, top, right, bottom;
 
    //Конструктор по умолчанию
    Rect() : left(0), top(0), right(0), bottom(0) {}
 
    //Конструктор, задающий координаты
    Rect(T left, T top, T right, T bottom) : left(left), top(top), right(right), bottom(bottom) {}
 
    //Конструктор, задающий координаты из двух точек класса POINT
    Rect(const POINT& lt, const POINT& rb) : left(lt.x), top(lt.y), right(rb.x), bottom(rb.y) {}
 
    //Конструктор, задающий координаты из двух точек класса Point
    Rect(const Point<T> &lt, const Point<T> &rb) : left(lt.x), top(lt.y), right(rb.x), bottom(rb.y) {}
 
    //Конструктор копирования из объекта RECT
    Rect(const RECT& rect) : left(rect.left), top(rect.top), right(rect.right), bottom(rect.bottom) {}
 
    //Конструктор копирования из объекта Rect
    Rect(const Rect<T> &rect) : left(rect.left), top(rect.top), right(rect.right), bottom(rect.bottom) {}
 
    //Функция возвращает объект RECT с координатами текущего объекта
    RECT tagRECT() const { return { left, top, right, bottom }; }
 
    //Функция возвращает объект Point, с координатами левой верхней точки области
    Point<T> LeftTop() const { return Point<T>(left, top); }
 
    //Функция возвращает объект Point, с координатами правой нижей точки области
    Point<T> RightBottom() const { return Point<T>(right, bottom); }
 
    //Функция возвращает ширину области
    T width() const { return right - left; }
 
    //Функция возвращает высоту области
    T height() const { return bottom - top; }
 
    //Перегруженный оператор = для объекта RECT
    Rect<T> &operator = (const RECT& rc)
    {
        left = rc.left, top = rc.top, right = rc.right, bottom = rc.bottom;
        return *this;
    }
 
    //Перегруженный оператор = для объекта Rect
    Rect<T> &operator = (const Rect<T> &rc)
    {
        left = rc.left, top = rc.top, right = rc.right, bottom = rc.bottom;
        return *this;
    }
 
    //Перегруженный оператор == для объекта RECT
    bool operator == (const RECT& rc) const
    {
        return left == rc.left && top == rc.top && right == rc.right && bottom == rc.bottom;
    }
 
    //Перегруженный оператор == для объекта Rect
    bool operator == (const Rect<T> &rc) const
    {
        return left == rc.left && top == rc.top && right == rc.right && bottom == rc.bottom;
    }
};
 
//Класс определяет составляющие цвета в системе RGB
struct HRGB
{
    //Составляющие цвета
    unsigned char r, g, b;
 
    //Конструктор по умолчанию
    HRGB() : r(0), g(0), b(0) {}
 
    //Конструктор, задающий составляющие цвета
    HRGB(unsigned char r, unsigned char g, unsigned char b) : r(r), g(g), b(b) {}
 
    //Конструктор, задающий составляющие цвета из значения типа COLORREF
    HRGB(COLORREF color) : r(GetRValue(color)), g(GetGValue(color)), b(GetBValue(color)) {}
 
    //Конструктор копирования из объекта HRGB
    HRGB(const HRGB& rgb) : r(rgb.r), g(rgb.g), b(rgb.b) {}
 
    //Функция возвращает значение цвета типа HRGB, соответствующее составляющим
    COLORREF color() const { return RGB(r, g, b); }
 
    //Перегруженный оператор = для значения типа COLORREF
    HRGB& operator = (COLORREF color)
    {
        r = GetRValue(color);
        g = GetGValue(color);
        b = GetBValue(color);
        return *this;
    }
 
    //Перегруженный оператор = для объекта HRGB
    HRGB& operator = (const HRGB& rgb)
    {
        r = rgb.r, g = rgb.g, b = rgb.b;
        return *this;
    }
 
    //Перегруженный оператор == для объекта HRGB
    bool operator == (const HRGB& rgb) const
    {
        return r == rgb.r && g == rgb.g && b == rgb.b;
    }
};
Добавлено через 7 минут
а HRGB вообще кто нибудь заметил? там я думаю нет смысла в шаблонах, ибо RGB то уж точно всегда целочисленное значение... вообще меня немного напрягает название... просто макрос RGB по дефолту уже забит -_- вот думаю может написать что то типа #undef RGB и назваться RGB?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.10.2014, 18:45 33
Цитата Сообщение от GetHelp Посмотреть сообщение
просто макрос RGB по дефолту уже забит
Поскольку макросы зачастую пишутся в верхнем регистре, struct Rgb и нет проблем. Если будет конфликтовать с функциями/другими классами - можно завернуть в неймспейс.

Добавлено через 4 минуты
Хм... Что-то я все не спрашиваю. А зачем всем этим классам написаны конструкторы копирования и операторы присваивания? И тот и другой генерируются по умолчанию, и в них нет логики, отличающейся от дефолтной.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
03.10.2014, 14:41  [ТС] 34
Цитата Сообщение от 0x10 Посмотреть сообщение
И тот и другой генерируются по умолчанию
че реально?

Добавлено через 1 час 39 минут
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
class Font
{
private:
    HFONT m_font;
    HDC m_dc;
    std::string m_name;
    unsigned m_size;
    bool m_bold;
    bool m_italic;
    bool m_underline;
    bool m_strikeout;
    double m_orientation;
    COLORREF m_color;
    DWORD m_charset;
 
    void update()
    {
        SetTextColor(m_dc, m_color);
        DeleteObject(m_font);
        m_font = CreateFont( m_size,
                             0,
                             static_cast<int>(m_orientation * 10),
                             0,
                             m_bold ? FW_BOLD : FW_NORMAL,
                             m_italic,
                             m_underline,
                             m_strikeout,
                             m_charset,
                             OUT_DEFAULT_PRECIS,
                             CLIP_DEFAULT_PRECIS,
                             PROOF_QUALITY,
                             DEFAULT_PITCH | FF_DONTCARE,
                             AnsiStringToWide(m_name).c_str());
        SelectObject(m_dc, m_font);
    }
public:
    explicit Font(HDC dc = 0)
    {
        m_font = 0;
        m_dc = dc;
        m_name = "";
        m_size = 20;
        m_bold = false;
        m_italic = false;
        m_strikeout = false;
        m_underline = false;
        m_orientation = 0;
        m_color = 0x000000;
        m_charset = DEFAULT_CHARSET;
        SetBkMode(m_dc, TRANSPARENT);
        update();
    }
 
    ~Font() { DeleteObject(m_font); }
 
    HFONT SetFont(HFONT font) { return m_font = font, SelectObject(m_dc, m_font), m_font; }
    __declspec(property(get = m_font, put = SetFont)) HFONT hfont;
 
    HDC SetDC(HDC value) { return m_dc = value, update(), m_dc; }
    __declspec(property(get = m_dc, put = SetDC)) HDC dc;
 
    DWORD SetCharset(DWORD value) { m_charset = value, update(); }
    __declspec(property(get = m_charset, put = SetCharset)) DWORD charset;
 
    COLORREF SetColor(COLORREF value) { return m_color = value, update(), m_color; }
    __declspec(property(get = m_color, put = SetColor)) COLORREF color;
 
    unsigned SetSize(unsigned value) { return m_size = value, update(), m_size; }
    __declspec(property(get = m_size, put = SetSize)) unsigned size;
 
    const std::string& SetName(const std::string& value) { return m_name = value, update(), m_name; }
    __declspec(property(get = m_name, put = SetName)) const std::string& name;
 
    bool SetBold(bool value) { return m_bold = value, update(), m_bold; }
    __declspec(property(get = m_bold, put = SetBold)) bool bold;
 
    bool SetItalic(bool value) { return m_italic = value, update(), m_italic; }
    __declspec(property(get = m_italic, put = SetItalic)) bool italic;
 
    bool SetUnderline(bool value) { return m_underline = value, update(), m_underline; }
    __declspec(property(get = m_underline, put = SetUnderline)) bool underline;
 
    bool SetStrikeout(bool value) { return m_strikeout = value, update(), m_strikeout; }
    __declspec(property(get = m_strikeout, put = SetStrikeout)) bool strikeout;
 
    double SetOrientation(double value) { return m_orientation = value, update(), m_orientation; }
    __declspec(property(get = m_orientation, put = SetOrientation)) double orientation;
};
 
class Pen
{
private:
    HPEN m_pen;
    HDC m_dc;
    COLORREF m_color;
    int m_width;
    int m_style;
 
    void update()
    {
        DeleteObject(m_pen);
        m_pen = CreatePen(m_style, m_width, m_color);
        SelectObject(m_dc, m_pen);
    }
public:
    explicit Pen(HDC dc = 0)
    {
        m_pen = 0;
        m_dc = dc;
        m_color = 0x000000;
        m_width = 1;
        m_style = PS_SOLID;
        update();
    }
 
    ~Pen() { DeleteObject(m_pen); }
 
    HPEN SetPen(HPEN pen) { return m_pen = pen, SelectObject(m_dc, m_pen), m_pen; }
    __declspec(property(get = m_pen, put = SetPen)) HPEN hpen;
 
    HDC SetDC(HDC value) { return m_dc = value, update(), m_dc; }
    __declspec(property(get = m_dc, put = SetDC)) HDC dc;
 
    COLORREF SetColor(COLORREF value) { return m_color = value, update(), m_color; }
    __declspec(property(get = m_color, put = SetColor)) COLORREF color;
 
    int SetWidth(int value) { return m_width = value, update(), m_width; }
    __declspec(property(get = m_width, put = SetWidth)) int width;
 
    int SetStyle(int value) { return m_style = value, update(), m_style; }
    __declspec(property(get = m_style, put = SetStyle)) int style;
};
Добавлено через 17 часов 40 минут
короче зацените уже !

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
class Font
{
private:
    HFONT m_font;
    HDC m_dc;
    std::string m_name;
    unsigned m_size;
    bool m_bold;
    bool m_italic;
    bool m_underline;
    bool m_strikeout;
    double m_orientation;
    COLORREF m_color;
    DWORD m_charset;
 
    void update()
    {
        SetTextColor(m_dc, m_color);
        DeleteObject(m_font);
        m_font = CreateFont( m_size,
                             0,
                             static_cast<int>(m_orientation * 10),
                             0,
                             m_bold ? FW_BOLD : FW_NORMAL,
                             m_italic,
                             m_underline,
                             m_strikeout,
                             m_charset,
                             OUT_DEFAULT_PRECIS,
                             CLIP_DEFAULT_PRECIS,
                             PROOF_QUALITY,
                             DEFAULT_PITCH | FF_DONTCARE,
                             AnsiStringToWide(m_name).c_str());
        SelectObject(m_dc, m_font);
    }
public:
    explicit Font(HDC dc = 0)
    {
        m_font = 0;
        m_dc = dc;
        m_name = "";
        m_size = 20;
        m_bold = false;
        m_italic = false;
        m_strikeout = false;
        m_underline = false;
        m_orientation = 0;
        m_color = 0x000000;
        m_charset = DEFAULT_CHARSET;
        SetBkMode(m_dc, TRANSPARENT);
        update();
    }
 
    ~Font() { DeleteObject(m_font); }
 
    HFONT GetFont() { return m_font; }
    HFONT SetFont(HFONT font) { return m_font = font, SelectObject(m_dc, m_font), m_font; }
    __declspec(property(get = GetFont, put = SetFont)) HFONT hfont;
 
    HDC GetDC() { return m_dc; }
    HDC SetDC(HDC value) { return m_dc = value, update(), m_dc; }
    __declspec(property(get = m_dc, put = SetDC)) HDC dc;
 
    DWORD GetCharset() { return m_charset; }
    DWORD SetCharset(DWORD value) { return m_charset = value, update(), m_charset; }
    __declspec(property(get = GetCharset, put = SetCharset)) DWORD charset;
 
    COLORREF GetColor() { return m_color; }
    COLORREF SetColor(COLORREF value) { return m_color = value, update(), m_color; }
    __declspec(property(get = GetColor, put = SetColor)) COLORREF color;
 
    unsigned GetSize() { return m_size; }
    unsigned SetSize(unsigned value) { return m_size = value, update(), m_size; }
    __declspec(property(get = GetSize, put = SetSize)) unsigned size;
 
    const std::string& GetName() { return m_name; }
    const std::string& SetName(const std::string& value) { return m_name = value, update(), m_name; }
    __declspec(property(get = GetName, put = SetName)) const std::string& name;
 
    bool GetBold() { return m_bold; }
    bool SetBold(bool value) { return m_bold = value, update(), m_bold; }
    __declspec(property(get = GetBold, put = SetBold)) bool bold;
 
    bool GetItalic() { return m_italic; }
    bool SetItalic(bool value) { return m_italic = value, update(), m_italic; }
    __declspec(property(get = GetItalic, put = SetItalic)) bool italic;
 
    bool GetUnderline() { return m_underline; }
    bool SetUnderline(bool value) { return m_underline = value, update(), m_underline; }
    __declspec(property(get = GetUnderline, put = SetUnderline)) bool underline;
 
    bool GetStrikeout() { return m_strikeout; }
    bool SetStrikeout(bool value) { return m_strikeout = value, update(), m_strikeout; }
    __declspec(property(get = GetStrikeout, put = SetStrikeout)) bool strikeout;
 
    double GetOrientation() { return m_orientation; }
    double SetOrientation(double value) { return m_orientation = value, update(), m_orientation; }
    __declspec(property(get = GetOrientation, put = SetOrientation)) double orientation;
};
 
class Pen
{
private:
    HPEN m_pen;
    HDC m_dc;
    COLORREF m_color;
    int m_width;
    int m_style;
 
    void update()
    {
        DeleteObject(m_pen);
        m_pen = CreatePen(m_style, m_width, m_color);
        SelectObject(m_dc, m_pen);
    }
public:
    explicit Pen(HDC dc = 0)
    {
        m_pen = 0;
        m_dc = dc;
        m_color = 0x000000;
        m_width = 1;
        m_style = PS_SOLID;
        update();
    }
 
    ~Pen() { DeleteObject(m_pen); }
 
    HPEN SetPen(HPEN pen) { return m_pen = pen, SelectObject(m_dc, m_pen), m_pen; }
    __declspec(property(get = m_pen, put = SetPen)) HPEN hpen;
 
    HDC GetDC() { return m_dc; }
    HDC SetDC(HDC value) { return m_dc = value, update(), m_dc; }
    __declspec(property(get = m_dc, put = SetDC)) HDC dc;
 
    COLORREF GetColor() { return m_color; }
    COLORREF SetColor(COLORREF value) { return m_color = value, update(), m_color; }
    __declspec(property(get = GetColor, put = SetColor)) COLORREF color;
 
    int GetWidth() { return m_width; }
    int SetWidth(int value) { return m_width = value, update(), m_width; }
    __declspec(property(get = GetWidth, put = SetWidth)) int width;
 
    int GetStyle() { return m_style; }
    int SetStyle(int value) { return m_style = value, update(), m_style; }
    __declspec(property(get = GetStyle, put = SetStyle)) int style;
};
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
03.10.2014, 14:59  [ТС] 35
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
class Brush
{
private:
    HBRUSH m_brush;
    HDC m_dc;
    LOGBRUSH m_lb;
    
    void update()
    {
        DeleteObject(m_brush);
        m_brush = CreateBrushIndirect(&m_lb);
        SelectObject(m_dc, m_brush);
    }
public:
    explicit Brush(HDC dc = 0)
    {
        m_brush = 0;
        m_dc = dc;
        m_lb.lbColor = 0xffffff;
        m_lb.lbStyle = BS_SOLID;
        m_lb.lbHatch = 0;
        update();
    }
 
    ~Brush() { DeleteObject(m_brush); }
 
    HBRUSH GetBrush() { return m_brush; }
    HBRUSH SetBrush(HBRUSH brush) { return m_brush = brush, SelectObject(m_dc, m_brush), m_brush; }
    __declspec(property(get = GetBrush, put = SetBrush)) HBRUSH hbrush;
 
    HDC GetDC() { return m_dc; }
    HDC SetDC(HDC value) { return m_dc = value, update(), m_dc; }
    __declspec(property(get = m_dc, put = SetDC)) HDC dc;
 
    COLORREF GetColor() { return m_lb.lbColor; }
    COLORREF SetColor(COLORREF value) { return m_lb.lbColor = value, update(), m_lb.lbColor; }
    __declspec(property(get = GetColor, put = SetColor)) COLORREF color;
 
    unsigned GetStyle() { return m_lb.lbStyle; }
    unsigned SetStyle(unsigned value) { return m_lb.lbStyle = value, update(), m_lb.lbStyle; }
    __declspec(property(get = GetStyle, put = SetStyle)) unsigned style;
 
    long GetHatch() { return m_lb.lbHatch; }
    long SetHatch(long value) { return m_lb.lbHatch = value, update(), m_lb.lbHatch; }
    __declspec(property(get = GetHath, put = SetHatch)) long hatch;
};
 
class Canvas
{
private:
    HDC m_dc;
    Point<int> m_pos;
public:
    Font font;
    Pen pen;
    Brush brush;
 
    Canvas(HDC dc = 0) : m_dc(dc), font(dc), pen(dc), brush(dc) {}
 
    HDC GetDC() { return m_dc; }
    HDC SetDC(HDC value)
    {
        m_dc = value, font.dc = value, pen.dc = value, brush.dc = value;
        return m_dc;
    }
    __declspec(property(get = GetDC, put = SetDC)) HDC dc;
 
    COLORREF GetPixel(int x, int y) { return ::GetPixel(m_dc, x, y); }
    COLORREF GetPixel(const Point<int> &point) { return GetPixel(point.x, point.y); }
 
    COLORREF SetPixel(int x, int y, COLORREF color) { return ::SetPixel(m_dc, x, y, color); }
    COLORREF SetPixel(const Point<int> &point, COLORREF color) { return SetPixel(point.x, point.y, color); }
 
    __declspec(property(get = GetPixel, put = SetPixel)) COLORREF pixels[][];
 
    bool FloodFill(int x, int y, COLORREF color) { return ::FloodFill(m_dc, x, y, color); }
    bool FloodFill(const Point<int> &point, COLORREF color) { return FloodFill(point.x, point.y, color); }
 
    int FillRect(const Rect<int> &rect, COLORREF color)
    {
        brush.color = color;
        return ::FillRect(m_dc, &RECT(rect.tagRECT()), brush.hbrush);
    }
 
    int FillRect(int left, int top, int right, int bottom, COLORREF color)
    {
        return FillRect({ left, top, right, bottom }, color);
    }
 
    bool TextOut(int x, int y, const std::string& text)
    {
        std::wstring wtext = AnsiStringToWide(text);
        return ::TextOut(m_dc, x, y, wtext.c_str(), wtext.length());
    }
 
    bool TextOut(const Point<int> &point, const std::string& text) { return TextOut(point.x, point.y, text); }
 
    //bool TextRect(const Rect<int> &rect, const std::string& text) { return TextOut(); }
 
    bool MoveTo(int x, int y) { return m_pos.x = x, m_pos.y = y, ::MoveToEx(m_dc, x, y, 0); }
    bool MoveTo(const Point<int> &point) { return MoveTo(point.x, point.y); }
 
    bool LineTo(int x, int y) { return m_pos.x = x, m_pos.y = y, ::LineTo(m_dc, x, y); }
    bool LineTo(const Point<int> &point) { return LineTo(point.x, point.y); }
 
    bool Line(const Point<int> &point0, const Point<int> &point1) { return MoveTo(point1), LineTo(point1); }
 
    const Point<int> &GetPos() const { return m_pos; }
    const Point<int> &SetPos(const Point<int> &pos) { return m_pos = pos, MoveTo(pos), m_pos; }
    __declspec(property(get = GetPos, put = SetPos)) Point<int> &PenPos;
 
    bool Arc(const Point<int> &pt1, const Point<int> &pt2, const Point<int> &pt3, const Point<int> &pt4)
    {
        return ::Arc(m_dc, pt1.x, pt1.y, pt2.x, pt2.y, pt3.x, pt3.y, pt4.x, pt4.y);
    }
 
    bool Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
        return ::Arc(m_dc, x1, y1, x2, 2, x3, y3, x4, y4);
    }
 
    bool Chord(const Point<int> &pt1, const Point<int> &pt2, const Point<int> &pt3, const Point<int> &pt4)
    {
        return ::Chord(m_dc, pt1.x, pt1.y, pt2.x, pt2.y, pt3.x, pt3.y, pt4.x, pt4.y);
    }
 
    bool Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
        return ::Chord(m_dc, x1, y1, x2, 2, x3, y3, x4, y4);
    }
 
    int FrameRect(const Rect<int> &rect) { return ::FrameRect(m_dc, &RECT(rect.tagRECT()), brush.hbrush); }
    int FrameRect(int left, int top, int right, int bottom) { return FrameRect({ left, top, right, bottom }); }
 
    bool Rectangle(int left, int top, int right, int bottom) { return ::Rectangle(m_dc, left, top, right, bottom); }
    bool Rectangle(const Rect<int> &rect) { return Rectangle(rect.left, rect.top, rect.right, rect.bottom); }
 
    bool Ellipse(int left, int top, int right, int bottom) { return ::Ellipse(m_dc, left, top, right, bottom); }
    bool Ellipse(const Rect<int> &rect) { return Ellipse(rect.left, rect.top, rect.right, rect.bottom); }
 
    bool RoundRect(const Rect<int> &rect, size_t width, size_t height)
    {
        return ::RoundRect(m_dc, rect.left, rect.top, rect.right, rect.bottom, width, height);
    }
 
    bool RoundRect(int left, int top, int right, int bottom, int width, int height)
    {
        return ::RoundRect(m_dc, left, top, right, bottom, width, height);
    }
 
    //bool Polygon(const std::vector<POINT> points) { return ::Polygon(m_dc, &points[0], points.size()); }
    bool Polygon(const std::vector<Point<int>> points)
    {
        if (!points.size()) return false;
        for (int i = 0; i < points.size() - 1; i++)
            Line(points[i], points[i+1]);
        LineTo(points[0]);
        return true;
    }
 
    bool Polyline(const std::vector<Point<int>> points)
    {
        if (!points.size()) return false;
        for (int i = 0; i < points.size() - 1; i++)
            Line(points[i], points[i + 1]);
        return true;
    }
};
там еще конечно до ума надо доводить, но в целом очень даже похоже

Добавлено через 17 минут
известные проблемы:
1. не робит нормально полигон, полилайн: хз почему... рисует только линию от последней точки до первой... там вообще то есть апишные эти функции, но туда было геморно подавать массив, надо было обязательно POINT и я решил не париться и написать свои...
2. не знаю пока как запилить TextRect
3. не знаю пока как запилить CopyRect
4. у Brush в делфи было свойство BITMAP позволяющее рисовать кистью с узором из битмапа, в винапи нашел что то похожее, но пока не разобрался как это присобачить...
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
03.10.2014, 15:32 36
Как тянет то тебя запятые использовать вместо ';'... Нехорошо это.
А комментарии конечно хорошо, но только там, где они нужны.
Неужели никто не поймет, что
C++
1
    Point(T x, T y) : x(x), y(y) {}
- Конструктор, задающий координаты, а
C++
1
    Point<T> &operator = (const POINT& pt)
- Перегруженный оператор = для объекта POINT?
А насчет гитхаба (или просто локальной системы контроля версий) - вот будешь писать что-нибудь важное, что-нибудь произойдет с компом (свет выключат, или еще чего - в общем, любой форс-мажор) - потеряешь несколько дней работы... И тогда поймешь, для чего это нужно) Но пока на собственном опыте такое не испытаешь, не поверишь, по себе сужу)
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
03.10.2014, 15:35  [ТС] 37
Цитата Сообщение от monolit Посмотреть сообщение
Неужели никто не поймет, что
да так уж чтоб везде одинаково было...

Цитата Сообщение от monolit Посмотреть сообщение
А насчет гитхаба (или просто локальной системы контроля версий) - вот будешь писать что-нибудь важное, что-нибудь произойдет с компом (свет выключат, или еще чего - в общем, любой форс-мажор) - потеряешь несколько дней работы... И тогда поймешь, для чего это нужно) Но пока на собственном опыте такое не испытаешь, не поверишь, по себе сужу)
я сейчас для тебя открою новую вселенную, но все IDE умеют сохранять проект одним нажатием кнопки... достаточно лишь не забывать переодически ее нажимать...
0
0x10
03.10.2014, 17:09
  #38

Не по теме:

Цитата Сообщение от GetHelp Посмотреть сообщение
я сейчас для тебя открою новую вселенную, но все IDE умеют сохранять проект одним нажатием кнопки...
Локально. Работает до сдыхания винта. И не дает возможности откатиться на любую из предыдущих версий. Но это я так, на правах флуда.

0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
03.10.2014, 17:14  [ТС] 39
Цитата Сообщение от 0x10 Посмотреть сообщение
Локально. Работает до сдыхания винта. И не дает возможности откатиться на любую из предыдущих версий. Но это я так, на правах флуда.
какие шансы что винт внезапно сдохнет? винты вообще не сдыхают просто так с бухты барахты, да и всегда можно вытащить инфу если очень надо... а про откаты я сказал - бред это... чего там откатывать когда сам пишешь код? в крайнем случае можно сделать бэкап исходников перед какими то глобальными изменениями... но это уже для каких то сильно крупных проектов, так или иначе я не пишу пока что ничего настолько крупного... и вообще хватит флудить, лучше помогите доработать мои классы !
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
03.10.2014, 17:26 40
Я скажу даже больше - сегодняшние IDE и сохраняют автоматически каждые N минут. Но бывают ситуации, когда просто регулярное сохранение - не панацея. К примеру - перегрев и вырубание компьютера (было и такое) - в результате файл неправильно закрылся, все данные из него пропали, свежей резервной копии не было - в итоге потерял несколько дней работы... И это только один пример.
В общем, как я уже сказал, пока сам в такой ситуации не побываешь - будешь относиться скептически...
Это к твоему коду непосредственно не относится, так, на будущее...

Добавлено через 7 минут
Сообщение сильно запоздало...
0
03.10.2014, 17:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2014, 17:26
Помогаю со студенческими работами здесь

Подскажите кросплатформенную библиотеку для работы с графикой, с указанием преимуществ и недостатков
Доброго времени суток. Подскажите кросплатформеную библиотеку для работы с графикой, с указанием...

Нужно создать игру крестики-нолики с неограниченным полем, что выбрать для работы с графикой и окнами?
Нужно создать игру крестики-нолики с неограниченным полем, что выбрать для работы с графикой и...

Перегрузка арифметических операций для работы с объектами классов.
Создать класс Animal, содержащий следующие элементы: - поле «вес» float Mass; - поле «пол» ...

Создать иерархию классов для работы с комплексными числами
Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru