Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отлов WM_SYSCOMMAND под Windows::Forms, Visual C++ 2010 Express 
V
    Опции темы
JackyFox
Дата 25.2.2011, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 21.11.2007

Репутация: нет
Всего: 7



Стоит задача в приложении Windows Forms, разрабатываемом в Visual C++ 2010 Express, запретить в определенной ситуации сообщение системы типа WM_SYSCOMMAND.
Нашел, что делается это примерно вот так:

Код

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
    if (nID == SC_MINIMIZE)
    {
        // TO DO
    }
    CFrameWnd::OnSysCommand(nID, lParam);
}


Для проверки создал проект, в Form1.h в пределах класса Form1 написал функцию:

Код

System::Void OnSysCommand(UINT nID, LPARAM lParam)
{
    if (nID == SC_MINIMIZE)
    {
        MessageBox::Show("Поступило сообщение SC_MINIMIZE",
            "Minimize", MessageBoxButtons::OK);
    }
}


Компилируется, но на события минимизации не реагирует. Подскажите, пожалуйста, как правильно в проекте Windows Forms применять такую конструкцию?

Добавлено через 6 минут
Пробовал так же вариант:
Код

if ((nID & 0xfff0) == SC_MINIMIZE)

и вообще без всяких условий.
--------------------
У вас менее 250 сообщений, ссылки отключены
PM   Вверх
JackyFox
Дата 25.2.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 21.11.2007

Репутация: нет
Всего: 7



Нашел для C# пример перевода этой конструкции. В нем предлагается перегрузить функцию WndProc.

Поискал еще и нашел пример перегрузки этой функции для C++
Код

protected:

[System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
    void WndProc(Message* m) {
        // Listen for operating system messages.
        switch (m->Msg) {
            // The WM_ACTIVATEAPP message occurs when the application
            // becomes the active application or becomes inactive.
                case WM_ACTIVATEAPP:

                    // The WParam value identifies what is occurring.
                    appActive = (((int)m->WParam != 0));

                    // Invalidate to get new text painted.
                    this->Invalidate();

                    break;
        }
        Form::WndProc(m);
    }


Переписал под свои нужны так:
Код

protected: 
    [System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
    void WndProc(Message* m) {
        switch (m->Msg) {
            case WM_SYSCOMMAND:
                if (((int)m->WParam & 0xfff0) == SC_MOVE)
                    return; // Как бы запрещаем перемещение
                break;
            }
        Form::WndProc(m);
    }


В таком варианте не компилится, сообщая, что 

Цитата

...\Form1.h(56): error C2664: void System::Windows::Forms::Control::WndProc(System::Windows::Forms::Message %): невозможно преобразовать параметр 1 из "System::Windows::Forms::Message *" в "System::Windows::Forms::Message %"


Ошибка показывает на
Код

Form::WndProc(m);


Если написать
Код

Form::WndProc(*m);


то компилируется, но толку нет. Окно остается подвижным.
 smile 

--------------------
У вас менее 250 сообщений, ссылки отключены
PM   Вверх
mes
Дата 25.2.2011, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: нет
Всего: 250



Цитата(JackyFox @  25.2.2011,  15:34 Найти цитируемый пост)
Form::WndProc(*m)

если заккомментировать эту строку,. окно как себя ведет ? 
если как обычно, значит Вы не переопределили оконную функцию.. (сигнатура не совпадает)..




--------------------
PM MAIL WWW   Вверх
JackyFox
Дата 27.2.2011, 04:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 21.11.2007

Репутация: нет
Всего: 7



mes,  окно ведет себя как обычно. Не переопределилась функция. Пример старый.

Нашел еще один пример. Метод следовало явно перегрузить, а параметр определить как tracking reference (обратите внимание на знак процентов):
Код

virtual void WndProc(Message% m) override {}


В этом случае доступ к элементам структуры типа Message осуществляется через точку.

Этот код блокирует перемещение окна.
Код

protected: 
[System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
virtual void WndProc(Message% m) override
{
    switch (m.Msg) 
    {
        case WM_SYSCOMMAND:
            if (((int)m.WParam & 0xfff0) == SC_MOVE)
                return;
            break;
    }
    Form::WndProc(m);
}


Всем спасибо за внимание ;)
--------------------
У вас менее 250 сообщений, ссылки отключены
PM   Вверх
mes
Дата 27.2.2011, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: нет
Всего: 250



Цитата(JackyFox @  27.2.2011,  03:41 Найти цитируемый пост)
обратите внимание на знак процентов

он же у Вас в сообщении об ошибки.. из за чего и возникла мысль о не соответствии сигнатуры..
так что к сообщениям компилятора стоит прислушиваться повнимательней..  smile 
 smile 


--------------------
PM MAIL WWW   Вверх
JackyFox
Дата 27.2.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 21.11.2007

Репутация: нет
Всего: 7



mes, да, компилятор — молодец. Но вот я тогда еще не был знаком с «отслеживаемым указателем» (и не знаю, как правильно в русскоязычной литературе tracking reference принято называть), поэтому и не обратил внимание на знак %.
--------------------
У вас менее 250 сообщений, ссылки отключены
PM   Вверх
Dem_max
Дата 1.3.2011, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: нет
Всего: 39



просто компилятор тебе уже в лоб указал что нужно сделать
Цитата

"System::Windows::Forms::Message *" в "System::Windows::Forms::Message %"



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.