русский
Germany.ruForen → Архив Досок→ Programmierung

вопрос по API Windows функциям

608  
krys посетитель06.08.08 13:11
NEW 06.08.08 13:11 
Добрый день.
Кто может популярно обьяснить что делает нижестоящая функция:
void CTest::DoEvents()
{
MSG msg;
long sts;
do {
if (sts = PeekMessage(&msg, (HWND) NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} while (sts);
}
спасибо
стойте там и слушайте сюда, именно отсюда будет проистекать
#1 
  scorpi_ прохожий06.08.08 13:30
NEW 06.08.08 13:30 
in Antwort krys 06.08.08 13:11
Каждая графическая программа имеет очередь из сообщений, с помощью которых программа узнаёт о том, что делает пользователь. Данный цикл как раз и забирает по сообщению из этой очереди, перенаправляя их в процедуру обрабатываюшую их.
PS Вместо PeekMessage здесь должно быть GetMessage. Обычно это так выглядит:
        MSG msg;
while ( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return msg.wParam;


#2 
NightWatch коренной житель06.08.08 14:09
NightWatch
NEW 06.08.08 14:09 
in Antwort scorpi_ 06.08.08 13:30
Warning
Because the return value can be nonzero, zero, or -1, avoid code like this:
while (GetMessage( lpMsg, hWnd, 0, 0)) ...
The possibility of a -1 return value means that such code can lead to fatal application errors. Instead, use code like this:
BOOL bRet;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
#3 
krys посетитель06.08.08 14:38
NEW 06.08.08 14:38 
in Antwort krys 06.08.08 13:11
А что делает DispatchMessage?
стойте там и слушайте сюда, именно отсюда будет проистекать
#4 
  scorpi_ прохожий06.08.08 21:55
NEW 06.08.08 21:55 
in Antwort NightWatch 06.08.08 14:09
OK, спасибо за корректировку. Хотя справедливости ради надо сказать, что "For example, the function fails if hWnd is an invalid window handle or lpMsg is an invalid pointer" в данном коде быть не может. Я правда WIN32 API функции всё равно использую только через обёртки проверяющие код возврата и бросающие при необходимости исключения (а также приводящие аргументы к нормальным С++ типам).
#5 
krys посетитель07.08.08 10:07
NEW 07.08.08 10:07 
in Antwort scorpi_ 06.08.08 13:30
У меня такая проблема:
Я пишу Add-ins для Microsoft Visio.Я открываю в Visio документ.
Пока в моей Visual Studio 6 C++ программе (в цикле) происходит обработка данных,
пользователь видит информационное окно с progressbar.
Поскольку операция занимает относительно много времени, то с какого то момента вместо
данных в инфо-окне я вижу белый фон(так же как и вместо чертежа). На визио форуме мне обьяснили, что для того, что бы
дальше видеть содержимое окна, мне надо периодически вызывать команду DoEvents(VB).
поискав в интернете аналоги этой функции для C++, я наткнулся на код который я вам выше показал.
Если я правильно понял, то что написано в MSDN, то PeekMessage не ждет, пока предыдущая операция будет
выполнена. Должен я тем не менее использовать GetMessage?
Во всяком случае использовав мной показанный код, я лишь добился, что окно Visio-приложения приобрело нормальный вид( документ стал снова виден) , но инфо-окно исчезло, хотя программа из цикла ещё не вышла.
С чем это связано и что сделать, чтобы инфо-окно сохранилось ?
стойте там и слушайте сюда, именно отсюда будет проистекать
#6 
  scorpi_ прохожий07.08.08 10:29
NEW 07.08.08 10:29 
in Antwort krys 07.08.08 10:07
В ответ на:
Пока в моей Visual Studio 6 C++ программе (в цикле) происходит обработка данных,

А что версия-то такая старая?
В ответ на:
Поскольку операция занимает относительно много времени, то с какого то момента вместо данных в инфо-окне я вижу белый фон(так же как и вместо чертежа). На визио форуме мне обьяснили, что для того, что бы дальше видеть содержимое окна, мне надо периодически вызывать команду DoEvents(VB). поискав в интернете аналоги этой функции для C++

Я что-то не понял, какой язык используется? Если С++, то надо длительную обработку данных просто в отдельном потоке (thread) делать.
#7 
krys посетитель07.08.08 11:05
07.08.08 11:05 
in Antwort scorpi_ 07.08.08 10:29
собираемся переходить на vc 2008.
используется C++. Можете подкинуть пример как это делается в отдельном потоке?
Если же я все таки обрабатываю все в одном потоке(просто не уверен что я смогу все быстро поменять),
есть ли решение проблемы. Может окно чертежа передать инфо-окну как Owner? Тогда вроде инфо окно не исчезает.
стойте там и слушайте сюда, именно отсюда будет проистекать
#8 
  scorpi_ прохожий07.08.08 11:52
Simple Nothing is f*cked07.08.08 13:13
Simple
NEW 07.08.08 13:13 
in Antwort scorpi_ 07.08.08 10:29
> А что версия-то такая старая?
Видимо, тот же гемор, что и у нас - куча старинного кода :) Мы тоже почти уже перешли, славатебеяйца.
#10 
krys посетитель07.08.08 15:14
NEW 07.08.08 15:14 
in Antwort scorpi_ 07.08.08 11:52
по ходу ещё один вопрос.
Вы не знаете какое знaчение хранит msg.message если я закрываю окно(кнопка Х).?
я хочу предотвратить выполнение этого действия
switch(msg.message)
{
case WM_LBUTTON:
break;
case WM_KEYDOWN: //
break;
default:
TranslateMessage(&msg);
DispatchMessage(&msg);
break;
....

}
стойте там и слушайте сюда, именно отсюда будет проистекать
#11 
NightWatch коренной житель07.08.08 16:34
NightWatch
NEW 07.08.08 16:34 
in Antwort krys 07.08.08 15:14
Тебе надо в оконной процедуре WM_CLOSE обрабатывать.
#12