Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для Прозрачный
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 67

Рисование линий нажимая кнопку мышки

19.10.2013, 15:49. Показов 1920. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно сделать чтобы щелкая по окну левой кнопкой мышки от первого к второму нажатию рисовалась линия, чтобы при рисовании новых линий старые оставались.
Кликните здесь для просмотра всего текста
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 <string>
//#include "resource.h"
#include <Commctrl.h>
//#include <tchar.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
HWND button;
HINSTANCE hInst;
 
HWND infoEdit;
 
HWND hWndStatusBar;  // status bar
 
char WinName[] = "MainFrame";
 
int CursorCoordX = 0;
int CursorCoordY = 0;
int x1=0;
int x2=300;
int y3=0;
int y2=300;
 
bool flag = true;
 
HDC hDC;
 
int APIENTRY WinMain(HINSTANCE This,        // Дескриптор текущего приложения
    HINSTANCE Prev,                         // В современных системах всегда 0
    LPTSTR cmd,                             // Командная строка
    int mode)                               // Режим отображения окна
{
    HWND hWnd;                              // Дескриптор главного окна программы
    MSG msg;                                // Структура для хранения сообщения
    WNDCLASS wc;                            // Класс окна
 
                                            // Определение класса окна 
    wc.hInstance = This;        
    wc.lpszClassName = WinName;             // Имя класса окна
    wc.lpfnWndProc = WndProc;                   // Функция окна
    wc.style = CS_HREDRAW | CS_VREDRAW;         // Стиль окна
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Стандартная иконка
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);    // Стандартный курсор
    wc.lpszMenuName = 0;
    wc.cbClsExtra = 0;      // Нет дополнительных данных класса
    wc.cbWndExtra = 0;      // Нет дополнительных данных окна
    // Заполнение окна белым цветом
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
    if(!RegisterClass(&wc)) return 0;   // Регистрация класса окна 
 
 
    hWnd = CreateWindow(WinName, "Window", WS_OVERLAPPEDWINDOW , 10, 10 , 500, 500, HWND_DESKTOP, NULL, This, NULL);
 
 
    ShowWindow(hWnd, mode); //Показать окно
    
                            // Цикл обработки сообщений
 
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);// Функция трансляции кодов нажатой клавиши
        DispatchMessage(&msg); // Посылает сообщение функции WndProc()
    }
    return 0;
}
 
 
// Оконная функция вызывается операционной системой
// и получает сообщения из очереди для данного приложения
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
                 WPARAM wParam, LPARAM lParam)
{   
 
    // Обработчик сообщений
    switch(message)
    {
    case WM_DESTROY : PostQuitMessage(0); 
        break; // Завершение программы
 
        // Обработка сообщения по умолчанию
 
    case WM_CREATE:
    {
        
        hWndStatusBar = CreateWindow(STATUSCLASSNAME, "Status Message", WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP | WS_BORDER,
            0,0,0,0,hWnd,(HMENU)2555,NULL,0);
                
        int ptWidth[2] = {150,450}; // ширина сегментов Statusbar
 
        SendMessage(hWndStatusBar, SB_SETPARTS, 2, (LPARAM)ptWidth);
 
        break;
    }
 
    case WM_LBUTTONDOWN:
    {
        int x1 = LOWORD(lParam);
        int y3 = HIWORD(lParam);
        
        //SetWindowPos(hWnd, HWND_TOP, 10,10,200,200, SWP_SHOWWINDOW)
 
        break;
    }
    case WM_RBUTTONDOWN:
    {
        int x2 = LOWORD(lParam);
        int y2 = HIWORD(lParam);
        
        //SetWindowPos(hWnd, HWND_TOP, 10,10,200,200, SWP_SHOWWINDOW)
 
        break;
    }
 
    case WM_SIZE:
            SendMessage(hWndStatusBar, WM_SIZE, 100, 20);
            break;
 
 
 
    case WM_MOUSEMOVE:
        {
            
            CursorCoordX = LOWORD(lParam);
            CursorCoordY = HIWORD(lParam);
    
            std::string XCoord = std::to_string((long double)CursorCoordX);
            std::string YCoord = std::to_string((long double)CursorCoordY);
            std::string cursorStatusMessage = "Cursor: X = " + XCoord + "| Y = " + YCoord;
 
            SendMessage(hWndStatusBar, SB_SETTEXT, 1 , (LPARAM)cursorStatusMessage.c_str());
 
 
            RECT rct;
            GetWindowRect(hWnd, &rct);
            std::string str_LX = std::to_string((long double)rct.left + rct.right);
            std::string str_LY = std::to_string((long double)rct.top +  rct.bottom);
            std::string str_Left_Corner = "Left X = "  + str_LX + "Left Y " + str_LY;
 
            SendMessage(hWndStatusBar,SB_SETTEXT,0  , (LPARAM)"This is Status Bar");
            break;
        }
 
        case WM_PAINT:
        {
            //if(!flag)
            //  break;
 
            flag = true;
 
            PAINTSTRUCT ps;
            
            hDC = BeginPaint(hWnd, &ps);
 
            
            MoveToEx(hDC, x1, y3, NULL);
            LineTo(hDC, x2, y2);
            
 
 
            EndPaint(hWnd, &ps);
            break;
            UpdateWindow(hWnd);
            //RECT rect;
            //InvalidateRect(hWnd, &rect, TRUE);
        }
 
 
        case WM_COMMAND:
        {
            //
            // if((HWND) lParam == hButton[0])
            if((LOWORD(wParam)==100)&&(HIWORD(wParam)==BN_CLICKED))
            {
                /*HDC hDCScreen =  GetDC(NULL);
                int Horres = GetDeviceCaps(hDCScreen,  HORZRES);
                int Vertres = GetDeviceCaps(hDCScreen,  VERTRES);
                ReleaseDC(NULL, hDCScreen);
 
                std::string str_msg = "Message\r\nYeah";
                SetWindowText(infoEdit, str_msg.c_str());
 
                //MessageBox(NULL, "asd", "asd", MB_OK);
                //SetWindowPos(button, HWND_TOP, 50,50,50,50, SWP_SHOWWINDOW);
 
                RECT rct;
                GetWindowRect(hWnd, &rct);
                
                std::string str_LX = std::to_string((long double)rct.left);
                std::string str_LY = std::to_string((long double)rct.top);
                std::string str_Left_Corner = "Left X = "  + str_LX + "Left Y " + str_LY;
 
                //const char * from_str = str.c_str();
                SetWindowText(hWnd, str_Left_Corner.c_str());
                //SetWindowText((HWND) lParam , "YEAH");*/
            }
                                    
        }
 
    }
 
    return DefWindowProc(hWnd, message, wParam, lParam);
    //return 0;
 
}


Добавлено через 3 часа 42 минуты
Всем спасибо сделал, работает!

Как сделать чтобы удерживая кнопку мышки рисовалось за курсором?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.10.2013, 15:49
Ответы с готовыми решениями:

Возможно ли запустить метод при загрузке не нажимая на кнопку ?
Привет ребята ! В Xamarin чтобы запустить метод надо нажать на Button в методе onCreate , возможно запустить метод при загрузке не нажимая...

Как каждый раз создавать объект (pictureBox), нажимая на кнопку?
как каждый раз создавать объект (pictureBox), нажимая на кнопку. private void knopkaToolStripMenuItem_Click(object sender, EventArgs...

как сделать чтоб перемещаться координатам нажимая только 1 кнопку
вот пишу программу для ява чата вот действие перемиститься кнопка 1 WSocket1.SendLine('REMOVE 222 '); кнопка 2...

3
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
19.10.2013, 20:25
SetPixel().
0
 Аватар для Прозрачный
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 67
19.10.2013, 20:47  [ТС]
уже сделал, может кто знает как сделать чтобы если быстро водишь мышкой кривая была сплошной, а не ...............
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
21.10.2013, 16:09
Отлавливаете движение курсора, сохраняете его координаты и рисуете линию от предыдущих координат к текущим.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2013, 16:09
Помогаю со студенческими работами здесь

Напишите код который бы при наведение мышки на кнопку перемещал эту кнопку
Такой вопрос. Напишите код который бы при наведение мышки на кнопку перемещал эту кнопку

Нажимая на одну кнопку, мне прописать условие для другой кнопки
скажем нажимая на одну кнопку, мне надо прописать условие для другой кнопки знаю тупой вопрос, но мне надо знать))

Рисование линий
Дорогие друзья! Я создаю что-то типа редактора изображений. Но вдруг у меня из памяти вылетело. Как можно мышкой рисовать по форме! Я...

Рисование линий
Здравствуйте все. Мой вопрос в том, как нарисовать линии поверх изображения так, чтобы при зумировании изображения линии соответствовали...

рисование линий
помогите пожалуйста. мне надо,чтобы по нажатию мыши в вершинах многоугольника(я его загружаю через commanddialog) должны прорисовываться...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru