|
|
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
Есть такая API-функция HWND GetDlgItem(HWND hParent,UINT ctlID), которая возвращает хендл контрола на диалоговом окне. Для обычных контролов (стандартных) работает, а если контрол - ActiveX - выкидывает ошибку (GetLastError) что контрол не найден. Это ограничения функции? Как можно побороть? Спасибо за внимание... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2005, 10:15 |
|
||
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
Никаких ограничений нет. GetDlgItem(HWND hParent,UINT ctlID), ищет дочернее окно указанного окна (hParent) у которого идентификатор окна равен ctlID. Если он не находит окно, значит, что у него либо нет идентификатора (он незадан, или не такой, как вы предполагаете) или оно не дочернее окно указанного окна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2005, 11:18 |
|
||
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
MasterZiv Никаких ограничений нет. GetDlgItem(HWND hParent,UINT ctlID), ищет дочернее окно указанного окна (hParent) у которого идентификатор окна равен ctlID. Если он не находит окно, значит, что у него либо нет идентификатора (он незадан, или не такой, как вы предполагаете) или оно не дочернее окно указанного окна. Прошу пояснить: что значит нет идентификатора? Если на окне есть контрол, то он связывается с ресурсом по некоторому идентификатору. Контрол создается нединамически (в принципе разницы не должно быть). С помощью редактора ресурсов также как и все контролы вставляется на диалоговое окно, присваивается идентификатор ресурса. Например, IDC_AX. Далее имеются еще некоторые контролы , например, IDC_EDIT1,IDC_CHECK1... Когда вызываю ::GetDlgItem(hParent,IDC_EDIT1) - возвращает хендл контрола (окна контрола), когда вызываю ::GetDlgItem(hParent,IDC_AX) - фиг с маслом! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2005, 14:17 |
|
||
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
Alex_VC Прошу пояснить: что значит нет идентификатора? Чтобы идентификатор был, надо его задать. Есть варианты создания окон, когда идентификатор не задается ( возможно, ставится 0 или -1). Alex_VC Далее имеются еще некоторые контролы , например, IDC_EDIT1,IDC_CHECK1... Когда вызываю ::GetDlgItem(hParent,IDC_EDIT1) - возвращает хендл контрола (окна контрола), когда вызываю ::GetDlgItem(hParent,IDC_AX) - фиг с маслом! Ну не знаю. Может в принципе быть что ActiveX вообще окна не создает, или создает, но не дочернее к диалогу. Фиг знает. Да ты Spy запусти и посмотри, есть ли окно и какой у него родитель и ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2005, 17:50 |
|
||
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2005, 18:37 |
|
||
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
Ну если врешь, гляди !! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2005, 22:02 |
|
||
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
Сделал вышеозначенное. Код: 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. Код: 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. IDC_DTPICKER1 определен в resource.h как Код: plaintext 1. Запускаем, находим окно Spy-ем. Видим (см. картинку), что у окна нашего ActiveX-а нет идентификатора окна (он - ноль). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2005, 22:15 |
|
||
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
Заходим в нутрь CWnd::GetDlgItem() и видим : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Т.е. внутри оно использует функцию COleControlSite* COleControlContainer::FindItem(UINT nID) const для поиска ActiveX-контрола по его идентификатору. Вывод : пользуйтесь MFC, он рульный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2005, 22:22 |
|
||
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
Извините, Control ID в Spy не разглядел (надеясь, что если его задали, то он должен быть). Вот ведь засада, блин... Внутрь MFC-ного GetDlgItem тоже заходил, но пока нифига не понял как это все работает: там все делается через какой-то асоциативный массив (карту), т.е. передаваемый идентификатор ищется в этом массиве. Где этот массив формируется и как - не понятно. А про COleControlSite в имеющейся на рабочем месте документации (MSDN) ничего не нашел, а инета под рукой нет - приходится бегать на другое место, да и время ограничено... А через Win API - то можно как-нибудь это сделать (или MFC мертва! Да здравствует MFC!) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2005, 10:18 |
|
||
|
::GetDlgItem и ActiveX
|
|||
|---|---|---|---|
|
#18+
Alex_VC Внутрь MFC-ного GetDlgItem тоже заходил, но пока нифига не понял как это все работает: там все делается через какой-то асоциативный массив (карту), т.е. передаваемый идентификатор ищется в этом массиве. Где этот массив формируется и как - не понятно. Подозреваю, что при создании диалога создаются все ActiveX - контролы, которые в этом диалоге. Вероятно, ссылки на них запихиваются в map ID контрола -> ссылка на окно. Alex_VC А через Win API - то можно как-нибудь это сделать (или MFC мертва! Да здравствует MFC!) ? Ну как же ты сделаешь, если в контроле нет идентификатора окна ? Значит, нельзя. Можно конечно после создания диалога пробежаться по всем ActiveX-сам и самому проставить им идентификаторы окон, тогда наверное после этого все будет работать. Не думаю, что окну-ActiveX-у нельзя в принципе поставить идентификатор, вероятнее всего, в MFC решили это не делать, поскольку все равно нужно хранить список всех ActiveX-контролов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2005, 18:15 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32975364&tid=2033567]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 319ms |

| 0 / 0 |
