Вход на сайт
вопрос по API Windows функциям
608
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);
}
спасибо
Кто может популярно обьяснить что делает нижестоящая функция:
void CTest::DoEvents()
{
MSG msg;
long sts;
do {
if (sts = PeekMessage(&msg, (HWND) NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} while (sts);
}
спасибо
стойте там и слушайте сюда, именно отсюда будет проистекать
NEW 06.08.08 13:30
в ответ krys 06.08.08 13:11
Каждая графическая программа имеет очередь из сообщений, с помощью которых программа узнаёт о том, что делает пользователь. Данный цикл как раз и забирает по сообщению из этой очереди, перенаправляя их в процедуру обрабатываюшую их.
PS Вместо PeekMessage здесь должно быть GetMessage. Обычно это так выглядит:
PS Вместо PeekMessage здесь должно быть GetMessage. Обычно это так выглядит:
MSG msg;
while ( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return msg.wParam;
NEW 06.08.08 14:09
в ответ 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);
}
}
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);
}
}
06.08.08 21:55
в ответ 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 функции всё равно использую только через обёртки проверяющие код возврата и бросающие при необходимости исключения (а также приводящие аргументы к нормальным С++ типам).
07.08.08 10:07
в ответ scorpi_ 06.08.08 13:30
У меня такая проблема:
Я пишу Add-ins для Microsoft Visio.Я открываю в Visio документ.
Пока в моей Visual Studio 6 C++ программе (в цикле) происходит обработка данных,
пользователь видит информационное окно с progressbar.
Поскольку операция занимает относительно много времени, то с какого то момента вместо
данных в инфо-окне я вижу белый фон(так же как и вместо чертежа). На визио форуме мне обьяснили, что для того, что бы
дальше видеть содержимое окна, мне надо периодически вызывать команду DoEvents(VB).
поискав в интернете аналоги этой функции для C++, я наткнулся на код который я вам выше показал.
Если я правильно понял, то что написано в MSDN, то PeekMessage не ждет, пока предыдущая операция будет
выполнена. Должен я тем не менее использовать GetMessage?
Во всяком случае использовав мной показанный код, я лишь добился, что окно Visio-приложения приобрело нормальный вид( документ стал снова виден) , но инфо-окно исчезло, хотя программа из цикла ещё не вышла.
С чем это связано и что сделать, чтобы инфо-окно сохранилось ?
Я пишу Add-ins для Microsoft Visio.Я открываю в Visio документ.
Пока в моей Visual Studio 6 C++ программе (в цикле) происходит обработка данных,
пользователь видит информационное окно с progressbar.
Поскольку операция занимает относительно много времени, то с какого то момента вместо
данных в инфо-окне я вижу белый фон(так же как и вместо чертежа). На визио форуме мне обьяснили, что для того, что бы
дальше видеть содержимое окна, мне надо периодически вызывать команду DoEvents(VB).
поискав в интернете аналоги этой функции для C++, я наткнулся на код который я вам выше показал.
Если я правильно понял, то что написано в MSDN, то PeekMessage не ждет, пока предыдущая операция будет
выполнена. Должен я тем не менее использовать GetMessage?
Во всяком случае использовав мной показанный код, я лишь добился, что окно Visio-приложения приобрело нормальный вид( документ стал снова виден) , но инфо-окно исчезло, хотя программа из цикла ещё не вышла.
С чем это связано и что сделать, чтобы инфо-окно сохранилось ?
стойте там и слушайте сюда, именно отсюда будет проистекать
NEW 07.08.08 10:29
А что версия-то такая старая?
Я что-то не понял, какой язык используется? Если С++, то надо длительную обработку данных просто в отдельном потоке (thread) делать.
в ответ krys 07.08.08 10:07
В ответ на:
Пока в моей Visual Studio 6 C++ программе (в цикле) происходит обработка данных,
Пока в моей Visual Studio 6 C++ программе (в цикле) происходит обработка данных,
А что версия-то такая старая?
В ответ на:
Поскольку операция занимает относительно много времени, то с какого то момента вместо данных в инфо-окне я вижу белый фон(так же как и вместо чертежа). На визио форуме мне обьяснили, что для того, что бы дальше видеть содержимое окна, мне надо периодически вызывать команду DoEvents(VB). поискав в интернете аналоги этой функции для C++
Поскольку операция занимает относительно много времени, то с какого то момента вместо данных в инфо-окне я вижу белый фон(так же как и вместо чертежа). На визио форуме мне обьяснили, что для того, что бы дальше видеть содержимое окна, мне надо периодически вызывать команду DoEvents(VB). поискав в интернете аналоги этой функции для C++
Я что-то не понял, какой язык используется? Если С++, то надо длительную обработку данных просто в отдельном потоке (thread) делать.
NEW 07.08.08 11:05
в ответ scorpi_ 07.08.08 10:29
собираемся переходить на vc 2008.
используется C++. Можете подкинуть пример как это делается в отдельном потоке?
Если же я все таки обрабатываю все в одном потоке(просто не уверен что я смогу все быстро поменять),
есть ли решение проблемы. Может окно чертежа передать инфо-окну как Owner? Тогда вроде инфо окно не исчезает.
используется C++. Можете подкинуть пример как это делается в отдельном потоке?
Если же я все таки обрабатываю все в одном потоке(просто не уверен что я смогу все быстро поменять),
есть ли решение проблемы. Может окно чертежа передать инфо-окну как Owner? Тогда вроде инфо окно не исчезает.
стойте там и слушайте сюда, именно отсюда будет проистекать
NEW 07.08.08 11:52
в ответ krys 07.08.08 11:05
NEW 07.08.08 15:14
в ответ 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;
....
}
Вы не знаете какое знaчение хранит msg.message если я закрываю окно(кнопка Х).?
я хочу предотвратить выполнение этого действия
switch(msg.message)
{
case WM_LBUTTON:
break;
case WM_KEYDOWN: //
break;
default:
TranslateMessage(&msg);
DispatchMessage(&msg);
break;
....
}
стойте там и слушайте сюда, именно отсюда будет проистекать