Что нового

[Элементы GUI] Как заставить чужой элемент вызвать сообщение о его обновлении

EqKeeper

Новичок
Сообщения
29
Репутация
1
Леди и джентльмены, вопрос: как заставить чужой контрол вызвать сообщение об обновлении себя любимого?
Например, есть ComboBox. Я посылаю сообщение CB_SETCURSEL. Индекс изменяется, контрол перерисовывается, но при этом CBN_SELCHANGE не отправляется. OnChange не вызывается. Соответственно все, что связано с этим контролом, например список файлов, если ComboBox определял маски.
Как быть? Интересует корретный и, по возможности, универсальный способ вызвать обновление контрола. В данный момент я посылаю сообщение открытия списка, затем сообщение выбора элемента, затем кликаю по контролу. Но это костыль. Причем не универсальный. К примеру, чтобы пометить CheckBox или RadioButton, мне, вместо отправки SETCHECK приходится щелкать по ней, пока GETCHECK не вернет нужное состояние. Ужасно, в общем. Посоветуйте. :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
EqKeeper,
ControlCommand()?
 
Автор
E

EqKeeper

Новичок
Сообщения
29
Репутация
1
Ммм... А можно его исходники или просто интерпретацию на WinAPI? :scratch:
 

Dreadfulangel

Знающий
Сообщения
19
Репутация
11
C++:
if ( strcmpi(szCmd,"SETCURRENTSELECTION")==0 )
		{
			if ( strnicmp(vParams[2].szValue(),"Combo",5)==0 )
			{
				vMsg = CB_SETCURSEL;
				xMsg = CBN_SELCHANGE;
				yMsg = CBN_SELENDOK;
			}
			if ( strnicmp(vParams[2].szValue(),"List",4)==0 )
			{
				vMsg = LB_SETCURSEL;
				xMsg = LBN_SELCHANGE;
				yMsg = LBN_DBLCLK;
			}
			if ( vMsg )
			{// Must be ComboBox or ListBox
				if ( SendMessage(m_ControlSearchHWND, vMsg, (WPARAM)vParams[4].nValue(), 0) == -1 )
					SetFuncErrorCode(1);
				else
				{
					SendMessage(GetParent(m_ControlSearchHWND),WM_COMMAND,(WPARAM)MAKELONG(GetDlgCtrlID(m_ControlSearchHWND),xMsg),(LPARAM)m_ControlSearchHWND);
					SendMessage(GetParent(m_ControlSearchHWND),WM_COMMAND,(WPARAM)MAKELONG(GetDlgCtrlID(m_ControlSearchHWND),yMsg),(LPARAM)m_ControlSearchHWND);
				}
			}
			break;							// SETCURRENTSELECTION performed, exit switch
		}
Исходник http://www.autoitscript.com/autoit3/files/archive/autoit/autoit-v3.1.0-src.exe
 
Автор
E

EqKeeper

Новичок
Сообщения
29
Репутация
1
Спасибо большое. Сейчас осознаю, надеюсь, что поможет.


Добавлено:
Сообщение автоматически объединено:

Да, все чудесно. Огромное спасибо обоим! :beer:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,469
EqKeeper

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"[Элементы GUI] $CB_SETCURSEL / _GUICtrlComboBoxEx_SetCurSel" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Администратор.










Dreadfulangel
Это не AutoIt код.
На форуме есть подсветка и других кодов (подробнее).
Поправил сообщение.
 
Автор
E

EqKeeper

Новичок
Сообщения
29
Репутация
1
Добавил слово "Нотификация" в название темы. Больше не влезло.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,469
EqKeeper [?]
Добавил слово "Нотификация" в название темы. Больше не влезло.
Дело не в том сколько влезло, а в том насколько фантазии хватило :smile:

Вот в первом сообщений есть вопрос:
[?]
как заставить чужой контрол вызвать сообщение об обновлении себя любимого?
Почему нельзя было это использовать в качестве заголовка?
Конечно же с небольшим изменением: «Как заставить чужой элемент вызвать сообщение о его обновлении»
 
Автор
E

EqKeeper

Новичок
Сообщения
29
Репутация
1
Ну... это как-то не солидно. :D
Но приму к сведению. В будущем буду стараться давать темам более понятные имена. Хотя и не уверен, что сие будущее будет - мне-таки надоело отсутствие классов и мультипоточности в AutoIT, и до глубины души обидела первоапрельская шутка. Так что я показал разработчикам язык и взялся переписывать его на C#, с чем успешно справляюсь и уже начал писать на нем простенькие макросы - сказка. ^_^
 
Верх