Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / ::GetDlgItem и ActiveX / 10 сообщений из 10, страница 1 из 1
23.03.2005, 10:15
    #32975364
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
Есть такая API-функция HWND GetDlgItem(HWND hParent,UINT ctlID),
которая возвращает хендл контрола на диалоговом окне. Для обычных контролов (стандартных) работает, а если контрол - ActiveX - выкидывает ошибку (GetLastError) что контрол не найден.
Это ограничения функции?
Как можно побороть?

Спасибо за внимание...
...
Рейтинг: 0 / 0
23.03.2005, 11:18
    #32975603
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
Никаких ограничений нет.
GetDlgItem(HWND hParent,UINT ctlID),
ищет дочернее окно указанного окна (hParent) у которого идентификатор окна равен ctlID. Если он не находит окно, значит, что у него либо нет идентификатора (он незадан, или не такой, как вы предполагаете) или оно не дочернее окно указанного окна.
...
Рейтинг: 0 / 0
23.03.2005, 14:17
    #32976216
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
MasterZiv Никаких ограничений нет.
GetDlgItem(HWND hParent,UINT ctlID),
ищет дочернее окно указанного окна (hParent) у которого идентификатор окна равен ctlID. Если он не находит окно, значит, что у него либо нет идентификатора (он незадан, или не такой, как вы предполагаете) или оно не дочернее окно указанного окна.
Прошу пояснить: что значит нет идентификатора?
Если на окне есть контрол, то он связывается с ресурсом по некоторому идентификатору. Контрол создается нединамически (в принципе разницы не должно быть). С помощью редактора ресурсов также как и все контролы вставляется на диалоговое окно, присваивается идентификатор ресурса.
Например, IDC_AX.
Далее имеются еще некоторые контролы , например, IDC_EDIT1,IDC_CHECK1...
Когда вызываю ::GetDlgItem(hParent,IDC_EDIT1) - возвращает хендл контрола (окна контрола), когда вызываю ::GetDlgItem(hParent,IDC_AX) - фиг с маслом!
...
Рейтинг: 0 / 0
23.03.2005, 17:50
    #32977062
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
Alex_VC
Прошу пояснить: что значит нет идентификатора?


Чтобы идентификатор был, надо его задать. Есть варианты создания окон, когда идентификатор не задается ( возможно, ставится 0 или -1).

Alex_VC
Далее имеются еще некоторые контролы , например, IDC_EDIT1,IDC_CHECK1...
Когда вызываю ::GetDlgItem(hParent,IDC_EDIT1) - возвращает хендл контрола (окна контрола), когда вызываю ::GetDlgItem(hParent,IDC_AX) - фиг с маслом!

Ну не знаю. Может в принципе быть что ActiveX вообще окна не создает, или создает, но не дочернее к диалогу. Фиг знает.
Да ты Spy запусти и посмотри, есть ли окно и какой у него родитель и ID.
...
Рейтинг: 0 / 0
23.03.2005, 18:37
    #32977153
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
MasterZiv
Ну не знаю. Может в принципе быть что ActiveX вообще окна не создает, или создает, но не дочернее к диалогу. Фиг знает.
Да ты Spy запусти и посмотри, есть ли окно и какой у него родитель и ID.
Дык, есессно, смотрел: и хендл есть и родитель - то же диалоговое окно.
Кстати, можете сами попробовать: есть такой контрол Microsoft Date and Time Picker Control 6.0 (типа стандартного Date Time Picker).
Размещаешь его на диалоговом окне (по умолчанию присваивается ID= IDC_DTPICKER1), делаешь, к примеру, ::EnableWindow(::GetDlgItem(this->GetSafeHwnd(),IDC_DTPICKER1),FALSE);
и смотрим что получилось.
Кстати, если делать через MFC (GetDlgItem(IDC_DTPICKER1)->EnableWindow(FALSE)), то все работает...
Кажется, та же ситуация, что и с ::MoveWindow() для ActiveX.
...
Рейтинг: 0 / 0
23.03.2005, 22:02
    #32977324
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
Ну если врешь, гляди !!
...
Рейтинг: 0 / 0
23.03.2005, 22:15
    #32977331
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
Сделал вышеозначенное.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
class CAXControlDlg : public CDialog
{
// Construction
public:
	CAXControlDlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	//{{AFX_DATA(CAXControlDlg)
	enum { IDD = IDD_AXCONTROL_DIALOG };
	CDTPicker	m_dt;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAXControlDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:

	// Generated message map functions
	//{{AFX_CAXControlDlg
	virtual BOOL OnInitDialog();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
/////////////////////////////////////////////////////////////////////////////
// CAXControlDlg dialog

CAXControlDlg::CAXControlDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CAXControlDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CAXControlDlg)
	//}}AFX_DATA_INIT
}

void CAXControlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAXControlDlg)
	DDX_Control(pDX, IDC_DTPICKER1, m_dt);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAXControlDlg, CDialog)
	//{{AFX_MSG_MAP(CAXControlDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAXControlDlg message handlers

BOOL CAXControlDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

IDC_DTPICKER1 определен в resource.h как
Код: plaintext
1.
#define IDC_DTPICKER1                    1000 

Запускаем, находим окно Spy-ем. Видим (см. картинку), что у окна нашего ActiveX-а нет идентификатора окна (он - ноль).
...
Рейтинг: 0 / 0
23.03.2005, 22:22
    #32977337
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
Заходим в нутрь CWnd::GetDlgItem() и видим :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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);
}

Т.е. внутри оно использует функцию
COleControlSite* COleControlContainer::FindItem(UINT nID) const
для поиска ActiveX-контрола по его идентификатору.

Вывод : пользуйтесь MFC, он рульный.
...
Рейтинг: 0 / 0
24.03.2005, 10:18
    #32977748
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
Извините, Control ID в Spy не разглядел (надеясь, что если его задали, то он должен быть). Вот ведь засада, блин...
Внутрь MFC-ного GetDlgItem тоже заходил, но пока нифига не понял как это все работает: там все делается через какой-то асоциативный массив (карту),
т.е. передаваемый идентификатор ищется в этом массиве. Где этот массив формируется и как - не понятно. А про COleControlSite в имеющейся на рабочем месте документации (MSDN) ничего не нашел, а инета под рукой нет - приходится бегать на другое место, да и время ограничено...
А через Win API - то можно как-нибудь это сделать (или MFC мертва! Да здравствует MFC!) ?
...
Рейтинг: 0 / 0
24.03.2005, 18:15
    #32979427
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
::GetDlgItem и ActiveX
Alex_VC
Внутрь MFC-ного GetDlgItem тоже заходил, но пока нифига не понял как это все работает: там все делается через какой-то асоциативный массив (карту),
т.е. передаваемый идентификатор ищется в этом массиве. Где этот массив формируется и как - не понятно.


Подозреваю, что при создании диалога создаются все ActiveX - контролы, которые в этом диалоге. Вероятно, ссылки на них запихиваются в
map ID контрола -> ссылка на окно.

Alex_VC
А через Win API - то можно как-нибудь это сделать (или MFC мертва! Да здравствует MFC!) ?


Ну как же ты сделаешь, если в контроле нет идентификатора окна ?
Значит, нельзя.
Можно конечно после создания диалога пробежаться по всем ActiveX-сам и самому проставить им идентификаторы окон, тогда наверное после этого все будет работать. Не думаю, что окну-ActiveX-у нельзя в принципе поставить идентификатор, вероятнее всего, в MFC решили это не делать, поскольку все равно нужно хранить список всех ActiveX-контролов.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / ::GetDlgItem и ActiveX / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]