Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ и WinAPI
Войти
Регистрация
Восстановить пароль
 
aysium
7 / 4 / 4
Регистрация: 13.09.2013
Сообщений: 151
#1

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

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

Как менять толщину и цвет линий по нажатию клавиши:???
линии рисую мышкой
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2014, 11:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как менять толщину и цвет линий по нажатию клавиши? (C++ WinAPI):

Нарисовать фигуру и менять её цвет и ширину линий
#define STRICT #include <windows.h> #include <mem.h> #define CM_RED ...

Прямоугольник перестаёт менять цвет
Здравствуйте. Я сделал программу, которая рисует прямоугольник какого-нибудь...

Вывод изображения по нажатию клавиши
Почему не выводит рисунок при нажатии на клавишу "2" #include <windows.h>...

Рисование точек по нажатию клавиши
Ребят помогите разобраться.Я вообще только начал изучать WinAPI и много делаю...

Как изменить толщину текста?
Есть ли какие-то функции для задания толщины текста ? Удалось поменять только...

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

8
newbie666
Заблокирован
17.04.2014, 21:47 #2
код показывай своего художезтва
0
aysium
7 / 4 / 4
Регистрация: 13.09.2013
Сообщений: 151
17.04.2014, 22:03  [ТС] #3
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
newbie666
Заблокирован
18.04.2014, 15:58 #4
Лучший ответ Сообщение было отмечено 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
aysium
7 / 4 / 4
Регистрация: 13.09.2013
Сообщений: 151
18.04.2014, 16:07  [ТС] #5
newbie666, я понимаю, что Гэ,не в обиде ))Спасибо огромное, что помогли и уделили внимание!сча буду пробовать

Добавлено через 4 минуты
newbie666, ооо, вообще круто сделали)спасибки! сейчас буду что-то думать с линиями и немножко доделывать
0
aysium
7 / 4 / 4
Регистрация: 13.09.2013
Сообщений: 151
20.04.2014, 12:48  [ТС] #6
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
newbie666
Заблокирован
20.04.2014, 20:06 #7
с тебя магарыч женщина
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
aysium
7 / 4 / 4
Регистрация: 13.09.2013
Сообщений: 151
20.04.2014, 21:50  [ТС] #8
newbie666, могу борща сварить, могу денег на телефон закинуть ))))
0
newbie666
Заблокирован
20.04.2014, 22:05 #9
Цитата Сообщение от aysium Посмотреть сообщение
могу борща сварить

да щучу я
1
20.04.2014, 22:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2014, 22:05
Привет! Вот еще темы с решениями:

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

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

Как учесть толщину линий?
Здравствуйте. Собственно вопрос как учесть толщину линий. То есть, если...

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


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

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

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