Здравствуйте, C0x, Вы писали:
C0x>Задача примерно такая: создать обычный CDialog, который не будет отображаться на экране, но его содержимое можно анализировать.
Тоже очень интересно. Когда-то была такая задача штатными методами не получилось. Тот же richedit категорически отказывался рисоваться в память.
Хоть сама винда рисует прозрачные окна и rdp работает значит как-то можно.
Re: Возможно ли как-то рисовать окно не на экран, а в память?
Здравствуйте, C0x, Вы писали:
C0x>Задача примерно такая: создать обычный CDialog, который не будет отображаться на экране, но его содержимое можно анализировать.
Что значит “анализировать содержимое”?
А вообще почему нельзя? Стандартно создаем диалог, только из WM_INITDIALOG делаем диалогу ShowWindow + SW_HIDE, и возвращаем FALSE.
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, kov_serg, Вы писали:
_>>Тот же richedit категорически отказывался рисоваться в память. C>Для этого нужно юзать Windowless RichEdit.
Это нужно было под WinXP и WinNT тут же минимальное требование Windows Vista.
Re[4]: Возможно ли как-то рисовать окно не на экран, а в память?
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Carc, Вы писали:
C>>Здравствуйте, kov_serg, Вы писали:
_>>>Тот же richedit категорически отказывался рисоваться в память. C>>Для этого нужно юзать Windowless RichEdit. _>Это нужно было под WinXP и WinNT тут же минимальное требование Windows Vista.
Ну и в чем проблема тогда? Что под Вистой унд выше не будут работать IText***, которые работали под 2К, и 98-ой? С фигов ли? Конкретно Windowsless не проверял, но вот прямо сейчас на 7-ке у меня работает одна подделка, которая вовсю использует Text Object Model для RichEdit. Как влитая работает, без сучка и задоринки.
Так что не вижу проблемы...
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, C0x, Вы писали:
C0x>>Задача примерно такая: создать обычный CDialog, который не будет отображаться на экране, но его содержимое можно анализировать.
C>Что значит “анализировать содержимое”?
Значит там что-то рисуется и мне периодически необходимо это получать. Например, там есть контрол, который что-то рисует периодически.
C>А вообще почему нельзя? Стандартно создаем диалог, только из WM_INITDIALOG делаем диалогу ShowWindow + SW_HIDE, и возвращаем FALSE.
Если я сделаю SW_HIDE тогда вообще там рисоваться что-то будет и я могу это получить как-то?
Re[5]: Возможно ли как-то рисовать окно не на экран, а в память?
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, kov_serg, Вы писали:
_>>Здравствуйте, Carc, Вы писали:
C>>>Здравствуйте, kov_serg, Вы писали:
_>>>>Тот же richedit категорически отказывался рисоваться в память. C>>>Для этого нужно юзать Windowless RichEdit. _>>Это нужно было под WinXP и WinNT тут же минимальное требование Windows Vista. C>Ну и в чем проблема тогда? Что под Вистой унд выше не будут работать IText***, которые работали под 2К, и 98-ой? С фигов ли? Конкретно Windowsless не проверял, но вот прямо сейчас на 7-ке у меня работает одна подделка, которая вовсю использует Text Object Model для RichEdit. Как влитая работает, без сучка и задоринки. C>Так что не вижу проблемы...
Проблема в том что сейчас не надо
Re[3]: Возможно ли как-то рисовать окно не на экран, а в память?
C0x>Если я сделаю SW_HIDE тогда вообще там рисоваться что-то будет и я могу это получить как-то?
Меня терзают смутные сомнения... Но автоматом скорей всего ничего прорисывываться не будет, ибо с чего ему?
Но можно попробовать конечно ручками его подергать по таймеру на этот предмет, поотсылав контролу\окну что-нить вроде WM_PAINT, WM_PRINTCLIENT... Но сам я такого не пробовал. У меня задача проще была: снять всякую инфу вроде расположения контролов, надписи на них и.т.д.
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, C0x, Вы писали:
C0x>>Если я сделаю SW_HIDE тогда вообще там рисоваться что-то будет и я могу это получить как-то? C>Меня терзают смутные сомнения... Но автоматом скорей всего ничего прорисывываться не будет, ибо с чего ему?
Вот и я думаю с чего
C>Но можно попробовать конечно ручками его подергать по таймеру на этот предмет, поотсылав контролу\окну что-нить вроде WM_PAINT, WM_PRINTCLIENT... Но сам я такого не пробовал. У меня задача проще была: снять всякую инфу вроде расположения контролов, надписи на них и.т.д.
У меня задача написать бота который будет в скрытом режиме играть в браузерку и не мешать пользователю на экране.
Решил сделать с помощью CHtmlDialog. Но вот загвоздка теперь как его убрать с глаз долой.
Re: Возможно ли как-то рисовать окно не на экран, а в память?
Здравствуйте, C0x, Вы писали:
C0x>Задача примерно такая: создать обычный CDialog, который не будет отображаться на экране, но его содержимое можно анализировать.
Насколько я помню:
1. Рисовать можно в CBitmap, можно как-то на нем создать CDC, нужно погуглить.
2. Рисовать диалог в свой CDC тоже можно, перекройте сообщения WM_PAINT и WM_ERASEBKGND и делайте там все, что хотите.
Re[2]: Возможно ли как-то рисовать окно не на экран, а в память?
Здравствуйте, Went, Вы писали:
W>Здравствуйте, C0x, Вы писали:
W>2. Рисовать диалог в свой CDC тоже можно, перекройте сообщения WM_PAINT и WM_ERASEBKGND и делайте там все, что хотите.
Если я перекрою OnPaint или даже вовсе ничего там делать не буду,то окно как рисовалось так и будет рисоваться на экране.
Re[3]: Возможно ли как-то рисовать окно не на экран, а в память?
Здравствуйте, C0x, Вы писали: C0x>Если я перекрою OnPaint или даже вовсе ничего там делать не буду,то окно как рисовалось так и будет рисоваться на экране.
Вот рабочий код:
void CTreeCtrlEx::OnPaint()
{
CPaintDC dc(this);
// Create a memory DC compatible with the paint DC
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CRect rcClip, rcClient;
dc.GetClipBox( &rcClip );
GetClientRect(&rcClient);
// Select a compatible bitmap into the memory DC
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( &dc, rcClient.Width(), rcClient.Height() );
memDC.SelectObject( &bitmap );
// Set clip region to be same as that in paint DC
CRgn rgn;
rgn.CreateRectRgnIndirect( &rcClip );
memDC.SelectClipRgn(&rgn);
rgn.DeleteObject();
// First let the control do its default drawing.
CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);
// Что-то тут еще рисуем в memDC
// И одним махом рисуем все на экран
dc.BitBlt(rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), &memDC, rcClip.left, rcClip.top, SRCCOPY);
memDC.DeleteDC();
}
Мы сначала рисуем контрол в битмап, потом его кладем на экран. У диалога будет еще OnNCPaint или как-то так, в смысле, рисование не-клиентской области, рамки. Возможно, еще потребуется взвести флаг CS_OWNDC для класса окна, но, по-моему, это не тот случай. Если проблема в том, что сам диалог рисуется в битмап, а дети — нет, это уже вопрос другой. Тут нужно или как-то перехватывать рисование детей, или всем детям делать свое рисование, или как-то заставить этих детей использовать наш DC. Нужно понимать, что контролы в винде рисуются не каскадно, а кто когда посчитает нужным, это тоже может создать проблемы.
Re[4]: Возможно ли как-то рисовать окно не на экран, а в память?
В нынешнем MFC есть класс CMemDC, внутри которого засунута вся эта работа с контекстами в памяти.
Теперь в обработчике WM_PAINT просто создаём экземпляр CMemDC и рисуем всё уже в память, а в деструкторе он сам битблитит всё что нарисовали на экран.