PDA

Просмотр полной версии : WindowProc и все все все



Alezis
27.02.2005, 19:37
1 . Люди если в обычном окне нужно создать ещё несколько CHILD окон , то их прорисовкаой после создания и регистрации должна заниматься WinProc главного окна или же лучше создать свою оконную процедуру для дочерних.
Потому что очень сложная там прорисовка.На самом деле я создал уже отдельную процедуру, но идёт офигенная потеря памяти и в дальнейшем крах всего приложения. Ошибки вроде все исправил, может ли быть дело только в этом что у меня для дочерних окон своя процедура оконная.
2 . Кроме того я заметил что при вызове таких функций как CreateFontIndirect или CreateSolidBrush в WindowProc каждый раз выделяется память для созданных объектов, но по идее она должна освобождаться, привыходе из функции ведь объекты локальные. Или я чего то не понимаю.
:?: :?: :?: :?: :?: :?:

Tima
28.02.2005, 11:05
Насчет второго - ответ навскидку (и помоему решение проблемы краха проги):
а хэндлы закрывать не надо? Если не вызовешь DeleteObject для них, будут жить возвращаемые этими функциями описатели до конца проги. Это же в любой книге мусолиться по 10 раз! Та и в NSDN тоже.

Alezis
28.02.2005, 15:57
Пасиба конечно но ничего нового я не узнал, то что весь мусор за собой убираю я даже и не вспоминал, так чтопроблема не в этом и мои

Ошибки вроде все исправил и подрузамевало то что крах не оттуда растёт, просто надоело всё уже проверил.

Absurd
28.02.2005, 16:26
Давно писал под GDI, но насколько я помню, там какой-то bizarre/bdsm/bukkake интерфейс. Функция SelectObject возвращает значение старого хендла, выбранного в контекст, и этот старый хендл надо сохранить. При очистке надо сначала выбрать в контекст старый хендл, а потом можно удалять хендл нового объекта.
т.е чего-то типа


HFONT hFont = CreateFontIndirect(...);
HFONT hOldFont = SelectObject(hdc,hFont);
... Рисуем...
SelectObject(hdc,hOldFont);
DeleteObject(hFont);

Alezis
28.02.2005, 17:06
Спасибо всем конечно, но дело было не в бобине...
Вот недавно методом тыка убирал куски кода и смотрел каким образом изменяется память, короче заметил что при вызове MoveWindow для дочерних окон происходит каждый раз новое выделение памяти. Может кто знает как с этим бороться.
Тогда ещё вопрос как при WM_SIZE изменить положение дочернего окна, но без помощи MoveWindow?

Eugie
28.02.2005, 18:27
Alezis, ты бы код привел своего обработчика WM_PAINT для дочернего окна.

Насчет чем подвигать - есть еще SetWindowPos. Но проблема-то у тебя с отрисовкой.