Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Gorbatovsky @ 31.5.2004, 13:28)
У меня проект некий гибрид из DOC и Windows.
...
...

Приложение корректно ведет себя с другими программами, если чужое окно двигается сверху, то моя программа себя перерисовывает. А если свое дочернее окно двигается, или закрывается, то главная программа об этом не знает.

Так что же это за "гибрид ДОС и Win32" такой? biggrin.gif Ведь для ДОС-проги создается своя виртуальная машина и до нее добраться можно только через старшие линейные адреса режима ядра, а Win32 прога user-mode работает в своем собственном адресном пространстве и как же они взаимодействуют тогда? Если ты знаешь как, то тогда объясни, плз!

З.Ы. AndyY прав - WM_PAINT тебя спасет!

Автор: chipset 31.5.2004, 19:02
Может имеется в виду консольная программа.... hmmm.gif

Автор: 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
Да.. У Харта вся книга описывается с консолькой.. А у него там полно всяких фигатеней с кучами, тридами, процессами, семафорами biggrin.gif

Автор: 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?
интересен результатsmile.gif

Автор: Gorbatovsky 1.6.2004, 10:51
Эксперимент с заливкой белым и с подменой WNDPROC пока не провел.
Изучаю как рисовать в полноэкранном режиме.

Автор: Gorbatovsky 1.6.2004, 11:55
AndyY
Я провел небольшой эксперимент.
Перед fileDlg.DoModal(); я вставил такой фрагмент
Код

  HDC hdc=GetWindowDC(hParent);
CPen pen(PS_SOLID,4,RGB(255,0,0));
SelectObject(hdc,pen);
Ellipse(hdc,-100,-100,100,100);

Получилось такое поведение.
Когда вызываю диалог первый раз фрагмент эллипса появляется и закрашивается черным цветом.
Второй раз Эллипс рисуется сверху меню.

Автор: Gorbatovsky 1.6.2004, 12:14
Дополнительная информция...
Когда открыто окно CFileDialog, то главное окно себе не перисовывает себя при перемещении других программ поверх.

Автор: AndyY 1.6.2004, 12:32
в общем-то это никак не связано с обработкой WM_PAINT...
а не может быть варианта, что WM_PAINT не обрабатывается вовсе, а все рисуется через GetDC в то время, когда на экране нужно что-нибудь изменить?
по симптомам похоже...

Автор: Gorbatovsky 1.6.2004, 13:03
Цитата
а не может быть варианта, что WM_PAINT не обрабатывается вовсе


Приложение корректно ведет себя с другими программами, если чужое окно двигается сверху, то моя программа себя перерисовывает.

Автор: 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);
Вопрос закрыт

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