Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Visual C++.Dialog Box, в MFC 
:(
    Опции темы
dont
Дата 22.10.2005, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Создаю програму, которая работает с диалоговыми окнами, диалоговое окно создаю с помощью редактора ресурсов, а потом создаю для него отдельний клас на основе CFileDialog.В функции обработки клика на кнопке(дополнительно созданной на этом диалоге с помощью редактора ресурсов)пишу код:

GetParent()->GetDlgItem(0x480)->GetWindowText(m_strFilename);//считываю //строку с edit'a
GetParent()->SendMessage(WM_COMMAND, IDCANCEL);
На этом куске кода у меня выдает ошибку на макрсое ASSERT(::IsWindow(m_hWnd));
Тобишь оно фактически говорит, что GetParent() не возвращает указатель на окно.Не понимаю, в чем причина, может я не в ту сторону рою?

PM MAIL ICQ   Вверх
nikf
Дата 22.10.2005, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

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



Цитата(dont @ 22.10.2005, 19:29)
GetParent()->GetDlgItem(0x480)

а что есть уверенность что это что-то реальное возвращает?
Цитата(dont @ 22.10.2005, 19:29)
GetDlgItem(0x480)
-подозрительно 0x480 чего за цифры

PM MAIL   Вверх
dont
Дата 22.10.2005, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
подозрительно 0x480 чего за цифры

Цитата из файла dlgs.h
Цитата
/* Edit controls */
#define edt1        0x0480

Тобишь проблема врядли в этом, строчкой GetDlgItem(0x480) прога просто должна считывать значения с edit'a и все.
Я вот тут думаю, а не из-за того ли это, что я в обработке клика на кнопке IDС_DELETE,которая изначально не является елементом класса CFileDialog(это я уже вручную ее туда прикрутил), вызываю функцию GetParent(), может это окно не является непосредственным предком для IDC_DELETE?

PM MAIL ICQ   Вверх
Earnest
Дата 23.10.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не ищи сложных объяснений, проверь сначала очевидное.
Во первых, выясни, кто именно порождает ASSERT. С помощью отладчика.
Кандидатов 2: GetParent и GetDlgItem(0x480).

Если я правильно понимаю, это код обработчика, который является методом твоего класса-диалога? Тогда 100%, что это GetDlgItem(0x480). Даже если контрол с таким ID в диалоге есть. Интересно, что ты имеещь в виду, вызывая там GetParent()...





--------------------
...
PM   Вверх
dont
Дата 23.10.2005, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мда.... Оно вызывает Ассерт на функции GetWindowText(m_strFilename).
Хотя вот цитата из МСДН"а:

The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application.

ТОесть исходя из слов разработчиков МСДН"а
Цитата
If the specified window is a control, the text of the control is copied
макрос ::IsWindow(m_hWnd)); не должен вообще вызыватся.
Не понимаю в чем проблема.
PM MAIL ICQ   Вверх
Earnest
Дата 23.10.2005, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



GetWindowText вызывает ASSERT, т.к. m_hWnd равно 0.
А это так, потому что GetDlgItem возвращает 0.
Потому что нет такого контрола у того окна, к которому ты взываешь!

Что, по твоему, возвращает GetParent()? Вовсе не окно-диалог, как ты, видимо, рассчитываешь. В функции обработки клика тебе не надо звать парента. Это ведь метод твоего класса, который наследован от CFileDialog, так? Значит, this и есть то окно, у которого есть кнопка 0x480 (надеюсь, есть smile ). Пиши просто GetDlgItem(ID)->GetWindowText.
А вообще, неплохо бы писать так:
Код

CWnd* pWnd = GetDlgItem(ID_XXX);
ASSERT(pWnd);
pWnd->GetWindowText(str);

По крайней мере, пока не освоишься.



--------------------
...
PM   Вверх
dont
Дата 25.10.2005, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это уже очень интересно, написал так, как ты посоветовал
Код

                               CWnd* pWnd = GetDlgItem(0x480);
        ASSERT(pWnd);
        pWnd->GetWindowText(m_strFilename);


Выдает ошибку на той же GetWindowText(m_strFilename); в файле wincore.cpp, вставлю код функции
Код

void CWnd::GetWindowText(CString& rString) const
{
    ASSERT(::IsWindow(m_hWnd));

#ifndef _AFX_NO_OCC_SUPPORT
    if (m_pCtrlSite == NULL)
    {
#endif
        int nLen = ::GetWindowTextLength(m_hWnd);
        ::GetWindowText(m_hWnd, rString.GetBufferSetLength(nLen), nLen+1);
        rString.ReleaseBuffer();

#ifndef _AFX_NO_OCC_SUPPORT
    }
    else
    {
        m_pCtrlSite->GetWindowText(rString);
    }
#endif
}

Ну вот, первый же ассерт здесь выкидывает Ассершен Дебаг Фейлер!
З.Ы, Насчет 0x480 - прочитал в умной книжке, и сам убедился, что оно определено в файле dlgs.h .


Добавлено @ 03:39
Кстати, насчет GetParent(). В этой же программе в этом же файле на несколько строчек выше в функции OnInitDialog() у меня есть код:
Код

BOOL bRet = CFileDialog::OnInitDialog();
    if (bRet == TRUE) {
        GetParent()->GetDlgItem(IDOK)->SetWindowText("Delete");

Дак вот, он работает совершенно нормально и нормально присваивает кнопке Caption "Delete"!!!
Это меня склоняет думать, что все таки трабл в том, что возможно это из-за того, что моя кнопка ID_DELETE не является родной для стандартного диалога, а поэтому не возвращает нормально указатель на родительское окно. Но как выйти из этой ситуации не знаю... ПОдскажите плз!!!!Меня этот кусок текста уже так достал, и главное что никак разобраться не могу!!! smile

PM MAIL ICQ   Вверх
Coocky
Дата 25.10.2005, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



smile
Ты звпутался окончательно, напиши что тебе конкретно надо сделать, и сделаем, а то со своими НЕНУЖНЫМИ GetParent() достал.
Говори-что тебе надо сделать, только опиши подробно действия..


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 25.10.2005, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



dont
Да, верно, извини, диалог CFileDialog многослойный, поэтому обращение к его стандартным кнопкам через GetParent() и т.д. - правильное, это я запамятовала.
НО:
1) я не совсем поняла, куда ты добавляешь свою кнопку в ресурсах: очень может статься, что ее парентом является таки непосредственно твой класс - попробуй все-таки написать без GetParent().
2) Посмотри Spy'ем, кто чей предок.
3) если кнопка твоя - почему ты используешь какой-то странный идентификатор из dlgs.h, а не какой-нибудь свой IDC_DELETE?
4) Если дело в одной-единственной дополнительной кнопке, можно обойтись без всего этого геморроя - если отказаться от кнопки HELP и заменить на ней текст. Я имею в виду, что можно не создавать свой ресурс и не страдать, где свои кнопки, а где стандартные.

А вообще, я тоже уже запуталась, имеет ли какое-нибудь отношение твоя кнопка ID_DELETE к контролу, у которого ты спрашиваешь текст ...

Кстати, из того, что идентификатор edt1 определен в файле dlgs.h совершенно не следует, что он есть в FileDialog - проверь спаем.


--------------------
...
PM   Вверх
Dov
Дата 25.10.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(dont @ 22.10.2005, 19:29)
GetParent()->GetDlgItem(0x480)->GetWindowText(m_strFilename);//считываю //строку с edit'a

dont,
здесь, имхо, нужно писать так:
GetParent()->SetDlgItem(0x480)->GetWindowText(m_strFilename);


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Earnest
Дата 25.10.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dov @ 25.10.2005, 19:03)
здесь, имхо, нужно писать так:
GetParent()->SetDlgItem(0x480)->GetWindowText(m_strFilename);


Ерунда, попробуй объясни компилятору, что ты имеешь в виду smile
(Нет такой функции CWnd::SetDlgItem(ID), да и какой смысл она может иметь?)



--------------------
...
PM   Вверх
Dov
Дата 25.10.2005, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Да, херню сморозил не подумавши, извиняюсь.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
dont
Дата 26.10.2005, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Да, верно, извини, диалог CFileDialog многослойный, поэтому обращение к его стандартным кнопкам через GetParent() и т.д. - правильное, это я запамятовала.

Что такое "многослойный диалог, сам юзал "GetParent()" т.к. опять таки же прочитал в умной книжке, а про многослойные диалоги там ничего небыло.

Цитата
1) я не совсем поняла, куда ты добавляешь свою кнопку в ресурсах: очень может статься, что ее парентом является таки непосредственно твой класс - попробуй все-таки написать без GetParent().

Я добавляю свою кнопку прямо в редакторе ресурсов на новом только созданом ДиалогБоксе, ее идентификатор IDC_DELETE(вызов многострадючих GetParent()'ov осуществляю при обработке клика на которой) .Потом для этого ресурса диалога создаю класс CSpecialFileDialog(на основе CFileDialog).
Без ГетПарент() пробывал - не помагает.... =(
Цитата
3) если кнопка твоя - почему ты используешь какой-то странный идентификатор из dlgs.h, а не какой-нибудь свой IDC_DELETE?


"Странный идентификатор" я использую для считывания строки из Edit'a(которая есть стандартным елементом класса CFileDialog).

Цитата
3) если кнопка твоя - почему ты используешь какой-то странный идентификатор из dlgs.h, а не какой-нибудь свой IDC_DELETE?

- Никогда с ним не работал, но все же решился: смотрел-смотрел, там столько разнообразных окон,процессов и т.д., что мне трудно было определиться где какое окно, не то что кто есть чьим предком... smile Да и там какие то обозначения окон,класов недружелюбные(по крайней мере для меня smile )
Цитата

Если дело в одной-единственной дополнительной кнопке, можно обойтись без всего этого геморроя - если отказаться от кнопки HELP и заменить на ней текст. Я имею в виду, что можно не создавать свой ресурс и не страдать, где свои кнопки, а где стандартные.

Нет, мне нужно именно так сделать, так что без гемороя не обойтись...


Цитата
Ты звпутался окончательно, напиши что тебе конкретно надо сделать, и сделаем, а то со своими НЕНУЖНЫМИ GetParent() достал.
Говори-что тебе надо сделать, только опиши подробно действия..

Спасибо конечно, но я все таки желаю разобраться, не люблю когда за меня что то кто-то делает. А сделать мне всего то нужно: считать в обработчике
CSpecialFileDialog::OnBnClickedDelete() строку из Edit'a(который являеться стандартным елементом CFileDialog), в котором указываеться имя выбраного файла и отправить родительскому окну класса CView командное сообщение IDCANCEL .


PM MAIL ICQ   Вверх
Coocky
Дата 26.10.2005, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Итак вступление к твоей ошибке...
Вчера дядя Coocky пытался достучатся от родительского окна , к дочернему, которое находится в представлении, еще и в закладке. Так вот, время поджимало. и я под конец рабочего дня рещил за 5 минут достучаться до него через... GetWindow()smile Все нормально, мне возвратило указатель. Только вот указатель только то и мог, что отображать все доступные функции и переменные. Когда я пытался вызвать дочерню функцию, которая имел GetDlgItem(), то угадайте с 3 раз где я вылетал? smile Правильно, на НЕТ ТАКОГО ОКНА ASSERT(::IsWindow(m_hWnd));
Потому что поленился правильно получить указатель. Т.е получить представление, затем закладку, а уж затем , окно диалога связяное с закладкой.Теперь курю, смотрю хоккей.
Так Вот, к чему я -у тебя указатель неправильный. Посмотри , чему равно m_hWnd полученого указателя, через отладчик? Даю рубь за сто, оно равно m_hWnd=??? smile
Теперь к нашим баранам...
Цитата
CSpecialFileDialog::OnBnClickedDelete() строку из Edit'a(который являеться стандартным елементом CFileDialog), в котором указываеться имя выбраного файла и отправить родительскому окну класса CView командное сообщение IDCANCEL .


У тебя
CSpecialFileDialog -это окно ДОЧЕРНЕЕ ( имено ДОЧЕРНЕЕ), те е порождается окном CFileDialog (не путай с наследуется!)?????, так как же тогда ты делаешь GetParent() без приведения к типу указателя smile
Это только первый вопрос!


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 26.10.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Цитата(dont @ 22.10.2005, 23:02)
Тобишь проблема врядли в этом, строчкой GetDlgItem(0x480) прога просто должна считывать значения с edit'a

Вопрос 2
Где CEdit* edit=(CEdit*)GetDlgItem(0x480) ;
edit-> GetWindowText(); smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
dont
Дата 27.10.2005, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Т.е получить представление, затем закладку, а уж затем , окно диалога связяное с закладкой
Объясни пожалуйста как это сделать.
Цитата
Вопрос 2
Где CEdit* edit=(CEdit*)GetDlgItem(0x480) ;
edit-> GetWindowText(); 

Не использовал это приведение, на основании прочитаных строчек в МСДН"е:
Цитата
The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application.
Но теперь понял, что я был неправ.И что это немножко не к тому прилепил.

Я не знаю,уже окончательно запутался, просто прогу писал, основываясь на прочитанной книге, вот цитата

Цитата
void CSpecialFileDialog::OnBnClickedDelete()
{
ODeleteAll = TRUE;
// 0x480 - идентификатор дочернего окна поля ввода File Name1
// (по данным, полученным от SPYXX)
GetParent(}->SetDlgItem(Ox480)->GetWindowText(m_strFileNarne);
GetParent()->SendMessage(WM_COMMAND, IDCANCEL);

Идентификаторы дочерних элементов управления стандартных диалоговых окон пе-
речислены в файле dlgs.h в каталоге Include. В частности, для поля ввода File Name
используется * define-константа edtl. В этом же файле объявлена *с!ейпе-константа
stc32. — Прим, перев.


И еще по-поводу GetParent()'a:
Цитата
Примечание Даже если вы не применяете вложенных диалоговых окон, все рав-
но объекту CFileDialog сопоставлены два окна. Допустим, вы переопре-
делили OnlnitDialog в производном классе и хотите присвоить какой-
нибудь значок диалоговому окну, предназначенному для выбора файлов.
Тогда вы должны вызвать CWnd::GetParent, чтобы получить окно верх-
него уровня по аналогии с тем, что вы делали в программе ЕхОУЬ.
HICON hlcon = AfxGetApp()->LoadIcon(ID_MYICON);
GetParent()->SetIcon(hIcon, TRUE); // установка крупного значка
GetParent()->SetIcon(hIcon, FALSE); // установка мелкого значка


PM MAIL ICQ   Вверх
dont
Дата 27.10.2005, 03:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



smile
Цитата
// 0x480 - идентификатор дочернего окна поля ввода File Name1
// (по данным, полученным от SPYXX)

ПроФФФтыкал! Тем более некогда не пользовался Спайем, теперь буду знать, прошу извенение за напрасное беспокойство и кражу Вашего времени, ошибка оказалась как всегда - в ДНК. smile
Всем БОЛЬШОЕ спасибо за терпение, с которым Вы терпели меня. smile
З.Ы, Не буду прощатся, скажу до встречи!
smile
З.З.Ы. Большое спасибо создателям этого форума, вам нужно памятник нерукотворный поставить.Очень полезный ресурс на котором много умных людей. smile
PM MAIL ICQ   Вверх
Earnest
Дата 27.10.2005, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(dont @ 26.10.2005, 00:19)
Что такое "многослойный диалог, сам юзал "GetParent()" т.к. опять таки же прочитал в умной книжке, а про многослойные диалоги там ничего небыло.

Это не термин - просто надо же как-то называть диалог с вложенными диалогами...
Таким образом Windows обеспечивает программистам возможность расширения своих стандартных диалогов. Если посмотреть Спаем, то внутри диалога OpenFile можно найти еще один диалог. Обычно он пустой и имеет нулевую высоту. Но можно задать свой шаблон со всякими дополнительными элементами, что видимо ты и делаешь. В любом случае, именно этот вложенный диалог является воплощением твоего класса, поэтому к элементам стандартного диалога и нужно обращаться через GetParent()->GetDlgItem...
Да ты уже, наверное, все понял.

В чем ошибка-то была? Наверно, надо было сразу спросить тебя, в какой студии ты работаешь. Я посмотрела спаем 2 приложения, одно создано 6-й студией, другое - 7-й. В первом случае (6) на диалоге OpenFile есть edit с ID=0x480, а вот во-втором (7) - вместо него - комбобокс с совсем другим ID. В этом дело?
Вообще говоря, чтобы не зависеть от таких вещей, лучше не обращаться к чужим полям-идентификаторам напрямую. В CFileDialog есть возможность через переопределение обработчиков уведомлений влезть практически куда-угодно.

Спай - очень полезная штука.



--------------------
...
PM   Вверх
dont
Дата 27.10.2005, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
В чем ошибка-то была?
- Да ошибка была в том, что я написал 0х480(т.к. прочитал опять таки в той же "умной" книжке smile ,которая и написана под седьмую студию, которую я и использую), но.... проверив Спайем, увидел что там КентролАйДи 0x47C. smile smile smile
Цитата
Спай - очень полезная штука.
- Уже знаю.=)

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


 




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


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

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