Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386

Перемещение окна вслед за мышью, не за заголовок

21.02.2015, 22:54. Показов 3000. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include<Windows.h>
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
HWND hWnd;
char WinClass[] = "Window";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpArg, int nStyle)
{
    WNDCLASSEX wncl;
    MSG message;
    wncl.hInstance = hInstance;
    wncl.lpszClassName = WinClass;
    wncl.lpfnWndProc = WinProc;
    wncl.style = CS_DBLCLKS | CS_DROPSHADOW;
    wncl.cbSize = sizeof(WNDCLASSEX);
    wncl.hIcon = LoadIcon(0, IDI_WINLOGO);
    wncl.hIconSm = LoadIcon(0, IDI_WINLOGO);
    wncl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wncl.lpszMenuName = NULL;
    wncl.cbClsExtra = 0;
    wncl.cbWndExtra = 0;
    wncl.hbrBackground = CreateSolidBrush RGB(50, 50, 70);
    if (!RegisterClassEx(&wncl))
        return 0;
    hWnd = CreateWindowEx(NULL, WinClass, "Control", WS_OVERLAPPED | WS_SYSMENU, 0, 0, 500, 400, NULL, NULL, NULL, NULL);
    ShowWindow(hWnd, SW_SHOW);
    while (GetMessage(&message, hWnd, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
}
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    POINT lp;
    RECT rc;
    switch (message)
    {
    case WM_CLOSE:
    {
        PostQuitMessage(0);
        return 0;
    }
    case WM_MOUSEMOVE:
    {
        GetCursorPos(&lp);
    }
    case WM_LBUTTONDOWN:
    {
        GetWindowRect(hWnd, &rc);
        MoveWindow(hWnd, lp.x - rc.left, lp.y - rc.bottom, 500, 400, TRUE);
    }
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
        break;
    }
    return 0;
}
по идее окно по нажатию левой кнопки мыши должно перемещаться в след за мышью, но при наведении мыши на окно, оно хаотично и циклично бегает по экрану, в чем проблема?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.02.2015, 22:54
Ответы с готовыми решениями:

Перемещение окна приложения не за заголовок
как сделать, чтоб когда зажимаешь лкм на картинке(TImage) вся форма перетаскивалась, как будто перемещаешь зажав на заголовке окна?

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

Изменение размеров Canvas вслед за размерами окна
как автоматически менять размеры canvas при изменении размеров окна? пишу такой код: .... public class Canv extends Application { ...

9
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
22.02.2015, 06:07
C++
1
2
3
4
5
        case WM_LBUTTONDOWN:
        {
            ReleaseCapture();
            SendMessage(hWnd, WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
        }break;
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
22.02.2015, 10:23
надо объявить две глобальных переменных:
C
1
2
bool g_bIsMouseCaptured;
POINT g_ptMousePos;
потом проинициализировать (например в main):
C
1
g_bIsMouseCaptured = false;
и вот тогда, логика оконной процедуры будет такой:
Кликните здесь для просмотра всего текста
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
    case WM_MOUSEMOVE:
    {
        if (g_bIsMouseCaptured)
        {
            RECT rc;
            POINT ptCursor;
            POINT ptDelta;
 
            GetWindowRect(hWnd, &rc);
            GetCursorPos(&ptCursor);
            ptDelta.x = g_ptMousePos.x - ptCursor.x;
            ptDelta.y = g_ptMousePos.y - ptCursor.y;
 
            MoveWindow(hWnd, rc.left - ptDelta.x, rc.top - ptDelta.y, 
                rc.right-rc.left , rc.bottom-rc.top, TRUE);
            g_ptMousePos.x = ptCursor.x;
            g_ptMousePos.y = ptCursor.y;
        }
        break;
    }
    case WM_LBUTTONDOWN:
    {
        if (! g_bIsMouseCaptured)
        {
            SetCapture(hWnd);
            g_bIsMouseCaptured = true;
            GetCursorPos(&g_ptMousePos);
        }
        break;
    }
    case WM_LBUTTONUP:
    {
        if (g_bIsMouseCaptured)
        {
            ReleaseCapture();
            g_bIsMouseCaptured = false;
        }
        break;
    }
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
22.02.2015, 10:28
Цитата Сообщение от rao Посмотреть сообщение
надо объявить две глобальных переменных:
Какой то мутный код ты привел
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
22.02.2015, 10:38
demmax2004, чем нехорош? работает же
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
22.02.2015, 10:41
тем что мой из 2 строчек
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
22.02.2015, 10:48
Твой из разряда "трюков". Он не указывает ТСу, на его ошибки и не позволяет разобраться в происходящем.
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
22.02.2015, 10:54
никаких трюков и фокусов.
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
22.02.2015, 11:05
Под "трюком" я имел в виду бездумное повторение однажды заученного приема.
Ты же это скопировал из какого-нибудь HowTo? Зачем вызывать ReleaseCapture() если не было SetCapture? Потому что так было написано?
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
22.02.2015, 11:53
Цитата Сообщение от rao Посмотреть сообщение
Зачем вызывать ReleaseCapture() если не было SetCapture? Потому что так было написано?
Убедил
C++
1
2
3
4
case WM_LBUTTONDOWN:
{
            SendMessage(hWnd, WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
}break;
или так

C++
1
2
3
4
case WM_LBUTTONDOWN:
{
    SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}break;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.02.2015, 11:53
Помогаю со студенческими работами здесь

Может ли оконная процедура различить, изменён ли размер окна функцией MoveWindow, или мышью за рамку окна?
Стиль WS_BORDER | WS_SIZEBOX | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_THICKFRAME | WS_VISIBLE.

Перемещение объекта мышью
всем привет! нужно сделать перемещение объекта мышью по горизонтали, принцип знаю. при mousedown ставиться флаг, при mouseup флаг...

Перемещение изображения мышью
Здравствуйте. Я пытаюсь добиться перемещения изображения мышью, нашел код, который данную задачу выполняет. Но при запуске это изображение...

Перемещение объекта мышью
Вот уже облазил весь форум, а понять причину не могу... При нажатии и передвижению мыши, примитив исчезает... #include...

Не работает перемещение мышью
Перестало работать перемещение мышью, т.е. могу любой файл или папку открыть а перетащить или переместить перетаскиванием не получается,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru