Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать что hwnd на самом деле CEdit 
:(
    Опции темы
17dufa
Дата 25.11.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день.
По определенному условию мне нужно все контролы на окне задисаблить, кроме кнопки выхода. делаю так:
Код

BOOL __stdcall DisableWindow(HWND hwnd, LPARAM lparam)
{
    EnableWindow(hwnd, FALSE);
    return TRUE;
}

void DisableAll(CWnd * main)
{
    EnumChildWindows(main->m_hWnd, DisableWindow, NULL);
}
....
if (condition)
{
     DisableAll(this);
     GetDlgItem(IDCANCEL)->EnableWindow(TRUE);
}

Все работает, но для CEdit хотелось бы не Enable(FALSE), а SetReadOnly(TRUE). Соответственно в функции DisableWindow надо как-то различить чем же на самом деле является hwnd. попробовал так:
Код

BOOL __stdcall DisableWindow(HWND hwnd, LPARAM lparam)
{
    CWnd* pWnd = CWnd::FromHandle(hwnd);
    if (pWnd->IsKindOf(RUNTIME_CLASS(CEdit)))
    {
        static_cast<CEdit*>(pWnd)->SetReadOnly(TRUE);
    }
    else
    {
        EnableWindow(hwnd, FALSE);
    }
    return TRUE;
}

не работает. То есть static_cast<CEdit*>(pWnd)->SetReadOnly(TRUE); вызывается, но edit все равно в результате оказываются Disable.
PM MAIL   Вверх
Andrey44
Дата 25.11.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 12
Всего: 26



Код

int GetClassName(          HWND hWnd,
    LPTSTR lpClassName,
    int nMaxCount
);

Попробуй так. МФЦ не надежная штука! smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 25.11.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 12
Всего: 26



Код

#define MAX_CLASSNAME   1024
BOOL __stdcall DisableWindow(HWND hwnd, LPARAM lparam)
{
   TCHAR className[MAX_CLASSNAME];
   GetClassName(hwnd, className, MAX_CLASSNAME);
    if (!wcsicmp(className, _T("edit"))
    {
        SendMessage(hwnd, EM_SETREADONLY, TRUE, (LPARAM)0);
    }
    else
    {
        EnableWindow(hwnd, FALSE);
    }
    return TRUE;
}



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
17dufa
Дата 26.11.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Andrey44, стреляет. спасибо. а можно что-нить подобное сделать с комбобоксами? чтоб стрелочка вниз была задисайблена, а текст выглядел как у ReadOnly едита?

и еще один вопрос, GroupBox притворяется Button'ом, как его разоблачить? дисайблить групбоксы и статики тож некошерно.

Это сообщение отредактировал(а) 17dufa - 26.11.2009, 12:48
PM MAIL   Вверх
Andrey44
Дата 26.11.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 12
Всего: 26



Цитата(17dufa @  26.11.2009,  12:20 Найти цитируемый пост)
а можно что-нить подобное сделать с комбобоксами? чтоб стрелочка вниз была задисайблена, а текст выглядел как у ReadOnly едита? 
Попробовать конечно можно, но не знаю получится-ли
Код

#define MAX_CLASSNAME   1024
BOOL __stdcall DisableWindow(HWND hwnd, LPARAM lparam)
{
   TCHAR className[MAX_CLASSNAME];
   GetClassName(hwnd, className, MAX_CLASSNAME);
    if (!wcsicmp(className, _T("ComboBoxEx32"))//или ComboBox
    {
        HWND hcombo = SendMessage(hwnd, CBEM_GETCOMBOCONTROL, 0, (LPARAM)0);
        EnableWindow(hcombo, FALSE);
        HWND hedit = SendMessage(hwnd, CBEM_GETEDITCONTROL, 0, (LPARAM)0);
        SendMessage(hedit, EM_SETREADONLY, TRUE, (LPARAM)0);
    }
    else
    {
        EnableWindow(hwnd, FALSE);
    }
    return TRUE;
}
Как-то так

Это сообщение отредактировал(а) Andrey44 - 26.11.2009, 13:01


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
17dufa
Дата 26.11.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Andrey44, не получается, hcombo и hedit но нулям.
интереснее вопрос с групбоксом. почему он в качестве класса указывает Button и как его отличить от реального Button.
PM MAIL   Вверх
Andrey44
Дата 26.11.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 12
Всего: 26



Цитата(17dufa @  26.11.2009,  13:14 Найти цитируемый пост)
hcombo и hedit но нулям

Да, посмотрел, это только для ComboBoxEx32

Добавлено через 5 минут и 47 секунд
Цитата(17dufa @  26.11.2009,  13:14 Найти цитируемый пост)
почему он в качестве класса указывает Button и как его отличить от реального Button. 

По стилям, у гроупбокса стиль 
Цитата(MSDN)

BS_GROUPBOX 
Creates a rectangle in which other controls can be grouped. Any text associated with this style is displayed in the rectangle's upper left corner.


Добавлено через 7 минут и 12 секунд
Таким образом получаем стили кнопки GetWindowLong(...............) проверяем стоит ли такой стиль и действуем соответственно


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
17dufa
Дата 26.11.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нашел вот такую функцию:
GetComboBoxInfo
но и она возвращает HWND едита нулевым, хотя HWND самого комбо и списка достаточно осмысленные возвращает.

Так как перехитрить GroupBox?
PM MAIL   Вверх
Earnest
Дата 27.11.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(Andrey44 @  25.11.2009,  22:50 Найти цитируемый пост)
Попробуй так. МФЦ не надежная штука! 

Причем тут MFC, если человек глупость делает...

Цитата(17dufa @  26.11.2009,  14:53 Найти цитируемый пост)
Так как перехитрить GroupBox? 

Проверить стиль. Групбокс - это действительно кнопка, но со стилем BS_GROUPBOX. Кроме того, тип поля лучше узнавать, посылая полю WM_GETDLGCODE. Поскольку стоит только сделать на основе стандартного эдита свой класс, с небольшими добавками, так сразу твой код проверки класса работать не будет. Эта тема уже обсуждалась где-то в АПИ-форуме, поищи.

Добавлено через 1 минуту и 50 секунд
Цитата(17dufa @  26.11.2009,  14:53 Найти цитируемый пост)
нашел вот такую функцию:
GetComboBoxInfo
но и она возвращает HWND едита нулевым

Не у всякого комбобокса есть эдит, а только у DROPDOWN. Кроме прочего, едит проще достать и как первого чайлда комбобокса (GetWindow), ибо ф-я GetComboBoxInfo не на всех виндоусах работает.



--------------------
...
PM   Вверх
17dufa
Дата 1.12.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Earnest, 
да, мои комбо DROPLIST. и наскока я понял рантайм поменять стиль комбо - это надо комбо пересоздать. пусть будут Disable.

с WM_GETDLGCODE не до конца понятно. в мсдн есть DLGC_BUTTON, DLGC_STATIC, а вот для едита какой будет код возврата? DLGC_WANTALLKEYS? а я едит ни с кем не перепутаю в таком подходе?
еще у мя MaskEdit используется. я его сейчас так отлавливаю: !strcmp(className, _T("MSMaskWnd")). Если на WM_GETDLGCODE перейти, то как MaskEdit отловить?
PM MAIL   Вверх
Earnest
Дата 1.12.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Для определения эдита лучше использовать код DLGC_HASSETSEL; WANTKEYS действительно многие могут использовать, а HASSETSEL означает, что контрол принимает сообщение EM_SETSEL. Т.е. это Edit, RichEdit и все их производные.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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