Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > CStatic - "статический текст"


Автор: The Thing 21.8.2004, 14:10
Народ!!!... Я полное ламерье...часов 5 убил на одну хрень, так и не разобрался...
Призываю программистов на Си++ (MFC). Не могу заставить объект класса CStatic принимать сообщения, т.е. как минимум что бы изменялся текст. При передаче ему данных пишет: "Unhandled exception in file.exe (MFC42D.DLL): 0xC0000005: Access Violation.".
/**************************************************************************/
Подробнее:
Есть компонент "Static text" класса CStatic с pId: IDC_Static

Прописываю значит так...(все, что нарыл в инете..)


CStatic *cStr = (CStatic *)(this->GetDlgItem(IDC_STATIC));
//cStr->FromHandled(hWnd); // Я так понял надо передать hWnd объекта...передавал!!
cStr->SetWindowText("test");

hWnd я достал 100% правильно сомнений быть не может тестил...
даже функцию написал на всяк случай.. пока тестил... //разбирает Диал. окошко. по частям и записывает структуированным деревом в файл.. могу кинуть... кому лень писать: handledtth.h

void fun(...)
{
HWND hWnd;
hWnd = ::FindWindow(NULL,"client");
hWnd = ::GetWindow(hWnd, GW_CHILD);
char cStr[10];
GetClassName(hWnd, cStr, 10);

while(::strcmp(cStr, "Static") !=0)
{
hWnd = ::GetNextWindow(hWnd, GW_HWNDNEXT);
GetClassName(hWnd, cStr, 10); //cStr - Ошибки быть не может..
}

CStatic *cstr = (CStatic *)(this->GetDlgItem(IDC_STATIC));
cstr->SetWindowText("test");
}

Да!, когда компилю и на последнюю точку ставлю
"Stop pointer" тестю cstr выдает: "0x00000000 {CStatic hWnd=???}"
Но ведь я присваивал cstr->FromHandle(hWnd);!!!!


Вот в принципе и все..

Unhandled exception in file.exe (MFC42D.DLL): 0xC0000005: Access Violation.


p.s. После надписи курсор перескакивает в "точку конфликта":
//Winocc.cpp
...
void CWnd::SetWindowText(LPCTSTR lpszString)
{
->/*стрелка*/ ASSERT(::IsWindow(m_hWnd));

if (m_pCtrlSite == NULL)
::SetWindowText(m_hWnd, lpszString);
else
m_pCtrlSite->SetWindowText(lpszString);
}
...
/**************************************************************************/
//..-=The Thing=- 11:43 17.08.2004

Автор: Dov 21.8.2004, 15:58
Замени IDC_STATIC на
IDC_STATIC1 или
IDC_МYSTATIC или
IDC_MUMBA_YUMBA или
на что-нибудь другое.

Автор: Temnozor 23.8.2004, 08:33
Цитата(Dov @ 21.8.2004, 18:58)
Замени IDC_STATIC на
IDC_STATIC1 или
IDC_МYSTATIC или
IDC_MUMBA_YUMBA или
на что-нибудь другое.

Да.
Дело в том что невозможно программно менять текст для элемента с идентификатором IDC_STATIC, так как элементов с таким стандартным идентификатором может быть с диалоге очень много и система не сможет понять к которому из них обращается программа. Так что надо этому элементу присвоить уникальный идентификатор. А если это элемент в чужой программе, то достучаться до него ты не сможешь никак.

Автор: The Thing 2.9.2004, 19:46
эээ... да, но this->GetDlgItem(IDC_STATIC) указатель именно на объект IDC_STATIC, при чем здесь название....если я его изменю, то я не попаду на свой эллемент, если я правильно понял..

Я работаю со своим приложением... т.е енто не из чужой проги...

Автор: Олег М 3.9.2004, 05:43
Цитата(The @ 2.9.2004, 22:46)
эээ... да, но this->GetDlgItem(IDC_STATIC) указатель именно на объект IDC_STATIC, при чем здесь название....если я его изменю, то я не попаду на свой эллемент, если я правильно понял..

IDC_STATIC это не объект - это идентификатор объекта, а вообще - макрос. Все статические тексты в диалоге имеют этот идентификатор, так что он не является уникальным и ты не можешь получит через него доступ к какому-то конкретному тексту. Для этого надо изменить в редакторе ресурсов идентификатор текста, к которому ты хочешь обратиться на какой-нибудь другой, уникальный для диалога. Тогда ты легко сможешь получить указатель на этот объект через GetDlgItem (это всегда будет указатель на CWnd, неважно какой идентификатор ты указал) потом преобразовать его СStatic
Код
CStatic *pStatic = (CStatic *)GetDlgItem(IDC_MYTEXT);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)