Откуда Windows берет миниатюру окна, которая показывается в списке окон по Alt+Tab?
Про DWM-api я в курсе.
Но даже если окно ничего не делает с DWM (старые приложение, кои про DWM не в курсе), то Винда явно же откуда-то копирует изображение окна?
Ну кагбэ понятно, что Винда тягает бекграунд клиентской области...
Но когда? В какой момент?
Я вроть в WM_ERASEBKGNG нарисосвал какую-то "порнуху" на фоне окошка... Но Винда его таки ее не показывает. Просто пустую клиентскую область (коя там и есть).
Ощущение, что миниатюра запрашивается раньше, чем я "художничаю" в WM_ERASEBKGND\WM_PAINT.
Здравствуйте, qaz77, Вы писали:
Q>Здравствуйте, Carc, Вы писали:
C>>Откуда Windows берет миниатюру окна, которая показывается в списке окон по Alt+Tab?
Q>Может через WM_PRINTCLIENT? Не приходят в оконную процедуру, ни WM_PRINTCLIENT, ни WM_PRINT
O>>нынче окна всегда рисуются в offscreen, а когда надо его нарисовать кудато — на десктопе или в миниатюру — композитный менеджер копирует контент из offscreen картинки окна O>>https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D0%BE%D0%BA%D0%BE%D0%BD C>Это всё здорово... C>Но откуда сама картинка появляется в offscreen картинки окна? Я ж вижу, что остальные окна на миниатюрах похожи на "правду"? Например, та же старая студия VC++ 6.0, а она то что уж точно ни сном, ни духом про DWM_*
Ну тебе приходит WM_ERASEBKGND WM_PAINT ты рисуешь в них в HDC, так вот это HDC — и есть offcreen image.
То есть картинка в миниатюре и картинка собственно окна — это одна и та же картинка, их невозможно както раздельно рисовать, если только для этого не сделали специальную фичу.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>>>нынче окна всегда рисуются в offscreen, а когда надо его нарисовать кудато — на десктопе или в миниатюру — композитный менеджер копирует контент из offscreen картинки окна O>>>https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D0%BE%D0%BA%D0%BE%D0%BD C>>Это всё здорово... C>>Но откуда сама картинка появляется в offscreen картинки окна? Я ж вижу, что остальные окна на миниатюрах похожи на "правду"? Например, та же старая студия VC++ 6.0, а она то что уж точно ни сном, ни духом про DWM_* O>Ну тебе приходит WM_ERASEBKGND WM_PAINT ты рисуешь в них в HDC, так вот это HDC — и есть offcreen image. O>То есть картинка в миниатюре и картинка собственно окна — это одна и та же картинка, их невозможно както раздельно рисовать, если только для этого не сделали специальную фичу.
Да в том то всё и дело.
Что WM_ERASEBKGND, WM_PAINT приходят, я в них всё и рисую (посредь окна иконка + текст).
Судя по логам, я там точно оказываюсь.
Но миниатюра в Винде просто банальное пустое окно с белым фоном. Хотя окно точно моё: и иконка, и текст мои — видно невооруженным взглядом.
Но явно не берется отрисованная картинка из моей прорисовки...
C>Что WM_ERASEBKGND, WM_PAINT приходят, я в них всё и рисую (посредь окна иконка + текст). C>Судя по логам, я там точно оказываюсь. C>Но миниатюра в Винде просто банальное пустое окно с белым фоном. Хотя окно точно моё: и иконка, и текст мои — видно невооруженным взглядом. C>Но явно не берется отрисованная картинка из моей прорисовки...
нууу, хз
1 код отрисовки в студию (хотя я давно уже под винду не писал, но мож кто другой увидит косяк)
2 может потерялось при масштабировании? Если шрифт 32й поставить — тоже не видно?
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
C>>Что WM_ERASEBKGND, WM_PAINT приходят, я в них всё и рисую (посредь окна иконка + текст). C>>Судя по логам, я там точно оказываюсь. C>>Но миниатюра в Винде просто банальное пустое окно с белым фоном. Хотя окно точно моё: и иконка, и текст мои — видно невооруженным взглядом. C>>Но явно не берется отрисованная картинка из моей прорисовки... O>нууу, хз O>2 может потерялось при масштабировании? Если шрифт 32й поставить — тоже не видно?
Дык и иконки не видно, не только отрисованного текста.
O>1 код отрисовки в студию (хотя я давно уже под винду не писал, но мож кто другой увидит косяк)
O>>2 может потерялось при масштабировании? Если шрифт 32й поставить — тоже не видно? C>Дык и иконки не видно, не только отрисованного текста. O>>1 код отрисовки в студию (хотя я давно уже под винду не писал, но мож кто другой увидит косяк) C>[ccode]
А где обработка WM_PAINT? Хотя бы пустая — содержащая BeginPaint/EndPaint — хотя не уверен что даже такое отработает адекватно..
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>>>2 может потерялось при масштабировании? Если шрифт 32й поставить — тоже не видно? C>>Дык и иконки не видно, не только отрисованного текста. O>>>1 код отрисовки в студию (хотя я давно уже под винду не писал, но мож кто другой увидит косяк) C>>
O>А где обработка WM_PAINT? Хотя бы пустая - содержащая BeginPaint/EndPaint - хотя не уверен что даже такое отработает адекватно..
[ccode]
LRESULT On_WmPaint(const HWND hwnd,const HICON h)
{
PAINTSTRUCT ps;
const HDC hdc=::BeginPaint(hwnd,&ps);
//GetDC(hwnd);
ASSERT(hdc) ;
if (NULL == hdc)
return 0;
DoDraw(hwnd, hdc,h);
EndPaint(hwnd, &ps);
//ReleaseDC(hwnd, hdc);return 0;
}
//в оконной
....
case WM_PAINT:
DefWindowProc(hwnd , uMsg, wParam, lParam);
return On_WmPaint(hwnd, pClass->m_hIconLarge);
break;
Здравствуйте, ononim, Вы писали:
C>> case WM_PAINT: C>> DefWindowProc(hwnd , uMsg, wParam, lParam); C>> return On_WmPaint(hwnd, pClass->m_hIconLarge); C>> break; O>DefWindowProc тут лишняя
Да, пока копипастил в форум и сам заметил. Убрал вызов DefWindowProc — всё то же самое... В миниатюре пустая клиентская область моего окна.
C>Да, пока копипастил в форум и сам заметил. Убрал вызов DefWindowProc — всё то же самое... В миниатюре пустая клиентская область моего окна.
Ну теперь вроде бы норм, но меня еще смущает название CWndAltTabIcon — оно как бы намекает что у вас там какое то спецокно для альттаба, соответсвенно возникают сомнения в том что винда решает в альтабе рисовать именно это окно, а не какое то другое. Что у него за стили, адекватный ли у него размер и вообще состояние?
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
C>>Да, пока копипастил в форум и сам заметил. Убрал вызов DefWindowProc — всё то же самое... В миниатюре пустая клиентская область моего окна. O>Ну теперь вроде бы норм, но меня еще смущает название CWndAltTabIcon — оно как бы намекает что у вас там какое то спецокно для альттаба, соответсвенно возникают сомнения в том что винда решает в альтабе рисовать именно это окно, а не какое то другое. Что у него за стили, адекватный ли у него размер и вообще состояние?
Окно невидимое (без WS_VISIBLE), размеры 100 на 100 примерно, я это фактически вижу в миниатюре...
const CString strClassName=бла_бла_боа();
WNDCLASS wc={0};
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=_ALTTabWindowProc;
wc.lpszClassName=(LPCTSTR)strClassName;
//wc.hIcon=CAppObjects::LoadSmallIcon(_Module.m_hInst,IDR_MAINFRAME);
wc.hIcon=hIconLarge;
wc.hInstance=hModule;
wc.hCursor=LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW));
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
//wc.hbrBackground=GetSysColorBrush(INDEX_BK_COLOR);const ATOM atom=RegisterClass(&wc);
const DWORD dwStyle=
WS_CAPTION
|WS_CLIPSIBLINGS
|WS_OVERLAPPED
|WS_SYSMENU
;
const DWORD dwExStyle=WS_EX_LEFT
|WS_EX_LTRREADING
|WS_EX_RIGHTSCROLLBAR
|WS_EX_WINDOWEDGE
|WS_EX_CONTROLPARENT
;
const HWND hwnd=::CreateWindowEx(dwExStyle
,wc.lpszClassName
,lpszText
,dwStyle,POS_XY,POS_XY,POS_HEIGHT,POS_HEIGHT //тут как раз размеры X , Y - отрицательные (за краем экрана) width/height - 100
,hwndParent
,NULL
,NULL
,(LPVOID)this
);
//...const BOOL bCreated=::IsWindow(hwnd);
Здравствуйте, ononim, Вы писали:
C>>Окно невидимое (без WS_VISIBLE), размеры 100 на 100 примерно, я это фактически вижу в миниатюре... O>хаха, вот и слон... а если его сделать видимым?
Ничерта — все то же самое. Создаю с WS_VISIBLE, убрал перехват обработки WM_SHOWWINDOW — всё равно. Пустая клиентская область...
C>>>Окно невидимое (без WS_VISIBLE), размеры 100 на 100 примерно, я это фактически вижу в миниатюре... O>>хаха, вот и слон... а если его сделать видимым? C>Ничерта — все то же самое. Создаю с WS_VISIBLE, убрал перехват обработки WM_SHOWWINDOW — всё равно. Пустая клиентская область...
WS_EX_APPWINDOW (extended style) наличствует?
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
C>>>>Окно невидимое (без WS_VISIBLE), размеры 100 на 100 примерно, я это фактически вижу в миниатюре... O>>>хаха, вот и слон... а если его сделать видимым? C>>Ничерта — все то же самое. Создаю с WS_VISIBLE, убрал перехват обработки WM_SHOWWINDOW — всё равно. Пустая клиентская область... O>WS_EX_APPWINDOW (extended style) наличствует?
Нет.
Но
а) Попробовал в _DEBUG использовать. Ничего не меняется.
б) Вообще говоря, я не могу использовать WS_EX_APPWINDOW — вся затея этого CWndAltTabIcon для одного: чтобы окно (иконка, текст) были в списке Alt+Tab, а некое основное окно было скрыто (например упали в трей, а окно приложения скрыли). Тогда можно подняться из трея не только мышом, но и с клавы перебираясь до айтема в списке по Alt+Tab. По сути то, этот самый CWndAltTabIcon окно-заглушка, которая ретранслирует некоторые сообщения из своей оконной процедуры в то самое "некое основное окно".... В принципе функционал рабочий, и применятся во вполне рабочих проектах. Но только с миниюатурами какая-то непонятка.