Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 440
от 18.06.2006, 16:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 346, Экспертов: 50
В номере:Вопросов: 3, Ответов: 4


Вопрос № 46012: Знакома ль такая штука?! Создаю MFC-проект, имеется StatusBar. Шмёшь Button и запускается рабочий поток (ну скажем - AfxBeginThread(СalcIntegral, this);) UINT СalcIntegral(LPVOID lpParam) { CMyWnd * wnd = (CMyWnd*)...
Вопрос № 46038: Уважаемые эксперты, подскажите как получить handle окна windows и его элементам?...
Вопрос № 46042: Здраствуйте. У меня возникает проблема при написании легкой програмы на С++ builder 6. Я хочу выдать при работе с циклом в одну строчку(в label,statictext или в мемо) сообщение или цифры, чтобы они не замещали друг друга во время цикла....

Вопрос № 46.012
Знакома ль такая штука?!

Создаю MFC-проект, имеется StatusBar.
Шмёшь Button и запускается рабочий поток
(ну скажем - AfxBeginThread(СalcIntegral, this);)

UINT СalcIntegral(LPVOID lpParam)
{
CMyWnd * wnd = (CMyWnd*)lpParam;
char pos[10];
// ... проверки всякие
// запускаем цикл вычисления
for(int i=0;i<.......
{
// ....считает какая-нибудь функция
wnd->m_ProgressBar.SetPos(100*i/Max); // работает нормально

itoa(wnd->m_ProgressBar.GetPos(), pos, 10);
CString position(pos);

wnd->m_StatusBar.SetPaneText(0, position_i); // ????????!!!!!!!
!!!!!!!!!// Вот в этом месте срабатывает ASSERT файла wincore.cpp
}
return 0;
}

Все остальные контролы работают безотказно...
Не пойму в чём дело
Отправлен: 12.06.2006, 17:44
Вопрос задал: Яковлев Сергей Павлович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: gitter
Здравствуйте, Яковлев Сергей Павлович!
Действительно, в Debug версии срабатывает 2-й ASSERT ниже, в вызове функции CWnd::AssertValid
// should also be in the permanent or temporary handle map

CHandleMap* pMap = afxMapHWND();
ASSERT(pMap != NULL);

CObject* p;
ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
(p = pMap->LookupTemporary(m_hWnd)) != NULL);

И действительно, функция afxMapHWND() возвращает карты [текущего] потока,
но в потоке, который Вы создаете этих карт нет (т.е. LookupPermanent(m_hWnd)==NULL).
Но в Release'е Вы этого ASSERT'а не увидите
Поэтому, предлагаю такое решение проблемы:
в DEBUG версии не показывать результаты в строку статуса, а в Release'е - показывать, т.е. необходимо будет сделать следующее

#ifndef _DEBUG
wnd->m_StatusBar.SetPaneText(0, position);
#endif

Удачи!
Ответ отправил: gitter (статус: 5-ый класс)
Ответ отправлен: 12.06.2006, 23:18
Оценка за ответ: 4
Комментарий оценки:
В release'е работает прога очень плохо, т.е. в StatusBar'е то выходят цифорки, то не выходят


Вопрос № 46.038
Уважаемые эксперты, подскажите как получить handle окна windows и его элементам?
Отправлен: 12.06.2006, 22:14
Вопрос задал: Azrr (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Татьяна
Здравствуйте, Azrr!
Все зависит от того, какие окна (ваши или чужие) вам надо искать.
Существует возможность поиска окна по заголовку (FindWindow)
Для поиска дочерних окон необходимо использвать функцию getWindow c флагом GW_CHILD.
Справка по этим функциям в приложении. Желаю удачи!

Приложение:

---------
Возможно все. И ничего возможно тоже.

Ответ отправила: Татьяна (статус: Студент)
Ответ отправлен: 13.06.2006, 12:00
Оценка за ответ: 5

Отвечает: Zitz
Здравствуйте, Azrr!

FindWindow ?
GetNextWindow ?
WindowFromPoint ?
ChildWindowFromPoint ?
GetForegroundWindow ?
GetActiveWindow ?

Доступ к "элементам" можно получить через их handle, т.к. это тоже окна, чтобы по детям окна попрыгать можно использовать
GetWindow
Контактировать с окнами можно посылая им всякие сообщения.
Ну например через GetWindowLong/SetWindowLong

Чтобы по загруженным модулям попрыгать можно использовать
CreateToolhelp32Snapshot
Module32First
Module32Next

А вообще самое верхнее окно - рабочий стол, к нему привязаны вообще все окна, получить его можно так:
GetDesktopWindow
---------
Успех неизбежен
Ответ отправил: Zitz (статус: Студент)
Ответ отправлен: 13.06.2006, 12:16
Оценка за ответ: 5


Вопрос № 46.042
Здраствуйте. У меня возникает проблема при написании легкой програмы на С++ builder 6. Я хочу выдать при работе с циклом в одну строчку(в label,statictext или в мемо) сообщение или цифры, чтобы они не замещали друг друга во время цикла.
Отправлен: 12.06.2006, 22:31
Вопрос задал: HITY (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: DeVampir
Здравствуйте, HITY!
Попобуйте не присваивать текст в Label, а добавлять
for (int i = 0; i < 10; i++)
Label1.Caption = Label1.Caption + StrToInt(i);
можно между ними еще и пробел добавлять
---------
Нам будет трудно - это терпимо! (с) М. Горшенев
Ответ отправил: DeVampir (статус: 1-ый класс)
Ответ отправлен: 13.06.2006, 17:41


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.34 от 01.06.2006
Яндекс Rambler's Top100

В избранное