Подскажите, пожалуйста, кто знает.
Обрабатываю WM_PAINT (из подменённой WndProc) у часов в трее, и ничего не выходит Код стандартный (BeginPaint, CreateCompatibleDC, SelectObject, BitBlt, etc...). И всего-то хотелось налепить на них битмап загруженный из ресурсов (LoadImage), а в место этого ни битмапа, ни стандартного фона Если перекрыть их каким-то окном, то остаётся след от него. Как будто WM_PAINT и вовсе не обрабатыватся, хотя тот же код, на "родном" окне моей программы всё рисует ка надо. Где грабли-то?
Здравствуйте, apple-antonovka, Вы писали:
AA>Грабли по-видимому в том что код твой должен быть в аресном пространстве того процесса, которому принадлежит окно (explorer.exe) .
Он там и находится. В прицепленой к explorer.exe библиотеке. Грабли не в сабклассинге, они именно в обработчике WM_PAINT. Видно, что стандартный обработчик здесь не подходит, нужно учитывать ещё какие-то нюансы...
AA>>Грабли по-видимому в том что код твой должен быть в аресном пространстве того процесса, которому принадлежит окно (explorer.exe) .
E>Он там и находится. В прицепленой к explorer.exe библиотеке. Грабли не в сабклассинге, они именно в обработчике WM_PAINT. Видно, что стандартный обработчик здесь не подходит, нужно учитывать ещё какие-то нюансы...
В предположении, что с сабклассингом OK: не пробовали — на WM_PAINT свою обработку ПОСЛЕ родной CallWindowProc(*WM_PAINT*) ?
Здравствуйте, kero, Вы писали:
K>А как насчет обработки WM_PRINTCLIENT в TrayNotifyWnd ?
Тоесть оставить часы в покое и мучать их родителя? Можно ли будет рисовать оттуда, или просто нужно ещё и трей сабклассить?
Я так понял, что сами часы даже бэкграунда своего не имеют, его рисует TrayNotifyWnd. Нашел способ заставить его это делать путём посылки этого самого WM_PRINTCLIENT (предворительно поиграв с SetWindowOrgEx) — фон появился, но битмапа по-прежнему нет. Хотя BitBlt вроде бы выполняется успешно
А можно и так: LoadImage, CreatePaternBrush, SetClassLong(GCL_HBRBACKGROUND).
Тогда и WM_PAINT обрабатывать, пожалуй, не придется. Разве что WM_SIZE стоит предусмотреть.
Здравствуйте, Everon, Вы писали:
E>Здравствуйте, apple-antonovka, Вы писали:
AA>>Грабли по-видимому в том что код твой должен быть в аресном пространстве того процесса, которому принадлежит окно (explorer.exe) .
E>Он там и находится. В прицепленой к explorer.exe библиотеке. Грабли не в сабклассинге, они именно в обработчике WM_PAINT. Видно, что стандартный обработчик здесь не подходит, нужно учитывать ещё какие-то нюансы...
А ресурсы откуда грузишь ?
Ты должен их загружать из часов (но там их нет, конечно) или из некоей DLL, которую можешь тут же подгрузить, но не из ресурсов того приложения, которым сабклассишь.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А ресурсы откуда грузишь ? PD>Ты должен их загружать из часов (но там их нет, конечно) или из некоей DLL, которую можешь тут же подгрузить, но не из ресурсов того приложения, которым сабклассишь.
Да, да... Мне должно быть стыдно, ресурсы грузил из своего EXE, да ещё и по WM_CREATE своего же окна , пока не понял, что hImage, полученный в моём процессе, в процессе эксплорера ничего не значит. В общем, переселил картинки в ресурсы DLL, и загружаю их по DLL_PROCESS_ATTACH, при загрузке в эксплорер — работает!