![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| cupper |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
вот код все програмки, рабочий, написан в DevC++, в MFC кмпилить почти на 100% уверен что небудет.
что значит происходит: запускаю программу, появляеться квадрат и там происходит некоторая байда (то что запрограммировал то и происходит). Но нерисуються элементы
они прорисовываются только после того как непосредственно повлиять на окно программы, или щелкнуть по нему или переместить. Если закоментить весь
и запустить программу то выше перечисленные элементы нормально прорисовываються при старте. Преждем чем отвечать попробуйте скомпилить, так наглядней будет понятно о чем я говорю. |
||||||
|
|||||||
| yeputons |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 1.4.2009 Где: Санкт-Петербург Репутация: 1 Всего: 5 |
насколько понимаю ситуацию я, проблема заключается в строчке кода #187:
Если ты закомментируешь эту строчку, то всё прорисуется нормально. Решение Требуется убрать эту строчку из обработки сообщения WM_PAINT. Для бесконечной перерисовки могу посоветовать использовать таймеры. Это делается так: процедуру WinMain изменяем так:
А в WndProc добавляем в case:
Объяснение Я понял, что эта строчка служит для бесконечной перерисовки окна (функция InvalidateRect говорит системе, что такой-то регион у такого-то окна надо перерисовать). Она вызывается, когда перерисовка еще не закончена (не прорисовались дочерние контролы) и система после обработки сообщения WM_PAINT видит, что хорошо бы перерисовать дочерние окна, но вот беда - надо обновить всё окно... поехали посылать WM_PAINT. И т.о. система просто не доходит то перерисовки надписей и Edit'ов. |
||||||
|
|||||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
я чета примерное подразумевал, спасибо за подробное объяснение, щас попробую ваш вариант.
Добавил ваш код, но перерисовки непроисходит :( я с таймерами неработал, поэтому могу бональной опечатки незаметить у вас, так что покачто безрезультатно непонятно ваша фраза (обрати внимание, что hwnd тут - не параметр) а чтоже это ? Это сообщение отредактировал(а) cupper - 19.4.2009, 23:38 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
да, однозначно, проблема конечно в InvalidateRect на WM_PAINT
BeginPaint помечает область окна закрашенной, т.е. не требующей дальнейшей прорисовки, а InvalidateRect - наоборот - незакрашенной в итоге, на входе WM_PAINT есть незакрашенная область, и на выходе WM_PAINT - то же самое, что приводит к бесконечным посылкам WM_PAINT одному окну но в таймере WM_PAINT посылать напрямую окну тоже не стоит, достаточно вызвать тот же InvalidateRect альтернатива таймеру - перерисовка в фоне (OnIdle и т.п.) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
но в таймере WM_PAINT посылать напрямую окну тоже не стоит, достаточно вызвать тот же InvalidateRect
вот красавчик |
|||
|
||||
| yeputons |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 1.4.2009 Где: Санкт-Петербург Репутация: 1 Всего: 5 |
достаточно вызвать тот же InvalidateRect
согласен. С окошками WinAPI не очень активно работаю, юзаю CodeGear C++ Builder (обрати внимание, что hwnd тут - не параметр) У WndProc есть параметр hWnd - хэндл окна, которому было послано сообщение. А перерисовать надо окно hwnd - которое мы создали в WinMain. Конечно, в этой программе это одно и тоже, но иногда бывает иначе. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |