Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/48: Рейтинг темы: голосов - 48, средняя оценка - 4.69
7 / 4 / 0
Регистрация: 13.09.2013
Сообщений: 151

Как менять толщину и цвет линий по нажатию клавиши?

16.04.2014, 11:54. Показов 9423. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как менять толщину и цвет линий по нажатию клавиши:???
линии рисую мышкой
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.04.2014, 11:54
Ответы с готовыми решениями:

Менять цвет фона и линий по нажатию кнопки
Пробовал через ColorDialog, но ничего толкового не вышло

Как менять толщину линий графика?
Подскажите пожалуйста, как изменять толщину линии графика и толщину координатной сетки.

Макрос, изменяющий тип обрамления (а также толщину и цвет линий об-рамления) фрагмента текста
Нужно написать Макрос, изменяющий тип обрамления (а также толщину и цвет линий об-рамления) фрагмента текста.(Ворд) Составить программу...

8
Заблокирован
17.04.2014, 21:47
код показывай своего художезтва
0
7 / 4 / 0
Регистрация: 13.09.2013
Сообщений: 151
17.04.2014, 22:03  [ТС]
newbie666, преподаватель заставил перекроить код, так как ему были непонятны такие переменные line_prev ..и тд. заставили hdc сделать глобальной. в общем программа вообще стала плохо работать, линии перестали рисоваться протягиванием, в общем стали плохо рисоваться. были не статичны, но это я исправила. все равно, как-то упорото рисуются. А все началось с того, что преподаватель сказал сделать изменение цвета и толщины пера по нажатию кнопки, в итоге влез в код, теперь я сама в нем не могу разобраться

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
#include <windows.h>
#include <math.h>
 
HDC hDC;
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("Вход"), TEXT("Начать рисование"), 0);
 
 
    WNDCLASSEX WindowClass;
 
    static LPCTSTR szAppName = L"OFWin";
    HWND hWnd;
    MSG msg;
    WNDCLASSEX wc;
    
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_HAND);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITENESS));
    wc.lpszMenuName = 0;
    wc.lpszClassName = szAppName;
    wc.hIconSm = 0;
 
    RegisterClassEx(&wc);
    hWnd = CreateWindow(szAppName, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance,  0);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    hDC = GetDC(hWnd);
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return static_cast<int>(msg.wParam);
}
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
    PAINTSTRUCT PaintSt;
    RECT aRect;
    static int x, y, x1, y1, x2, y2;
    //static bool line_prev = false;
    switch (message)
    
    {//
    
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &PaintSt);
        GetClientRect(hWnd, &aRect);
        SetBkMode(hDC, TRANSPARENT);
        DrawText(hDC, L"Рисовалка", -1, &aRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
    
        HBRUSH hBrush; //создаём объект-кисть
        CreateSolidBrush(RGB(255, 0, 67)); //задаём сплошную кисть, закрашенную цветом RGB
        hBrush = CreateHatchBrush(HS_FDIAGONAL, RGB(255, 10, 20));
        SelectObject(hDC, hBrush);
        Ellipse(hDC, 100, 100, 200, 300);
 
 
        HPEN hPen1, hPen2, hPen3; //объявляем сразу три объекта-пера
        hPen1 = CreatePen(PS_DASHDOT, 1, RGB(0, 0, 255)); //создаём всё три
        hPen2 = CreatePen(PS_DASH, 1, RGB(255, 0, 255));
        hPen3 = CreatePen(PS_DOT, 1, RGB(0, 128, 256));
 
        SelectObject(hDC, hPen1); //но в одним момент времени может быть только 1
        Rectangle(hDC, 10, 10, 100, 100); //рисуем фигуру соответствующим пером
 
        SelectObject(hDC, hPen2); //меняем перо
        Arc(hDC, 10, 20, 30, 40, 50, 60, 300, 400); //рисуем другим пером
 
        SelectObject(hDC, hPen3);
        RoundRect(hDC, 200, 100, 140, 150, 160, 170);
break;
    case WM_LBUTTONDOWN:
        x1 = LOWORD(lParam);
        y1 = HIWORD(lParam);
        MoveToEx(hDC, x1, y1, 0);
        
        
        break;
    case WM_MOUSEMOVE:
        if (wParam == MK_LBUTTON)
        {
        /*  
            SetROP2(hDC, R2_NOTXORPEN);
            if (line_prev)
            {
                
                LineTo(hDC, x2, y2);
            }
            x = LOWORD(lParam);
            y = HIWORD(lParam);*/
            MoveToEx(hDC, x1, y1, 0);
            
            //line_prev = true;
            x2 = x;
            y2 = y;
            //ReleaseDC(hWnd, hDC);
            
 
        }
        break;
    case WM_LBUTTONUP:
        //line_prev = false;
        x = LOWORD(lParam);
        y = HIWORD(lParam);
        LineTo(hDC, x, y);
        break;
    
    
    case WM_KEYDOWN:
        switch (wParam)
        {
    case VK_LEFT:
            HPEN hPen1; 
            MessageBox(0, __TEXT("hi"), 0, 0);
            hPen1 = CreatePen(PS_DASHDOT, 1, RGB(45, 50, 255));
            //if ((VK_LEFT) == VK_LEFT)
            SelectObject(hDC, hPen1);
 
        }
        //
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
 
 
}
Помогите,пожалуйста,исправить положение
0
Заблокирован
18.04.2014, 15:58
Лучший ответ Сообщение было отмечено aysium как решение

Решение

Слушай, ты меня конечно извини, но это такой г. код
Так что я не стал его трогать, а просто в таком же стиле добавил то, что тебе нужно
P.S.: цвет и толщину следующей линии менять щелчком по правой кнопке мышки.
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
#include <windows.h>
#include <math.h>
#include <string>
#include <sstream>
 
HDC hDC;
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
unsigned int lineWidth = 1;
COLORREF lineColor = RGB(0,0,0);
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("Вход"), TEXT("Начать рисование"), 0);
 
 
    WNDCLASSEX WindowClass;
 
    static LPCTSTR szAppName = L"OFWin";
    HWND hWnd;
    MSG msg;
    WNDCLASSEX wc;
    
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_HAND);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITENESS));
    wc.lpszMenuName = 0;
    wc.lpszClassName = szAppName;
    wc.hIconSm = 0;
 
    RegisterClassEx(&wc);
    hWnd = CreateWindow(szAppName, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance,  0);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    hDC = GetDC(hWnd);
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return static_cast<int>(msg.wParam);
}
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
    PAINTSTRUCT PaintSt;
    RECT aRect;
    static int x, y, x1, y1, x2, y2;
    //static bool line_prev = false;
    switch (message)
    
    {//
    
    case WM_PAINT:
        {
            hDC = BeginPaint(hWnd, &PaintSt);
            GetClientRect(hWnd, &aRect);
            SetBkMode(hDC, TRANSPARENT);
            DrawText(hDC, L"Рисовалка", -1, &aRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
            RECT widthRect = {300,0,480,50}, widthValueRect = {480,0,520,50},
                colorRect = {520,0,630,50}, colorValueRect = {630,0,900,50};
            
            RECT infoRect = {300,0,900,50};
            FillRect (hDC, &infoRect, (HBRUSH)(COLOR_WINDOW+1));
            DrawText(hDC, L"Текущая толщина линии:", -1, &widthRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
            DrawText(hDC, std::to_wstring(lineWidth).c_str(), -1, &widthValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);         
            DrawText(hDC, L"Текущий цвет:", -1, &colorRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
            std::wstringstream wss;
            wss << L"R: " << GetRValue(lineColor) << L" | " << L"G: " << GetGValue(lineColor) << L" | " << L"B: " << GetBValue(lineColor);
            DrawText(hDC, wss.str().c_str(), -1, &colorValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
 
 
            HBRUSH hBrush; //создаём объект-кисть
            CreateSolidBrush(RGB(255, 0, 67)); //задаём сплошную кисть, закрашенную цветом RGB
            hBrush = CreateHatchBrush(HS_FDIAGONAL, RGB(255, 10, 20));
            SelectObject(hDC, hBrush);
            Ellipse(hDC, 100, 100, 200, 300);
 
 
            HPEN hPen1, hPen2, hPen3; //объявляем сразу три объекта-пера
            hPen1 = CreatePen(PS_DASHDOT, 1, RGB(0, 0, 255)); //создаём всё три
            hPen2 = CreatePen(PS_DASH, 1, RGB(255, 0, 255));
            hPen3 = CreatePen(PS_DOT, 1, RGB(0, 128, 256));
 
            SelectObject(hDC, hPen1); //но в одним момент времени может быть только 1
            Rectangle(hDC, 10, 10, 100, 100); //рисуем фигуру соответствующим пером
 
            SelectObject(hDC, hPen2); //меняем перо
            Arc(hDC, 10, 20, 30, 40, 50, 60, 300, 400); //рисуем другим пером
 
            SelectObject(hDC, hPen3);
            RoundRect(hDC, 200, 100, 140, 150, 160, 170);
            //EndPaint(hWnd, &PaintSt);
        }
break;
    case WM_LBUTTONDOWN:
        x1 = LOWORD(lParam);
        y1 = HIWORD(lParam);
        MoveToEx(hDC, x1, y1, 0);       
        break;
    case WM_RBUTTONDOWN:
        {
            lineWidth = rand() % 19 + 1;
            lineColor = RGB(rand() % 255, rand() % 255, rand() % 255);
            InvalidateRect (hWnd, NULL, TRUE);          
        }
        break;
    case WM_MOUSEMOVE:
        if (wParam == MK_LBUTTON)
        {
        /*  
            SetROP2(hDC, R2_NOTXORPEN);
            if (line_prev)
            {
                
                LineTo(hDC, x2, y2);
            }
            x = LOWORD(lParam);
            y = HIWORD(lParam);*/
            MoveToEx(hDC, x1, y1, 0);
            
            //line_prev = true;
            x2 = x;
            y2 = y;
            //ReleaseDC(hWnd, hDC);
            
 
        }
        break;
    case WM_LBUTTONUP:
        {
            //line_prev = false;
            x = LOWORD(lParam);
            y = HIWORD(lParam);
            HPEN linePen;
            linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
            HGDIOBJ prevObj = SelectObject(hDC, linePen);   
            LineTo(hDC, x, y);
            SelectObject(hDC, prevObj);
            DeleteObject(linePen);
            InvalidateRect (hWnd, NULL, TRUE);  
        }
        break;
    
    
    case WM_KEYDOWN:
        switch (wParam)
        {
    case VK_LEFT:
            HPEN hPen1; 
            MessageBox(0, __TEXT("hi"), 0, 0);
            hPen1 = CreatePen(PS_DASHDOT, 1, RGB(45, 50, 255));
            //if ((VK_LEFT) == VK_LEFT)
            SelectObject(hDC, hPen1);
 
        }
        //
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
 
 
}
1
7 / 4 / 0
Регистрация: 13.09.2013
Сообщений: 151
18.04.2014, 16:07  [ТС]
newbie666, я понимаю, что Гэ,не в обиде ))Спасибо огромное, что помогли и уделили внимание!сча буду пробовать

Добавлено через 4 минуты
newbie666, ооо, вообще круто сделали)спасибки! сейчас буду что-то думать с линиями и немножко доделывать
0
7 / 4 / 0
Регистрация: 13.09.2013
Сообщений: 151
20.04.2014, 12:48  [ТС]
newbie666, снова нужна ваша помощь вроде обрабатывается, но результат не виден

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
#include <windows.h>
#include <math.h>
#include <string>
#include <sstream>
 
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
unsigned int lineWidth = 1;
COLORREF lineColor = RGB(0, 0, 0);
HDC hDC;
RECT rcClient;                 
POINT ptClientUL;             
POINT ptClientLR;              
static POINTS ptsBegin;       
static POINTS ptsEnd;         
static POINTS ptsPrevEnd;      
static BOOL fPrevLine = FALSE; 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("Вход"), TEXT("Начать рисование"), 0);
 
 
    WNDCLASSEX WindowClass;
 
    static LPCTSTR szAppName = L"WinApi";
    HWND hWnd;
    MSG msg;
    WNDCLASSEX wc;
 
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_HAND);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITENESS));
    wc.lpszMenuName = 0;
    wc.lpszClassName = szAppName;
    wc.hIconSm = 0;
 
    RegisterClassEx(&wc);
    hWnd = CreateWindow(szAppName, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    hDC = GetDC(hWnd);
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return static_cast<int>(msg.wParam);
}
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
    PAINTSTRUCT PaintSt;
    RECT aRect;
    switch (message)
 
    {
 
    case WM_PAINT:
    {
        hDC = BeginPaint(hWnd, &PaintSt);
        GetClientRect(hWnd, &aRect);
        SetBkMode(hDC, TRANSPARENT);
        DrawText(hDC, L"Рисовалка", -1, &aRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        RECT widthRect = { 300, 0, 480, 50 }, widthValueRect = { 480, 0, 520, 50 },
        colorRect = { 520, 0, 630, 50 }, colorValueRect = { 630, 0, 900, 50 };
 
        RECT infoRect = { 300, 0, 900, 50 };
        FillRect(hDC, &infoRect, (HBRUSH)(COLOR_WINDOW + 1));
        DrawText(hDC, L"Текущая толщина линии:", -1, &widthRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        DrawText(hDC, std::to_wstring(lineWidth).c_str(), -1, &widthValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        DrawText(hDC, L"Текущий цвет:", -1, &colorRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        std::wstringstream wss;
        wss << L"R: " << GetRValue(lineColor) << L" | " << L"G: " << GetGValue(lineColor) << L" | " << L"B: " << GetBValue(lineColor);
        DrawText(hDC, wss.str().c_str(), -1, &colorValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
 
 
        HBRUSH hBrush;
        CreateSolidBrush(RGB(255, 0, 67));
        hBrush = CreateHatchBrush(HS_FDIAGONAL, RGB(255, 10, 20));
        SelectObject(hDC, hBrush);
        Ellipse(hDC, 100, 100, 200, 300);
 
 
        HPEN hPen1, hPen2, hPen3;
        hPen1 = CreatePen(PS_DASHDOT, 1, RGB(0, 0, 255));
        hPen2 = CreatePen(PS_DASH, 1, RGB(255, 0, 255));
        hPen3 = CreatePen(PS_DOT, 1, RGB(0, 128, 256));
 
        SelectObject(hDC, hPen1);
        Rectangle(hDC, 10, 10, 100, 100);
 
        SelectObject(hDC, hPen2);
        Arc(hDC, 10, 20, 30, 40, 50, 60, 300, 400);
 
        SelectObject(hDC, hPen3);
        RoundRect(hDC, 200, 100, 140, 150, 160, 170);
        EndPaint(hWnd, &PaintSt);
    }
        break;
    case WM_LBUTTONDOWN:
    
        SetCapture(hWnd);
        
        GetClientRect(hWnd, &rcClient);
        ptClientUL.x = rcClient.left;
        ptClientUL.y = rcClient.top;
 
        ptClientLR.x = rcClient.right + 1;
        ptClientLR.y = rcClient.bottom + 1;
        ClientToScreen(hWnd, &ptClientUL);
        ClientToScreen(hWnd, &ptClientLR);
 
        SetRect(&rcClient, ptClientUL.x, ptClientUL.y, ptClientLR.x, ptClientLR.y);
        ClipCursor(&rcClient);
 
        ptsBegin = MAKEPOINTS(lParam);
        return 0;
 
    case WM_RBUTTONDOWN:
    {
            lineWidth = rand() % 19 + 1;
            lineColor = RGB(rand() % 255, rand() % 255, rand() % 255);
            InvalidateRect(hWnd, NULL, TRUE);
 
            
            /*ptsEnd.x = LOWORD(lParam);
            ptsEnd.y = HIWORD(lParam);*/
            
 
            HPEN linePen;
            linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
            HGDIOBJ prevObj = SelectObject(hDC, linePen);
            LineTo(hDC, ptsEnd.x, ptsEnd.y);
            SelectObject(hDC, prevObj);
            DeleteObject(linePen);
            InvalidateRect(hWnd, NULL, TRUE);
 
    }
        break;
    case WM_MOUSEMOVE:
        
        if (wParam & MK_LBUTTON)
        {
 
            hDC = GetDC(hWnd);
 
            SetROP2(hDC, R2_NOTXORPEN);
 
            if (fPrevLine)
                {
                    MoveToEx(hDC, ptsBegin.x, ptsBegin.y, (LPPOINT)NULL);
                    LineTo(hDC, ptsPrevEnd.x, ptsPrevEnd.y);
                }
 
            ptsEnd = MAKEPOINTS(lParam);
            MoveToEx(hDC, ptsBegin.x, ptsBegin.y, (LPPOINT)NULL);
            LineTo(hDC, ptsEnd.x, ptsEnd.y);
 
            fPrevLine = TRUE;
            ptsPrevEnd = ptsEnd;
            ReleaseDC(hWnd, hDC);
        }
        break;
    /*case WM_LBUTTONUP:
    //{
    //                   //
    //                   ptsEnd.x = LOWORD(lParam);
    //                   ptsEnd.y = HIWORD(lParam);
    //                   //
 
    //                   HPEN linePen;
    //                   linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
    //                   HGDIOBJ prevObj = SelectObject(hDC, linePen);
    //                   LineTo(hDC, ptsEnd.x, ptsEnd.y);
    //                   SelectObject(hDC, prevObj);
    //                   DeleteObject(linePen);
    //                   InvalidateRect(hWnd, NULL, TRUE);
 
 
    //}
    //  
    //  return 0;*/
 
    case WM_DESTROY:
        
        PostQuitMessage(0);
        return 0;
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
 
 
 
}
0
Заблокирован
20.04.2014, 20:06
с тебя магарыч женщина
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
213
#include <windows.h>
#include <math.h>
#include <string>
#include <sstream>
 
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
unsigned int lineWidth = 1;
COLORREF lineColor = RGB(0, 0, 0);
HDC hDC;
RECT rcClient;                 
POINT ptClientUL;             
POINT ptClientLR;              
static POINTS ptsBegin;       
static POINTS ptsEnd;         
static POINTS ptsPrevEnd;      
static BOOL fPrevLine = FALSE; 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("Вход"), TEXT("Начать рисование"), 0);
 
 
    WNDCLASSEX WindowClass;
 
    static LPCTSTR szAppName = L"WinApi";
    HWND hWnd;
    MSG msg;
    WNDCLASSEX wc;
 
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_HAND);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITENESS));
    wc.lpszMenuName = 0;
    wc.lpszClassName = szAppName;
    wc.hIconSm = 0;
 
    RegisterClassEx(&wc);
    hWnd = CreateWindow(szAppName, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    hDC = GetDC(hWnd);
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return static_cast<int>(msg.wParam);
}
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
    PAINTSTRUCT PaintSt;
    RECT aRect;
    switch (message)
 
    {
 
    case WM_PAINT:
    {
        hDC = BeginPaint(hWnd, &PaintSt);
        GetClientRect(hWnd, &aRect);
        SetBkMode(hDC, TRANSPARENT);
        DrawText(hDC, L"Рисовалка", -1, &aRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        RECT widthRect = { 300, 0, 480, 50 }, widthValueRect = { 480, 0, 520, 50 },
        colorRect = { 520, 0, 630, 50 }, colorValueRect = { 630, 0, 900, 50 };
 
        RECT infoRect = { 300, 0, 900, 50 };
        FillRect(hDC, &infoRect, (HBRUSH)(COLOR_WINDOW + 1));
        DrawText(hDC, L"Текущая толщина линии:", -1, &widthRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        DrawText(hDC, std::to_wstring(lineWidth).c_str(), -1, &widthValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        DrawText(hDC, L"Текущий цвет:", -1, &colorRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
        std::wstringstream wss;
        wss << L"R: " << GetRValue(lineColor) << L" | " << L"G: " << GetGValue(lineColor) << L" | " << L"B: " << GetBValue(lineColor);
        DrawText(hDC, wss.str().c_str(), -1, &colorValueRect, DT_SINGLELINE | DT_LEFT | DT_WORDBREAK);
 
 
        HBRUSH hBrush;
        CreateSolidBrush(RGB(255, 0, 67));
        hBrush = CreateHatchBrush(HS_FDIAGONAL, RGB(255, 10, 20));
        SelectObject(hDC, hBrush);
        Ellipse(hDC, 100, 100, 200, 300);
 
 
        HPEN hPen1, hPen2, hPen3;
        hPen1 = CreatePen(PS_DASHDOT, 1, RGB(0, 0, 255));
        hPen2 = CreatePen(PS_DASH, 1, RGB(255, 0, 255));
        hPen3 = CreatePen(PS_DOT, 1, RGB(0, 128, 256));
 
        SelectObject(hDC, hPen1);
        Rectangle(hDC, 10, 10, 100, 100);
 
        SelectObject(hDC, hPen2);
        Arc(hDC, 10, 20, 30, 40, 50, 60, 300, 400);
 
        SelectObject(hDC, hPen3);
        RoundRect(hDC, 200, 100, 140, 150, 160, 170);
        EndPaint(hWnd, &PaintSt);
    }
        break;
    case WM_LBUTTONDOWN:
    
        SetCapture(hWnd);
        
        GetClientRect(hWnd, &rcClient);
        ptClientUL.x = rcClient.left;
        ptClientUL.y = rcClient.top;
 
        ptClientLR.x = rcClient.right + 1;
        ptClientLR.y = rcClient.bottom + 1;
        ClientToScreen(hWnd, &ptClientUL);
        ClientToScreen(hWnd, &ptClientLR);
 
        SetRect(&rcClient, ptClientUL.x, ptClientUL.y, ptClientLR.x, ptClientLR.y);
        ClipCursor(&rcClient);
 
        ptsBegin = MAKEPOINTS(lParam);
        return 0;
 
    case WM_RBUTTONDOWN:
    {
            lineWidth = rand() % 19 + 1;
            lineColor = RGB(rand() % 255, rand() % 255, rand() % 255);
            InvalidateRect(hWnd, NULL, TRUE);
 
            
            /*ptsEnd.x = LOWORD(lParam);
            ptsEnd.y = HIWORD(lParam);*/
            
 
            HPEN linePen;
            linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
            HGDIOBJ prevObj = SelectObject(hDC, linePen);
            LineTo(hDC, ptsEnd.x, ptsEnd.y);
            SelectObject(hDC, prevObj);
            DeleteObject(linePen);
            InvalidateRect(hWnd, NULL, TRUE);
 
    }
        break;
    case WM_MOUSEMOVE:
        
        if (wParam & MK_LBUTTON)
        {
 
            hDC = GetDC(hWnd);
 
            SetROP2(hDC, R2_NOTXORPEN);
 
            HPEN linePen;
            linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
            HGDIOBJ prevObj = SelectObject(hDC, linePen);           
 
            if (fPrevLine)
                {
                    MoveToEx(hDC, ptsBegin.x, ptsBegin.y, (LPPOINT)NULL);
                    LineTo(hDC, ptsPrevEnd.x, ptsPrevEnd.y);
                }
 
            ptsEnd = MAKEPOINTS(lParam);
            MoveToEx(hDC, ptsBegin.x, ptsBegin.y, (LPPOINT)NULL);
            LineTo(hDC, ptsEnd.x, ptsEnd.y);
 
            SelectObject(hDC, prevObj);
            DeleteObject(linePen);
            InvalidateRect(hWnd, NULL, TRUE);
 
            fPrevLine = TRUE;
            ptsPrevEnd = ptsEnd;
            ReleaseDC(hWnd, hDC);
        }
        break;
    /*case WM_LBUTTONUP:
    //{
    //                   //
    //                   ptsEnd.x = LOWORD(lParam);
    //                   ptsEnd.y = HIWORD(lParam);
    //                   //
 
    //                   HPEN linePen;
    //                   linePen = CreatePen(PS_SOLID, lineWidth, lineColor);
    //                   HGDIOBJ prevObj = SelectObject(hDC, linePen);
    //                   LineTo(hDC, ptsEnd.x, ptsEnd.y);
    //                   SelectObject(hDC, prevObj);
    //                   DeleteObject(linePen);
    //                   InvalidateRect(hWnd, NULL, TRUE);
 
 
    //}
    //  
    //  return 0;*/
 
    case WM_DESTROY:
        
        PostQuitMessage(0);
        return 0;
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
 
 
 
}
1
7 / 4 / 0
Регистрация: 13.09.2013
Сообщений: 151
20.04.2014, 21:50  [ТС]
newbie666, могу борща сварить, могу денег на телефон закинуть ))))
0
Заблокирован
20.04.2014, 22:05
Цитата Сообщение от aysium Посмотреть сообщение
могу борща сварить

да щучу я
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.04.2014, 22:05
Помогаю со студенческими работами здесь

Как менять цвет фона в консоли, нажатием клавиши? (TASM)
Здравствуйте, уважаемые жители форума. Помогите пожалуйста с исправлением этой программы или написанием новой. Программа должна менять цвет...

Нарисовать фигуру и менять её цвет и ширину линий
#define STRICT #include &lt;windows.h&gt; #include &lt;mem.h&gt; #define CM_RED 10 #define CM_GREEN 9 #define...

Как учесть толщину линий?
Здравствуйте. Собственно вопрос как учесть толщину линий. То есть, если я рисую прямоугольник 10х10 см в тонких линиях всё...

OpenGL: По нажатию клавиши клавиатуры менять режим отображения графика
По нажатию клавиши клавиатуры менять режим отображения графика: точками или линиями Я хотела завести переменную r и в зависимости от её...

AutoLisp: Как задать толщину и тип линий
Здравствуйте! Подскажите пожалуйста как программно задать тип и толщину линий? Например: (defun main() (command...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru