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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как программно изменить стиль CComboBox  (Прочитано 11199 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LeM2004
Гость
« : 11-06-2004 16:23 » 

Как программно изменить стиль CComboBox, созданого в редакторе ресурсов со стилем DROP LIST?
Код:
CComboBox *CBox=)CComboBox*:GetDlgItem)IDC_COMBO1:; 
CBox->ModifyStyle)0, CBS_DROPDOWN:;

не проходит - никаких изменений (((
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 11-06-2004 17:03 » 

LeM2004,
я может и ошибаюсь, но посмотри внимательно в документации, что возрашает GetDlgItem. У меня такое ошушение, что он возрашает HWND окна, а не ссылку на объект. И для HWND нужно работать по другому. SendMessage или PostMessage . Да кстати я в доке не рылся. это только мои ошушения.  Отлично
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

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

« Ответ #2 : 12-06-2004 11:04 » 

LeM2004,  
Так просто не прокатит, стили задаются при Create, поэтому надо разрушить окно и вызвать  Create  с другим стилем.

Написано правильно - GetDlgItem(IDC_COMBO1) возвращает указатель на врапер CWnd, поэтому нужен кастинг. MFC от API можно легко отличить по отсутствию первого параметра HWND.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 14-06-2004 15:31 » 

Джон, Можно вопрос для моего самообразования. А что в Вижуал Си есть обертка функции GetDlgItem(IDC_COMBO1) у которой ненужно индефецировать к какому диалогу обрашаться. Да я согласен модальный диалог только один, но не модальных можно открыть очень много. И как эта обертка выбирает у кого я хочу спросить. Или это функция класса диалог?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
SOS
Гость
« Ответ #4 : 18-06-2004 14:25 » 

Ребята !!!!!!

В виндах по жизне стили менялись, меняются и будут меняться через:

LONG SetWindowLong(          HWND hWnd,
    int nIndex,
    LONG dwNewLong
);

nIndex = GWL_STYLE
Записан
Джон
просто
Администратор

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

« Ответ #5 : 19-06-2004 17:25 » 

Цитата: SOS
Ребята !!!!!!

В виндах по жизне стили менялись, меняются и будут меняться через:

LONG SetWindowLong(          HWND hWnd,
    int nIndex,
    LONG dwNewLong
);

nIndex = GWL_STYLE


Да нууу!. Жжешь  И это поможет в данном случае?  Ага

Кстати вот что такое ModifyStyle

BOOL PASCAL
CWnd::ModifyStyle(HWND hWnd, DWORD dwRemove, DWORD dwAdd, UINT nFlags)
{
   return _AfxModifyStyle(hWnd, GWL_STYLE, 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;
}

Finch, сорри, не успевал следить за всеми постами, и вопрос упустил из вида. На самом деле всё дело в MFC ( Вижуал Си если ты это имел ввиду). Это и есть врапер (wrapper) или обёртка для API. Один из основных моментов как раз и заключается в том, что хэндл окна засовывается в класс (CWnd) и все производные классы вызывают "обёрточные" функции не заботясь о нужном хэндле.
В частности GetDlgItem вызванная из производного CDialog класса
пользуется сохранённым при Create хэндлом. В принципе все исходники MFC открыты и достаточно заглянуть в них, чтоб увидеть что там происходит:

CWnd* CWnd::GetDlgItem(int nID) const
{
   ASSERT(::IsWindow(m_hWnd));

   if (m_pCtrlCont == NULL)
      return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
   else
      return m_pCtrlCont->GetDlgItem(nID);
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 19-06-2004 17:54 » new

Джон, Спасибо за разьяснения. Я больше в Билдере и WinAPI  программирую. Но теперь буду знать.  :l_lick:  :l_lol:
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines