Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: CodeGear RAD Studio 2009 & SetWindowLong  (Прочитано 10562 раз)
0 Пользователей и 1 Гость смотрят эту тему.
OxCom
Интересующийся

ua
Offline Offline
Пол: Мужской
Неуч


« : 15-10-2009 09:39 » 

Доброго времени суток.
Недавно я собрался переехать на CodeGear RAD Studio 2009. И решил провести пару экспериментов. Все шло замечательно до одного момента. Данный код ранее был проверен в среде Borland Developer Studio 2006, и он работал, а в новой среде он не проявляет никаких заметных действий: после выполнения кода ничего не происходит и код ошибки 0.

Код простой: убирает из таскбара ваше приложение.
Код:
SetWindowLong(Application->Handle, GWL_EXSTYLE,WS_EX_TOOLWINDOW);

Что пробовал?
1) Были попытки внедрить этот код в различные места листинга программы (FormCreate,WinMain), но результатов не было.
2) Одно решение меня подвергло радости, но там тоже неудача, т.к. потом нельзя показать форму и работать с ней:
Код:
Application->ShowMainForm = false;

Как все же сделать данный код работоспособным? Или что я делаю не правильно?
Были идеи, что его-то необходимо подключить какой-то компонент или поставить галочку, но ничего не нашел.
Да, и вот что интересно: если в CodeGear RAD Studio 2009 загрузить проект Borland Developer Studio 2006, то работоспособность сохраняется но не на долго.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 15-10-2009 09:49 » 

а так
Код:
::ModifyStyleEx(hWin,0,WS_EX_TOOLWINDOW,0);
?
это, кстати, не убирание приложения с таск бара, а установка стиля "tool" , а уж с этим стилем окно не имеет кнопки на таскбаре





а
SetWindowLong(Application->Handle,

 - это точно неправильно, нужен хендл окна, а тут, я так понимаю, инстанс приложения )
« Последнее редактирование: 15-10-2009 09:51 от Алексей1153++ » Записан

OxCom
Интересующийся

ua
Offline Offline
Пол: Мужской
Неуч


« Ответ #2 : 15-10-2009 10:16 » 

Спасибо огромное!
Код:
Код:
::ModifyStyleEx(hWin,0,WS_EX_TOOLWINDOW,0);
ни один из выше упомянутых билдеров не признал. Даже в справке нет ничего об этом. А вот с хендлом действительно помогло:
Вместо
Код:
Application->Handle
поставил
Код:
this->Handle
В связи с этим не могли бы Вы объяснить разницу между Application и this?
Цитата
это, кстати, не убирание приложения с таск бара, а установка стиля "tool" , а уж с этим стилем окно не имеет кнопки на таскбаре
простите за некорректность моего выражения. Да и за неграмотность в выше поставленном вопросе Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 15-10-2009 10:23 » 

ModifyStyleEx - это апишная функция, её не могет не быть ) Попробуй без "::"

Цитата
В связи с этим не могли бы Вы объяснить разницу между Application и this?
эээ...Удивил Улыбаюсь Ну разница очевидная: я так полагаю, сей код вызывается в классе главного окна приложения, и потому

this->Handle - это член класса главного окна приложения.

this - это указатель на экземпляр самого себя внутри класса

 Можно написать просто
Код:
Handle

А Application - это класс всего приложения, у него свой хендл, я так полагаю это Instance
Записан

OxCom
Интересующийся

ua
Offline Offline
Пол: Мужской
Неуч


« Ответ #4 : 15-10-2009 10:28 » 

Спасибо за разъяснения.
А вот ModifyStyleEx действительно нету. При ее вызове пишет, что вызывается неизвестная функция, и улыбается Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 16-10-2009 02:47 » 

ну я не борландист, не знаю, как там у вас АПИшные функции винды вызвать ))
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 16-10-2009 03:56 » 

сорри за неточность, это я , оказывается, MFC-функцию к апишным приписал )))
На самом деле там, я посмотрел, и делается вызов SetWindowLong:

Код:

BOOL PASCAL
CWnd::ModifyStyleEx(HWND hWnd, DWORD dwRemove, DWORD dwAdd, UINT nFlags)
{
return _AfxModifyStyle(hWnd, GWL_EXSTYLE, dwRemove, dwAdd, nFlags);
}

AFX_STATIC BOOL AFXAPI _AfxModifyStyle(HWND hWnd, int nStyleOffset,
DWORD dwRemove, DWORD dwAdd, UINT nFlags)
{
ASSERT(hWnd != NULL);
DWORD dwStyle = ::GetWindowLong(hWnd, nStyleOffset);
DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd;
if (dwStyle == dwNewStyle)
return FALSE;

::SetWindowLong(hWnd, nStyleOffset, dwNewStyle);
if (nFlags != 0)
{
::SetWindowPos(hWnd, NULL, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | nFlags);
}
return TRUE;
}
« Последнее редактирование: 16-10-2009 03:59 от Алексей1153++ » Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 16-10-2009 10:58 » 

В BCB функции Win32 API вызываются точно также. И точно также нужно подключать заголовки.
Только вот, Леш, это не API-шная функция - это MFC (не заметил твоей самокритики, т.ч. дублируюсь...). В BCB данная функция включена как статик-мембер в CWnd в заголовке "Mfc\afxwin.h". В Win32 API  используются SetWindowLong и GetWindowLong. Функцию SetWindowLong стледует искать в заголовке "winuser.h".
« Последнее редактирование: 16-10-2009 11:03 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
OxCom
Интересующийся

ua
Offline Offline
Пол: Мужской
Неуч


« Ответ #8 : 16-10-2009 12:49 » 

Все работает замечательно. спасибо что и про MFC написали. Теперь осталось решить вопрос в другой теме этого форума Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines