Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/56: Рейтинг темы: голосов - 56, средняя оценка - 4.93
 Аватар для Tsyklop
5 / 6 / 5
Регистрация: 01.01.2014
Сообщений: 399

При нажатии мышью на экран выводить различные изображения

25.08.2014, 10:54. Показов 10586. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не вехал в WinApi не могу понять что и как делать. помогите пожалуйста.

- при клике левой кнопки мыши в месте клика появляется окружность производного радиуса;

- при клике правой кнопки мыши в месте клика появляется прямоугольник производного размера;

- в окне отображается информация о количестве появившихся фигур;

- при двойном левом клике фигуры и информация о фигурах стирается.

- при клике левой кнопки мыши в окне отображается украинский флаг;

- при клике правой кнопки мыши в окне отображается российский флаг;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2014, 10:54
Ответы с готовыми решениями:

Написать программу-фильтр: при нажатии любых клавиш выводить на экран только буквы и цифры
помогите пожалуйста, срочно нужно Написать программу-фильтр, которая при нажатии любых клавиш выводит на экран только буквы и цифры, при...

Нужно в выводить на экран значения nFlags при нажатии клавиши(Скэн-код, Расширенная клавиша и т. д.)
К тому, что сейчас выводиться нужно добавить на экран значения nFlags при нажатии клавиши(Скэн-код, Расширенная клавиша и т. д.), как...

Как не выводить на экран сообщение об ошибке выполнения макрокоманды, при нажатии кнопки "Отмена"?
При нажатии на форме кнопки запускается макрос, который в свою очередь вызывает запрос, например ВВЕДИТЕ ФАМИЛИЮ. При нажатии кнопки ОТМЕНА...

17
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
25.08.2014, 11:04
...без всяких форм.

GetDC(0) + GetCusorPos() + поток + для перехвата сообщений мыши можно хук поставить SetWindowsHookEx():
- Ellipse()
- Rectangle()
- TextOut()
- HBitMap + CreateCompatibleBitmap() + SelectObject() + BitBlt()
0
 Аватар для Tsyklop
5 / 6 / 5
Регистрация: 01.01.2014
Сообщений: 399
25.08.2014, 11:20  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
...без всяких форм.
GetDC(0) + GetCusorPos() + поток + для перехвата сообщений мыши можно хук поставить SetWindowsHookEx():
- Ellipse()
- Rectangle()
- TextOut()
- HBitMap + CreateCompatibleBitmap() + SelectObject() + BitBlt()

вот не могу понять где взять hdc? Функции требую а я не знаю где его взять.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
25.08.2014, 11:21
GetDC(0) даст вам канву экрана.
0
 Аватар для Tsyklop
5 / 6 / 5
Регистрация: 01.01.2014
Сообщений: 399
25.08.2014, 11:38  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
GetDC(0) даст вам канву экрана.
не могу понять что да куда.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
25.08.2014, 11:54
http://msdn.microsoft.com/ru-r... s.85).aspx
0
 Аватар для Tsyklop
5 / 6 / 5
Регистрация: 01.01.2014
Сообщений: 399
25.08.2014, 12:20  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
http://msdn.microsoft.com/ru-ru/libr...(v=vs.85).aspx
C++
1
2
HDC GetDC(HWND hWnd);
TextOut(hdc, 10, 10, L"Строка", 6);
написал это, но hdc подчёркивает.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
25.08.2014, 12:23
C++
1
2
3
hwnd hdc;
...
hdc = GetDC(
0
 Аватар для Tsyklop
5 / 6 / 5
Регистрация: 01.01.2014
Сообщений: 399
25.08.2014, 12:28  [ТС]
я ноль в этом.
куда вставлять код?
вот что у меня есть:

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
#include <Windows.h>
#include <winuser.h>
 
UINT ErrorMessageBox();
UINT ErrorDebugString();
 
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CREATE:
 
        CreateWindow(L"Button", L"Жмы мене", WS_CHILD | WS_VISIBLE, 10, 10, 100, 50, hWnd,  (HMENU)1001, GetModuleHandle(NULL), nullptr);
        
        return 0;
    case WM_COMMAND:
        hWnd = hdc;
        hdc = GetDC(0);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
 
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
 
 
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT nCmdShow)
{
    wchar_t* className=L"MyWndClassName";
 
    WNDCLASSEX wcex = {sizeof(WNDCLASSEX)};
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.hInstance = hInst;
    wcex.lpfnWndProc = MyWndProc;
    wcex.lpszClassName = className;
    wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
 
    if (!RegisterClassEx(&wcex))
    {
 
        
 
        MessageBox(NULL, L"", L"", MB_OK);
        return -1;
    }
 
    HWND hWnd = CreateWindowEx(WS_EX_TOPMOST, className, L"Caption", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, nullptr);
 
    
 
 
    if (!hWnd)
    {
        
 
        ErrorDebugString();
        return -1;
    }
 
    //ShowWindow(hWnd, nCmdShow);
    AnimateWindow(hWnd, 1000, AW_ACTIVATE | AW_BLEND);
    UpdateWindow(hWnd);
 
    MSG msg;
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return msg.wParam;
}
 
UINT ErrorMessageBox()
{
    UINT uErrCode = GetLastError();
    TCHAR* lpErrorStr;
 
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        uErrCode,
        LANG_SYSTEM_DEFAULT,
        (LPTSTR)&lpErrorStr,
        0,
        NULL);
 
    MessageBox(NULL, lpErrorStr, L"Error", MB_OK | MB_ICONERROR);
    
    LocalFree(lpErrorStr);
 
    return uErrCode;
}
 
UINT ErrorDebugString()
{
    UINT uErrCode = GetLastError();
    TCHAR* lpErrorStr;
 
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        uErrCode,
        LANG_SYSTEM_DEFAULT,
        (LPTSTR)&lpErrorStr,
        0,
        NULL);
 
    OutputDebugString(L"Error=======================\n");
    OutputDebugString(lpErrorStr);
    OutputDebugString(L"============================\n");
 
    LocalFree(lpErrorStr);
 
    return uErrCode;
}
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
25.08.2014, 13:40
...если глобально собираетесь использовать, то переменную вверх к инклудам. А получение хэндла перед созданием окна.
1
 Аватар для Tsyklop
5 / 6 / 5
Регистрация: 01.01.2014
Сообщений: 399
25.08.2014, 15:14  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
...если глобально собираетесь использовать, то переменную вверх к инклудам. А получение хэндла перед созданием окна.

с этим разобрался. Щас пробую сделать при нажатии правой кнопки мыши появление Элипса.

Вот что я пишу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CREATE:
        hdc = GetDC(hWnd);
        CreateWindow(L"Button", L"Жмы мене", WS_CHILD | WS_VISIBLE, 10, 10, 100, 50, hWnd,  (HMENU)1001, GetModuleHandle(NULL), nullptr);
        
        return 0;
    case WM_RBUTTONDOWN:
        Ellipse(hdc, 500, 250, 500, 250);
        return 0;
    case WM_COMMAND:
        TextOut(hdc, 100, 100, L"Строка", 6);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
 
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
Но при нажатии выводится только текст а элипса нет.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
25.08.2014, 16:07
...а подумать?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function MouseProc(n: Integer; wParam, lParam: Longint): lResult; stdcall;
var _x, _y: integer;
    x, y, text: string;
begin
 _x:= PMouseHookStructLL(lParam)^.p.X;
 _y:= PMouseHookStructLL(lParam)^.p.Y;
 
 if wParam = WM_MBUTTONDOWN then begin
  str(_x, x);
  str(_y, y);
  text:= 'Жмакнул колесиком по координатам: ' + x + ',' + y;
 
  TextOut(_hdc, _x, _y, pansichar(text), length(text));
 end;
 
 if wParam = WM_RBUTTONDOWN then begin
  Ellipse(_hdc, _x, _y, _x + 200, _y + 200);
 end;
 
 if wParam = WM_LBUTTONDOWN then begin
  Rectangle(_hdc, _x, _y, _x + 200, _y + 200);
 end;
 //
 Result:= CallNextHookEx(h, n, wParam, lParam)
0
 Аватар для Tsyklop
5 / 6 / 5
Регистрация: 01.01.2014
Сообщений: 399
25.08.2014, 16:20  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
..а подумать?
это как бы делфи.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
25.08.2014, 16:27
Это WinAPI и пофигу на Delphi.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
26.08.2014, 21:13
Цитата Сообщение от Tsyklop Посмотреть сообщение
Вот что я пишу:
C++
1
2
3
4
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg)
 {
Рисуем эллипс (левая кнопка) и всё стираем (правая кнопка).
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
 // LRESULT CALLBACK MyWndProc( ... ) 
 
    static bool paint = false;
    static RECT r = {};
 
 
    case WM_LBUTTONDOWN:
        {
            r.left = 100; r.top = 100; r.right = 300; r.bottom = 200;
            paint = true;
            InvalidateRect( hWnd, &r, 0 );
        }
 
        break;
 
    case WM_RBUTTONDOWN:
        {
            paint = false;
            InvalidateRect( hWnd, 0, 1 );
        }
        break;
 
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
 
        if(paint)
        {
            Ellipse(hdc, r.left, r.top, r.right, r.bottom );
        }
 
        EndPaint(hWnd, &ps);
        break;
Добавлено через 3 часа 8 минут
Цитата Сообщение от Tsyklop Посмотреть сообщение
Но при нажатии выводится только текст а элипса нет.
Цитата Сообщение от Tsyklop Посмотреть сообщение
C++
1
Ellipse(hdc, 500, 250, 500, 250);
Потому что эллипс нулевого размера. left = right = 500, top = bottom = 250.
0
0 / 0 / 0
Регистрация: 21.12.2017
Сообщений: 11
12.04.2018, 19:43
Здравствуйте, а как сделать чтоб этот Эллипс был в правом нижнем углу
_________________
Разобрался, просто координаты поменял))))
0
0 / 0 / 0
Регистрация: 01.05.2019
Сообщений: 30
03.09.2019, 14:12
Допустим, с кругом я разобрался, размерами он у меня разными, но не могу понять как цвет новым объектам менять.
Крутил что-то с hbrBackground и в результате у меня менялся цвет фона окна приложения, но не созданный круг через Ellipse.
Подскажите, может какая функция или команда существует? То есть мне надо для каждого нового круга новый цвет что бы был.
0
Заблокирован
04.09.2019, 14:37
Цитата Сообщение от I am shocked Посмотреть сообщение
Подскажите, может какая функция или команда существует?
C++
1
2
3
4
5
6
7
    // Cоздать кисть сплошного тона
    BrushRed = CreateSolidBrush(RGB(255, 0, 0));
 
    // Выбрать кисть в контекст устройства
    SelectObject(hDC, BrushRed);
 
    Ellipse(hDC, 10, 10, 50, 50);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.09.2019, 14:37
Помогаю со студенческими работами здесь

При нажатии кнопок мыши выводить информацию о нажатии соответствующей кнопки
на с++ написать программу которая при нажатии кнопок мыши выводить информацию о нажатии соответствующей кнопки c++

При нажатии кнопки "1" выводить 0, а при нажатии "2" выводить 1 (КР580ВИ53)
привет всем, сломал голову уже, в чём проблема? вот текст программы, которая должна при нажатии кнопки &quot;1 &quot;выводить: 0 , а при...

Кликать мышью 3 раза при нажатии ЛКМ
Ребята , всем привет ! Искала в нэте , не нашел подходящий вариант того что мне нужно . Мой пример задачи заключается в том , что при...

Раздвоение Объекта при нажатии на shape мышью
Нужно написать код, чтобы после нажатия на shape мышью он раздваивался и выполнял те же функции что и первый.

Скрипт, который при клике мышью на элементе с классом 'clicker' будет выводить сообщение c текстом
Помогите написать код скрипта, который при клике мышью на элементе с классом 'clicker' будет выводить сообщение c текстом «нажат элемент с...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 17.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 14.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru