Возможно ли как-то рисовать окно не на экран, а в память?
От: C0x  
Дата: 10.01.17 07:25
Оценка:
Задача примерно такая: создать обычный CDialog, который не будет отображаться на экране, но его содержимое можно анализировать.
Re: Возможно ли как-то рисовать окно не на экран, а в память?
От: kov_serg Россия  
Дата: 10.01.17 07:36
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Задача примерно такая: создать обычный CDialog, который не будет отображаться на экране, но его содержимое можно анализировать.

Тоже очень интересно. Когда-то была такая задача штатными методами не получилось. Тот же richedit категорически отказывался рисоваться в память.
Хоть сама винда рисует прозрачные окна и rdp работает значит как-то можно.
Re: Возможно ли как-то рисовать окно не на экран, а в память?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 10.01.17 07:48
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Задача примерно такая: создать обычный CDialog, который не будет отображаться на экране, но его содержимое можно анализировать.


Что значит “анализировать содержимое”?
А вообще почему нельзя? Стандартно создаем диалог, только из WM_INITDIALOG делаем диалогу ShowWindow + SW_HIDE, и возвращаем FALSE.
Aml Pages Home
Re[2]: Возможно ли как-то рисовать окно не на экран, а в память?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 10.01.17 07:50
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Тот же richedit категорически отказывался рисоваться в память.

Для этого нужно юзать Windowless RichEdit.
Aml Pages Home
Re[3]: Возможно ли как-то рисовать окно не на экран, а в память?
От: kov_serg Россия  
Дата: 10.01.17 09:29
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, kov_serg, Вы писали:


_>>Тот же richedit категорически отказывался рисоваться в память.

C>Для этого нужно юзать Windowless RichEdit.
Это нужно было под WinXP и WinNT тут же минимальное требование Windows Vista.
Re[4]: Возможно ли как-то рисовать окно не на экран, а в память?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 10.01.17 09:44
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, Carc, Вы писали:


C>>Здравствуйте, kov_serg, Вы писали:


_>>>Тот же richedit категорически отказывался рисоваться в память.

C>>Для этого нужно юзать Windowless RichEdit.
_>Это нужно было под WinXP и WinNT тут же минимальное требование Windows Vista.
Ну и в чем проблема тогда? Что под Вистой унд выше не будут работать IText***, которые работали под 2К, и 98-ой? С фигов ли? Конкретно Windowsless не проверял, но вот прямо сейчас на 7-ке у меня работает одна подделка, которая вовсю использует Text Object Model для RichEdit. Как влитая работает, без сучка и задоринки.
Так что не вижу проблемы...
Aml Pages Home
Re[2]: Возможно ли как-то рисовать окно не на экран, а в память?
От: C0x  
Дата: 10.01.17 09:44
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, C0x, Вы писали:


C0x>>Задача примерно такая: создать обычный CDialog, который не будет отображаться на экране, но его содержимое можно анализировать.


C>Что значит “анализировать содержимое”?


Значит там что-то рисуется и мне периодически необходимо это получать. Например, там есть контрол, который что-то рисует периодически.

C>А вообще почему нельзя? Стандартно создаем диалог, только из WM_INITDIALOG делаем диалогу ShowWindow + SW_HIDE, и возвращаем FALSE.


Если я сделаю SW_HIDE тогда вообще там рисоваться что-то будет и я могу это получить как-то?
Re[5]: Возможно ли как-то рисовать окно не на экран, а в память?
От: kov_serg Россия  
Дата: 10.01.17 09:46
Оценка:
Здравствуйте, 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]: Возможно ли как-то рисовать окно не на экран, а в память?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 10.01.17 09:48
Оценка:
Здравствуйте, C0x, Вы писали:


C0x>Если я сделаю SW_HIDE тогда вообще там рисоваться что-то будет и я могу это получить как-то?

Меня терзают смутные сомнения... Но автоматом скорей всего ничего прорисывываться не будет, ибо с чего ему?

Но можно попробовать конечно ручками его подергать по таймеру на этот предмет, поотсылав контролу\окну что-нить вроде WM_PAINT, WM_PRINTCLIENT... Но сам я такого не пробовал. У меня задача проще была: снять всякую инфу вроде расположения контролов, надписи на них и.т.д.
Aml Pages Home
Re[4]: Возможно ли как-то рисовать окно не на экран, а в память?
От: C0x  
Дата: 10.01.17 10:06
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, C0x, Вы писали:



C0x>>Если я сделаю SW_HIDE тогда вообще там рисоваться что-то будет и я могу это получить как-то?

C>Меня терзают смутные сомнения... Но автоматом скорей всего ничего прорисывываться не будет, ибо с чего ему?

Вот и я думаю с чего

C>Но можно попробовать конечно ручками его подергать по таймеру на этот предмет, поотсылав контролу\окну что-нить вроде WM_PAINT, WM_PRINTCLIENT... Но сам я такого не пробовал. У меня задача проще была: снять всякую инфу вроде расположения контролов, надписи на них и.т.д.


У меня задача написать бота который будет в скрытом режиме играть в браузерку и не мешать пользователю на экране.
Решил сделать с помощью CHtmlDialog. Но вот загвоздка теперь как его убрать с глаз долой.
Re: Возможно ли как-то рисовать окно не на экран, а в память?
От: Went  
Дата: 11.01.17 13:30
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Задача примерно такая: создать обычный CDialog, который не будет отображаться на экране, но его содержимое можно анализировать.

Насколько я помню:
1. Рисовать можно в CBitmap, можно как-то на нем создать CDC, нужно погуглить.
2. Рисовать диалог в свой CDC тоже можно, перекройте сообщения WM_PAINT и WM_ERASEBKGND и делайте там все, что хотите.
Re[2]: Возможно ли как-то рисовать окно не на экран, а в память?
От: C0x  
Дата: 12.01.17 15:47
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, C0x, Вы писали:


W>2. Рисовать диалог в свой CDC тоже можно, перекройте сообщения WM_PAINT и WM_ERASEBKGND и делайте там все, что хотите.


Если я перекрою OnPaint или даже вовсе ничего там делать не буду,то окно как рисовалось так и будет рисоваться на экране.
Re[3]: Возможно ли как-то рисовать окно не на экран, а в память?
От: Went  
Дата: 13.01.17 07:28
Оценка:
Здравствуйте, 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]: Возможно ли как-то рисовать окно не на экран, а в память?
От: Evgeniy Skvortsov Россия  
Дата: 17.01.17 14:07
Оценка: 4 (1)
Здравствуйте, Went, Вы писали:

W>Вот рабочий код:


В нынешнем MFC есть класс CMemDC, внутри которого засунута вся эта работа с контекстами в памяти.
Теперь в обработчике WM_PAINT просто создаём экземпляр CMemDC и рисуем всё уже в память, а в деструкторе он сам битблитит всё что нарисовали на экран.
CPaintDC dc(this);
CMemDC memDC(dc, this);
CDC* pDC = &memDC.GetDC();
// рисуем в pDC
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.