| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Сообщения Windows |
| Автор: Gorbatovsky 31.5.2004, 13:28 |
| У меня проект некий гибрид из DOC и Windows. Как послать сообщение клавному окну типа SendMessage (hParent, ...), чтобы приложение перерисовало само себя. А может в обработчике сообщений не хватает какого сообщения. В чем проблема. Приложение корректно ведет себя с другими программами, если чужое окно двигается сверху, то моя программа себя перерисовывает. А если свое дочернее окно двигается, или закрывается, то главная программа об этом не знает. Добавлено @ 13:34 К сожалению изменить обработчик сообщений пока нельзя. |
| Автор: AndyY 31.5.2004, 14:46 |
| путь попроще: ::InvalidateRect( hparent, &rect, 1 ); ::UpdateWindow( hparent ); поинтересней: ::RedrawWindow( hparent, .. ); |
| Автор: Gorbatovsky 31.5.2004, 15:54 |
| Спасибо AndyY за помощь. Попробовал 2 варианта: 1/////// ::InvalidateRect(hParent,NULL,FALSE); ::UpdateWindow( hParent ); 2////// RedrawWindow(hParent ,NULL,NULL,RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW); Не помогает. Сообщаю подробности. Когда закрываю CFileDialog Перерисовывается все, кроме фона. А когда двигаю CFileDialog, то ничего не рисуется. Черный фон.. |
| Автор: AndyY 31.5.2004, 16:04 |
| видать какая-то кривизна в обработке WM_PAINT или WM_ERASEBACKGRND есть такие орлы... а изменить обработчик можно у любого окна. На это есть SetWindowLong( h, GWL_WNDPROC, my_proc ); восстановить можно также. а старый обработчик вызвать через CallWindowProc. для начала я перед CFIleDlg поставил бы wndproc которая заливает все белым на WM_PAINT - и посмотрел результат. Если, конечно, исходники основного окна не доступны. |
| Автор: Масяня 31.5.2004, 18:04 | ||
Так что же это за "гибрид ДОС и Win32" такой? З.Ы. AndyY прав - WM_PAINT тебя спасет! |
| Автор: chipset 31.5.2004, 19:02 |
| Может имеется в виду консольная программа.... |
| Автор: Gorbatovsky 31.5.2004, 19:04 | ||
| Дополнительная информация. Возможно что, выражение "гибрид ДОС и Win32" не очень удачное. Программа раньше работала под ДОС. 5 лет назад ее переделали для Windows. Ну и не сделали как следует( не доделали). Некоторые модули для меня не доступны. Добавлено @ 19:08
Программа не консольная. Внешний вид у нее как у программ до Windows. Нету окон. Свое меню. |
| Автор: Масяня 31.5.2004, 19:20 |
| Если нету окон и нету меню.... это еще не значит что это ДОС-прога! Самый простой способ узнать это открыть эту прогу, например, в Блокноте и если там в начале "MZ" и "This program cannot be run in DOS mode.", то это конслольная прога. |
| Автор: chipset 31.5.2004, 19:36 |
| Да.. У Харта вся книга описывается с консолькой.. А у него там полно всяких фигатеней с кучами, тридами, процессами, семафорами |
| Автор: Gorbatovsky 31.5.2004, 20:31 |
| Ув. Масяня, я ведь не говорил, что это ДОС- программа. Это программа (IDraw) берет свое начало еще в доисторические времена... " IDraw "originally ran under the HTS (Higher Time Sharing ) operation System. The first "IDraw " run on the System 150. in 1980 SUN-Version IDraw was the first Unix implementation and introdused in june 1988 Эта программа появилась еще до PC. Консольные приложения здесь не причем. IDraw занимает все окно. Например, как игра в полноэкранном режиме. |
| Автор: AndyY 1.6.2004, 08:43 |
| Gorbatovsky провели эксперимент с подменой WNDPROC? интересен результат |
| Автор: Gorbatovsky 1.6.2004, 10:51 |
| Эксперимент с заливкой белым и с подменой WNDPROC пока не провел. Изучаю как рисовать в полноэкранном режиме. |
| Автор: Gorbatovsky 1.6.2004, 11:55 | ||
| AndyY Я провел небольшой эксперимент. Перед fileDlg.DoModal(); я вставил такой фрагмент
Получилось такое поведение. Когда вызываю диалог первый раз фрагмент эллипса появляется и закрашивается черным цветом. Второй раз Эллипс рисуется сверху меню. |
| Автор: Gorbatovsky 1.6.2004, 12:14 |
| Дополнительная информция... Когда открыто окно CFileDialog, то главное окно себе не перисовывает себя при перемещении других программ поверх. |
| Автор: AndyY 1.6.2004, 12:32 |
| в общем-то это никак не связано с обработкой WM_PAINT... а не может быть варианта, что WM_PAINT не обрабатывается вовсе, а все рисуется через GetDC в то время, когда на экране нужно что-нибудь изменить? по симптомам похоже... |
| Автор: Gorbatovsky 1.6.2004, 13:03 | ||
Приложение корректно ведет себя с другими программами, если чужое окно двигается сверху, то моя программа себя перерисовывает. |
| Автор: mr.DUDA 1.6.2004, 13:20 |
| гипотеза номер 2: Может ли быть такое, что при выполнении модального диалог бокса (как CFileDialog) поток сообщений основного окна "замораживается" ?... тогда, естественно, никакие мессаги типа WM_PAINT или WM_MOUSEMOVE, которые идут через очередь сообщений, до главного окна не доходят. |
| Автор: Gorbatovsky 1.6.2004, 14:18 |
| mr.DUDA, Вы несомненно правы. В правильном приложении, когда висит модальный диалог этого (замораживания) не происходит. Но я хочу заставить главное окно перерисовать себя после закрытия диалога. Еще одно уточнение. Диалог я создаю в dll |
| Автор: AndyY 1.6.2004, 14:58 |
| dll роли не играет. а диалог в основном потоке создается? может, проблема с синхронизацией? предлагаю натравить шпиона (spy++) на основное окно и посмотреть какие сообщения ходят во время открытого диалога. кстати, какая OS? вроде XP как-то сохраняет картинку на окне даже подвисшей задачи, поэтому при движении чужого окна ничего не апдейтится. |
| Автор: Gorbatovsky 1.6.2004, 15:06 |
| Диалог в основном потоке создается. OC-XP. При движении чужого окна картинка восстанавливается. AndyY, Вы полагаете, что это делает (картинку восстанавливает) OC? |
| Автор: AndyY 1.6.2004, 15:13 |
| да, я с таким встречался. у подвисшего окна не перерисовывается только меню (белая полоса) но у вас меню нет... так что с потоками и сообщениями? |
| Автор: Gorbatovsky 1.6.2004, 16:02 |
| Привожу фрагмент сообщений полученных утилитой Spy WM_MOUSEMOVE WM_NCHITTEST я отключил <00001> 001703DC S ..........................................................WM_WINDOWPOSCHANGING lpwp:0012FE7C <00002> 001703DC R ..........................................................WM_WINDOWPOSCHANGING <00003> 001703DC S ..........................................................WM_NCPAINT hrgn:00000001 <00004> 001703DC R ..........................................................WM_NCPAINT <00005> 001703DC S ..........................................................WM_ERASEBKGND hdc:6E010919 <00006> 001703DC R ..........................................................WM_ERASEBKGND fErased:False <00007> 001703DC S ..........................................................WM_WINDOWPOSCHANGED lpwp:0012FE7C <00008> 001703DC R ..........................................................WM_WINDOWPOSCHANGED <00009> 001703DC S ..........................................................WM_ACTIVATEAPP fActive:True dwThreadID:000009DC <00010> 001703DC R ..........................................................WM_ACTIVATEAPP <00011> 001703DC S ..........................................................WM_NCACTIVATE fActive:True <00012> 001703DC R ..........................................................WM_NCACTIVATE <00013> 001703DC S ..........................................................WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null) <00014> 001703DC S ...........................................................WM_ACTIVATETOPLEVEL fActive:True dwThreadID:0012FC14 <00015> 001703DC R ...........................................................WM_ACTIVATETOPLEVEL <00016> 001703DC S ...........................................................WM_SETFOCUS hwndLoseFocus:(null) <00017> 001703DC R ...........................................................WM_SETFOCUS <00018> 001703DC R ..........................................................WM_ACTIVATE <00019> 001703DC S ..........................................................WM_SYNCPAINT <00020> 001703DC S ...........................................................WM_NCPAINT hrgn:59040997 <00021> 001703DC R ...........................................................WM_NCPAINT <00022> 001703DC S ...........................................................WM_ERASEBKGND hdc:BE010862 <00023> 001703DC R ...........................................................WM_ERASEBKGND fErased:False <00024> 001703DC R ..........................................................WM_SYNCPAINT <00025> 001703DC P WM_PAINT hdc:00000000 <00026> 001703DC P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:1117 yPos:194 <00027> 001703DC P WM_LBUTTONUP fwKeys:0000 xPos:1117 yPos:194 <00028> 001703DC P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:1117 yPos:194 <00029> 001703DC S ..........................................................WM_CANCELMODE <00030> 001703DC R ..........................................................WM_CANCELMODE <00031> 001703DC S ..........................................................WM_KILLFOCUS hwndGetFocus:(null) <00032> 001703DC R ..........................................................WM_KILLFOCUS <00033> 001703DC S ..........................................................WM_ENABLE fEnable:False <00034> 001703DC R ..........................................................WM_ENABLE <00035> 001703DC S ..........................................................WM_CANCELMODE <00036> 001703DC R ..........................................................WM_CANCELMODE <00037> 001703DC S ...........................................................WM_NCACTIVATE fActive:False <00038> 001703DC R ...........................................................WM_NCACTIVATE fDeactivateOK:True <00039> 001703DC S ...........................................................WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:001B032E <00040> 001703DC R ...........................................................WM_ACTIVATE <00041> 001703DC S ...........................................................WM_WINDOWPOSCHANGING lpwp:0012D764 <00042> 001703DC R ...........................................................WM_WINDOWPOSCHANGING <00043> 001703DC S ...........................................................WM_WINDOWPOSCHANGED lpwp:0012D764 <00044> 001703DC R ...........................................................WM_WINDOWPOSCHANGED <00045> 001703DC S ......................................................................WM_QUERYCENTERWND hwndUseAsCenteringParent:(null) <00046> 001703DC R ......................................................................WM_QUERYCENTERWND <00047> 001703DC S .....................................................................WM_WINDOWPOSCHANGING lpwp:0012D760 <00048> 001703DC R .....................................................................WM_WINDOWPOSCHANGING <00049> 001703DC S .....................................................................WM_WINDOWPOSCHANGED lpwp:0012D760 <00050> 001703DC R .....................................................................WM_WINDOWPOSCHANGED <00051> 001703DC S ............................................................................WM_WINDOWPOSCHANGING lpwp:0012D804 <00052> 001703DC R ............................................................................WM_WINDOWPOSCHANGING <00053> 001703DC S ............................................................................WM_NCACTIVATE fActive:True <00054> 001703DC R ............................................................................WM_NCACTIVATE <00055> 001703DC S ............................................................................WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:001B032E <00056> 001703DC R ............................................................................WM_ACTIVATE <00057> 001703DC S ............................................................................WM_SETFOCUS hwndLoseFocus:001B032E <00058> 001703DC R ............................................................................WM_SETFOCUS <00059> 001703DC S ..............................................................................WM_ENABLE fEnable:True <00060> 001703DC R ..............................................................................WM_ENABLE <00061> 001703DC S ..............................................................................WM_PAINT hdc:00000000 <00062> 001703DC R ..............................................................................WM_PAINT <00063> 001703DC P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:1272 yPos:1003 <00064> 001703DC P WM_LBUTTONUP fwKeys:0000 xPos:1272 yPos:1003 <00065> 001703DC P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:1266 yPos:1004 <00066> 001703DC P WM_LBUTTONUP fwKeys:0000 xPos:1266 yPos:1004 <00067> 001703DC P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:1107 yPos:85 Добавлено @ 16:08 Всем спасибо. Помогло просто ::InvalidateRect(hParent,NULL,FALSE); Вопрос закрыт |