Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сообщения Windows, Как обмануть программу 
:(
    Опции темы
Gorbatovsky
Дата 31.5.2004, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



У меня проект некий гибрид из DOC и Windows.

Как послать сообщение клавному окну типа SendMessage (hParent, ...), чтобы приложение перерисовало само себя. А может в обработчике сообщений не хватает какого сообщения.

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

Добавлено @ 13:34
К сожалению изменить обработчик сообщений пока нельзя.
PM MAIL ICQ   Вверх
AndyY
Дата 31.5.2004, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



путь попроще:
::InvalidateRect( hparent, &rect, 1 );
::UpdateWindow( hparent );

поинтересней:
::RedrawWindow( hparent, .. );


--------------------
PM MAIL WWW   Вверх
Gorbatovsky
Дата 31.5.2004, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



Спасибо AndyY за помощь.

Попробовал 2 варианта:
1///////
::InvalidateRect(hParent,NULL,FALSE);
::UpdateWindow( hParent );

2//////
RedrawWindow(hParent ,NULL,NULL,RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW);


Не помогает.
Сообщаю подробности.

Когда закрываю CFileDialog Перерисовывается все, кроме фона.
А когда двигаю CFileDialog, то ничего не рисуется. Черный фон..

PM MAIL ICQ   Вверх
AndyY
Дата 31.5.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



видать какая-то кривизна в обработке WM_PAINT или WM_ERASEBACKGRND
есть такие орлы...

а изменить обработчик можно у любого окна. На это есть SetWindowLong( h, GWL_WNDPROC, my_proc );

восстановить можно также. а старый обработчик вызвать через CallWindowProc.

для начала я перед CFIleDlg поставил бы wndproc которая заливает все белым на WM_PAINT - и посмотрел результат. Если, конечно, исходники основного окна не доступны.




--------------------
PM MAIL WWW   Вверх
Масяня
Дата 31.5.2004, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Цитата(Gorbatovsky @ 31.5.2004, 13:28)
У меня проект некий гибрид из DOC и Windows.
...
...

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

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

З.Ы. AndyY прав - WM_PAINT тебя спасет!
PM MAIL   Вверх
chipset
Дата 31.5.2004, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Может имеется в виду консольная программа.... hmmm.gif


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Gorbatovsky
Дата 31.5.2004, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



Дополнительная информация.
Возможно что, выражение "гибрид ДОС и Win32" не очень удачное.
Программа раньше работала под ДОС. 5 лет назад ее переделали для Windows. Ну и не сделали как следует( не доделали). Некоторые модули для меня не доступны.
Добавлено @ 19:08
Цитата
Может имеется в виду консольная программа....

Программа не консольная. Внешний вид у нее как у программ до Windows. Нету окон. Свое меню.
PM MAIL ICQ   Вверх
Масяня
Дата 31.5.2004, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Если нету окон и нету меню.... это еще не значит что это ДОС-прога! Самый простой способ узнать это открыть эту прогу, например, в Блокноте и если там в начале "MZ" и "This program cannot be run in DOS mode.", то это конслольная прога.

Это сообщение отредактировал(а) Масяня - 31.5.2004, 19:23
PM MAIL   Вверх
chipset
Дата 31.5.2004, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Да.. У Харта вся книга описывается с консолькой.. А у него там полно всяких фигатеней с кучами, тридами, процессами, семафорами biggrin.gif


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Gorbatovsky
Дата 31.5.2004, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



Ув. Масяня, я ведь не говорил, что это ДОС- программа.
Это программа (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 занимает все окно. Например, как игра в полноэкранном режиме.
PM MAIL ICQ   Вверх
AndyY
Дата 1.6.2004, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



Gorbatovsky
провели эксперимент с подменой WNDPROC?
интересен результатsmile.gif


--------------------
PM MAIL WWW   Вверх
Gorbatovsky
Дата 1.6.2004, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



Эксперимент с заливкой белым и с подменой WNDPROC пока не провел.
Изучаю как рисовать в полноэкранном режиме.
PM MAIL ICQ   Вверх
Gorbatovsky
Дата 1.6.2004, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



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);

Получилось такое поведение.
Когда вызываю диалог первый раз фрагмент эллипса появляется и закрашивается черным цветом.
Второй раз Эллипс рисуется сверху меню.
PM MAIL ICQ   Вверх
Gorbatovsky
Дата 1.6.2004, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



Дополнительная информция...
Когда открыто окно CFileDialog, то главное окно себе не перисовывает себя при перемещении других программ поверх.
PM MAIL ICQ   Вверх
AndyY
Дата 1.6.2004, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



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



--------------------
PM MAIL WWW   Вверх
Gorbatovsky
Дата 1.6.2004, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



Цитата
а не может быть варианта, что WM_PAINT не обрабатывается вовсе


Приложение корректно ведет себя с другими программами, если чужое окно двигается сверху, то моя программа себя перерисовывает.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 1.6.2004, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



гипотеза номер 2:

Может ли быть такое, что при выполнении модального диалог бокса (как CFileDialog) поток сообщений основного окна "замораживается" ?... тогда, естественно, никакие мессаги типа WM_PAINT или WM_MOUSEMOVE, которые идут через очередь сообщений, до главного окна не доходят.


--------------------
user posted image
PM MAIL WWW   Вверх
Gorbatovsky
Дата 1.6.2004, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



mr.DUDA, Вы несомненно правы.
В правильном приложении, когда висит модальный диалог этого (замораживания) не происходит.
Но я хочу заставить главное окно перерисовать себя после закрытия диалога.
Еще одно уточнение. Диалог я создаю в dll
PM MAIL ICQ   Вверх
AndyY
Дата 1.6.2004, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



dll роли не играет. а диалог в основном потоке создается?
может, проблема с синхронизацией?

предлагаю натравить шпиона (spy++) на основное окно и посмотреть какие сообщения ходят во время открытого диалога.

кстати, какая OS? вроде XP как-то сохраняет картинку на окне даже подвисшей задачи, поэтому при движении чужого окна ничего не апдейтится.


--------------------
PM MAIL WWW   Вверх
Gorbatovsky
Дата 1.6.2004, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



Диалог в основном потоке создается.
OC-XP.
При движении чужого окна картинка восстанавливается.
AndyY, Вы полагаете, что это делает (картинку восстанавливает) OC?
PM MAIL ICQ   Вверх
AndyY
Дата 1.6.2004, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



да, я с таким встречался. у подвисшего окна не перерисовывается только меню (белая полоса) но у вас меню нет...

так что с потоками и сообщениями?


--------------------
PM MAIL WWW   Вверх
Gorbatovsky
Дата 1.6.2004, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



Привожу фрагмент сообщений полученных утилитой 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);
Вопрос закрыт
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0678 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.