Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Как получить "снимок окна"?


Автор: Nuzur 16.6.2006, 14:52

И передать его потом для печати.
Вообще-то проблема такова что нужно "снять" только определенный компонент, в частности сторонний Grid, хотя я не думаю что что-то поменяеться от компонента.
Боюсь говорить но надо  smile , проблема еще в том что он можен не помещяться а окне а печатать нада весь...

Короче жду с нетерпением ваших предложений  smile  

Автор: Coocky 16.6.2006, 15:20
Где снять надо? В чужом окне? 

Автор: Nuzur 16.6.2006, 15:28
Нет в своем. Тоесть можна получить все что можна получить. Красиво сказал  smile 
Я думаю в чужом задача была б нереализуема в принцыпе тем более со сторонним компонентом. 

Автор: Coocky 16.6.2006, 15:30
Если чужого окна-то все предельно просто :
Получаешь чужое окно через FindWindow ,а с его указателя GetDC();
Если с "невидимого окна" (говорю как соавтор многих шпионских и анти программ) нужно послать окну сообщение WM_PRINT/WM_PRINTCLIENT
 

Автор: Nuzur 16.6.2006, 15:45

Ладно, согласен получил я CDC подготовил принтер, ну тоесть нашел его и все такое - как мне теперь прикрутить CDC к "принтерному" CDC.
И все-таки мои страхи подтвердяться он напечатает только то  что видно, а до чего нужно добраться скролингом нет? 

Автор: Coocky 16.6.2006, 16:02
Цитата(Nuzur @  16.6.2006,  15:45 Найти цитируемый пост)
Ладно, согласен 

Еще бы smile 

Цитата(Nuzur @  16.6.2006,  15:45 Найти цитируемый пост)
как мне теперь прикрутить CDC к "принтерному" CDC

Перед тем как выводить что-либо на печать, достаточно вызвать эту функцию: 
Код

... 

CDC* dc; // полученый указатель окна
..............................................................................
// Создаем контекст устройства для принтера 

AfxGetApp()->CreatePrinterDC(dc);  

 // Теперь можно выводить информацию в контекст устройства dc 

... 



Добавлено @ 16:04 
Цитата(Nuzur @  16.6.2006,  15:45 Найти цитируемый пост)
И все-таки мои страхи подтвердяться он напечатает только то  что видно, а до чего нужно добраться скролингом нет?

90% твои страхи оправдываются.. Это по логике. Но я таким не страдал никогда, поэтому незнаю smile  smile 
 

Автор: Nuzur 16.6.2006, 16:27
Сделал вот так вот:

Код

    // get the default printer
    CPrintDialog dlg(FALSE);
    if(dlg.DoModal() == IDOK)
    {
        // dlg.GetDefaults();
        // is a default printer set up?
        HDC hdcPrinter = dlg.GetPrinterDC();
        if (hdcPrinter == NULL)
        {
            MessageBox(_T("Ïðèíòåð íå íàéäåí!"));
        }
        else
        {
            // create a CDC and attach it to the default printer
            CDC dcPrinter;

            AfxGetApp()->CreatePrinterDC(dcPrinter);

            dcPrinter.Attach(hdcPrinter);
            // call StartDoc() to begin printing
            DOCINFO docinfo;
            memset(&docinfo, 0, sizeof(docinfo));
            docinfo.cbSize = sizeof(docinfo);
            docinfo.lpszDocName = _T("Max");

            // if it fails, complain and exit gracefully
            if (dcPrinter.StartDoc(&docinfo) < 0)
            {
                MessageBox(_T("Ïðèíòåð îòêàçàë â ïå÷àòè!"));
            }
            else
            {
                // start a page
                if (dcPrinter.StartPage() < 0)
                {
                    MessageBox(_T(" Îøèáêà íà÷àëà ñòðàíèöû"));
                    dcPrinter.AbortDoc();
                }
                else
                {
                    // actually do some printing
                    CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);
                    //////////
                    //Prepear information for output to the printer

                    dcPrinter.EndPage();
                    dcPrinter.EndDoc();
                    dcPrinter.SelectObject(pOldFont);
                }
            }
        }
    }


В результате чего увидел приятный белый лист, что я сделал не так?  

Автор: Coocky 16.6.2006, 16:37
Для меня вообще этот код полный бред. Я такого никогда не делал по крайней мере. Тебе нужно научится печатать, для начала smile 
Почитай топики и статьи. В двух приложениях не обьяснишь smile  

Автор: Nuzur 16.6.2006, 17:27
Coocky,  Ладно, сейчас я на работе, прийду домой покурю книжку. Но всеравно от вашей помощи не откажусь. Если вас не затруднит и вы СЛУЧАЙНО набредете на какой-то вкусный и красивый код, по печати конечно, не сочтите за труд поделиться, буду очень признателен. 

Автор: Coocky 16.6.2006, 17:55
Цитата(Nuzur @  16.6.2006,  17:27 Найти цитируемый пост)
СЛУЧАЙНО набредете на какой-то вкусный и красивый код, по печати конечно, не сочтите за труд поделиться, буду очень признателен

Есть и код smile  Все есть. Только не спасет тебя код без теории smile 
http://www.realcoding.net/article/view/2018
 

Автор: Nuzur 19.6.2006, 12:09
Покурил вашу статью вот что наваял:

Код

    CPrintDialog dlgPD(TRUE);

    PRINTDLG pd;

    pd.hDevMode = NULL;

    AfxGetApp()->GetPrinterDeviceDefaults(&pd);

    DEVMODE *dm = (DEVMODE *) LocalLock(pd.hDevMode);

    dm->dmFields = DM_ORIENTATION | DM_PAPERSIZE;
    dm->dmOrientation = DMORIENT_LANDSCAPE;
    dm->dmPaperSize = DMPAPER_LETTER; 

    dlgPD.m_pd.hDevMode = pd. hDevMode;

    LocalUnlock(pd.hDevMode);

    if(dlgPD.DoModal() == IDOK)
    {
        HDC hdcPrinter = dlgPD.GetPrinterDC();
        if (hdcPrinter == NULL)
        {
            MessageBox(_T("Ïðèíòåð íå íàéäåí!"));
        }
        else
        {

            CDC dcPrinter;
            AfxGetApp()->CreatePrinterDC(dcPrinter); 
            dcPrinter.Attach(hdcPrinter);

            DOCINFO docinfo;
            memset(&docinfo, 0, sizeof(docinfo));
            docinfo.cbSize = sizeof(docinfo);
            docinfo.lpszDocName = _T("Morning Evening Max");

            if(dcPrinter.StartDoc(&docinfo) < 0)
            {
                MessageBox(_T("Íåâîçìîæíî íà÷àòü ïå÷àòü!"));
            }
            else
            {
/////////////////////////////////////////////////////////////////
                // start a page
                if (dcPrinter.StartPage() < 0)
                {
                    MessageBox(_T(" Îøèáêà íà÷àëà ñòðàíèöû"));
                    dcPrinter.AbortDoc();
                }
                else
                {
                    // actually do some printing
                    CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);
                    //////////
                    //Prepear information for output to the printer

                    dcPrinter.EndPage();
                    dcPrinter.EndDoc();
                    dcPrinter.SelectObject(pOldFont);

                };
/////////////////////////////////////////////////////////////////
            };

        }
    }


Врезультате моих трудов у меня вылетает прога на 

Код

        HDC hdcPrinter = dlgPD.GetPrinterDC();


Что я снова не так делаю. Помогите плиз!  

Автор: Coocky 19.6.2006, 14:41
Цитата(Nuzur @  19.6.2006,  12:09 Найти цитируемый пост)
Что я снова не так делаю.


Код

CPrintDialog dlgPD(TRUE,PD_RETURNDC );
  if(dlgPD.DoModal() == IDOK)
  {
 
    HDC hdcPrinter = dlgPD.GetPrinterDC();
    if (hdcPrinter == NULL)
    {
      MessageBox(_T("Ïðèíòåð íå íàéäåí!"));
    }

  }


или

Код

 CPrintDialog dlgPD(FALSE);
  if (dlgPD.DoModal() == IDOK)
  {

    HDC hdc = dlg.GetPrinterDC();
 
if (hdcPrinter == NULL)
        {
            MessageBox(_T("Ïðèíòåð íå íàéäåí!"));
        }

  }



Чувствуешь разницу? smile 
Знаешь почему так получилось? А потому, что сломя голову летим делать кейлогер. что б удивить знакомых, друзей, родителей, похвастаться перед девченкой на свидании smile , но забываем одно -ЧИТАТЬ МСДН smile 
А там черному по делому написано

Цитата

Note that when you call the constructor with bPrintSetupOnly set to FALSE, the PD_RETURNDC flag is automatically used;

Исходя из логики можно догадаться , что если не bPrintSetupOnly set to TRUE. то the PD_RETURNDC flag уже не" is automatically used" smile  

Автор: Nuzur 20.6.2006, 09:22
Кстати выяснилось что у моего сторонненго контрола есть возможность "самопичати".
Так что читайте документацию. Как я был зол вчера....уууу....
Всем спасибо. Хотя лично мне кажеться что подобную темку надо было бы в ФАКУ сделать ИМХО.
Потому что как пичатать из SDI и MDI всем вроде как ясно а вот как распичатать свой диалог не очень.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)