Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
172 / 62 / 11
Регистрация: 22.12.2015
Сообщений: 2,461
1

Как управлять разрешением перемещать форму из программы?

24.04.2018, 08:32. Просмотров 923. Ответов 6
Метки нет (Все метки)

Всем здравствуйте.

В режиме разработки установив Form1->Align->alCustom можно запретить перемещение формы за заголовок.
Стоит задача: сделать это из программного кода на этапе выполнения приложения.
Клик по Command1 - запрещаем перемещать форму.
Клик по Command2 - разрешаем перемещать форму.
Вопрос поднимался здесь Запретить перемещать форму но уж очень давно, вряд ли кто-то отзовётся продолжить обсуждение.
Заинтересовал случай с использованием TApplicationEvents как пример перехвата сообщений Windows:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
    switch (Msg.message)
    {
        case WM_MOVING:
        //... обработка WM_MOVING
        {
            RECT rc;
            GetWindowRect(Handle, &rc);
            *((LPRECT)Message.DragRect) = rc;
            break;
        }
        //... остальные сообщения
        default:
        return;
    }
}
Компилятор ругается на Undefined symbol 'Message' в строке 10.
Что я не так делаю?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2018, 08:32
Ответы с готовыми решениями:

Как управлять/перемещать кнопкой на форме с клавиатуры?
Подскажите как сделать управление элементом на форме. Например управлять кнопкой с клавиатуры....

Как перемещать форму BorderStyle=None
Допилил чуть-чуть один примерчик с этого форума с изменением размера и перетаскиванием формы без...

Как перемещать форму по щелчку на компоненте?
То-есть как сделать чтобы форму можно было перетаскивать за любое место. Щелкаешь внутри формы и...

Как автоматически перемещать форму по экрану?
Подскажите как автоматически перемещать форму по экрану, например, чтобы она двигалась из одного...

6
60 / 55 / 34
Регистрация: 26.07.2015
Сообщений: 119
24.04.2018, 08:45 2
Так почему бы не пойти по пути наименьшего сопротивления и воспользоваться свойством Align?
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Align = alCustom;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Align = alNone;
}
//---------------------------------------------------------------------------
1
172 / 62 / 11
Регистрация: 22.12.2015
Сообщений: 2,461
24.04.2018, 09:05  [ТС] 3
Si14, Всё работает, спасибо. Но всё-таки что не так в приведенном выше коде?
0
60 / 55 / 34
Регистрация: 26.07.2015
Сообщений: 119
24.04.2018, 11:50 4
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Я попробовал сделать через ApplicationEvents1 и сообщение WM_MOVING вообще не приход
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
    switch (Msg.message)
    {
        case WM_MOVING:
        {
            ShowMessage("Moving!");
        }
    }
}
Так что надо делать через MESSAGE_MAP.
Кликните здесь для просмотра всего текста
А если бы сообщение приходило, то правильный код был бы
C++
1
2
3
4
5
RECT rc;
 GetWindowRect(Handle, &rc);
*((LPRECT)Msg.lParam) = rc;
Handled = true;
break;
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30599 / 19972 / 7801
Регистрация: 22.10.2011
Сообщений: 34,774
Записей в блоге: 6
24.04.2018, 11:54 5
Цитата Сообщение от jkrnd Посмотреть сообщение
что не так в приведенном выше коде?
Во-первых - название параметра, во вторых - логика: при получении сообщения WM_MOVING через lparam передается указатель на структуру, хранящую позицию окна, то есть, делать нужно вот что:
C++
1
*((LPRECT)(Msg.lParam)) = rc;
логика понятна? Получить указатель на структуру, разыменовать его и туда записать какое-то фиксированное значение, чтобы позиция формы не изменилась. А вот получать rc по приходу того же WM_MOVING - очень плохая затея, оно у тебя и будет новой позицией окна. Если хочешь запретить движение - то надо в момент начала запрета перемещения формы сохранить ее позицию, и уже ее записывать по полученному указателю.
1
Практикантроп
4643 / 2572 / 484
Регистрация: 23.09.2011
Сообщений: 5,507
24.04.2018, 14:41 6
...кстати, о логике. У меня сегодня с этим проблемы.
Я порешал проблему "заморозки" формы на экране аналогичным способом (через ApplicationMessage). НО! пришлось корректировать. Числа подбирались и они примерно соответствуют двойной ширине бордюра (left) и двойной ширине шапки (top). Не могу понять - почему. Почему программа сохраняет "неправильные" величины??
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::FormShow(TObject *Sender)
{
    re = Rect(Form1->Left,Form1->Top,
              Form1->Width,Form1->Height);
    Wl0 = Form1->Left; Wt0 = Form1->Top;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
    if(Msg.message!=161 || Msg.wParam!=2) return;
    Caption = "Alarm!" ;
 //   Left = re.Left - 17 ; Top  = re.Top  + 72 ;
    Left = Wl0 - 17 ; Top  = Wt0 + 72 ;
    Handled = true;
}
Добавлено через 15 минут
Впрочем, как оказалось, в режиме Form-Position Designed всё нормально; коррекция не требуется. А для DesktopCenter (другие не проверял) без коррекции отскакивает.

Добавлено через 14 минут
Я, кажется, догадался. В момент Form-Show, когда окно еще в той области, где было в процессе компиляции программы, эти координаты и запоминаются. А уже по CanResize, Resize окно помещается туда, куда задано (Form->Position). А "двойная ширина" как мне казалось - это совпадение.
1
172 / 62 / 11
Регистрация: 22.12.2015
Сообщений: 2,461
24.04.2018, 15:00  [ТС] 7
Si14, Почему не приходит сообщение WM_MOVING? И что такое
Цитата Сообщение от Si14 Посмотреть сообщение
надо делать через MESSAGE_MAP.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2018, 15:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как перемещать форму колесом мыши?
Ну то есть скрол бар на Form с помощью колесика перемещался. (Скорее всего вопрос глупый)Но тем не...

Как перемещать форму без бордюров
Ребят, как можно сделать то,что я написал в заголовке? Добавлено через 10 минут P.S. имею ввиду...

Как перемещать форму без заголовка
Всем привет,у меня глупый впрос :-| по тому как создать форму с BorderStyle - None. Чтобы ее можно...

Как перемещать форму без бордюров
создал форму в vb2010, от отключил верхний бар (заголовок) и теперь невозможно передвигать окно...


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

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

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