블로그 이미지
frostguy

카테고리

분류 전체보기 (48)
사진 (3)
Study (40)
IT (3)
Total143,121
Today8
Yesterday28

'CPrintDialog'에 해당되는 글 2건

  1. 2009.12.02 Dialog 를 캡쳐하여 인쇄하기 (1)
  2. 2009.06.12 여러 페이지 인쇄하기

int nWidth, nHeight;
	CClientDC dc(this);  //this->pImgWnd
	CDC MemDC;
	MemDC.CreateCompatibleDC(&dc);
	
	CRect rect;
	GetClientRect(rect);
	nWidth = rect.Width();
	nHeight = rect.Height();

	CBitmap BMP;
	BMP.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
	CBitmap* pOldBitmap = MemDC.SelectObject(&BMP);
	MemDC.BitBlt(0, 0, nWidth, nHeight, &dc, 0, 0, SRCCOPY);

	/*
	SECJpeg* jpg = new SECJpeg();   
	jpg->CreateFromBitmap(&MemDC,&BMP);     
	jpg->SaveImage("Test.jpg");
	*/

	HANDLE hDib;
	LPSTR pDib;
	LPBITMAPINFO lpBitInfo;
	HANDLE hlpBitInfo;
	//CBitmap BMP;

	//BMP.LoadBitmap(IDB_BITMAP1);

	hDib=GlobalAlloc(GHND,nWidth*nHeight*3);
	pDib=(LPSTR)GlobalLock(hDib);
	hlpBitInfo=GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+ sizeof(BITMAPINFO));
	lpBitInfo=(LPBITMAPINFO)GlobalLock(hlpBitInfo);

	//BITMAPINFO
	lpBitInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	lpBitInfo->bmiHeader.biWidth = nWidth;
	lpBitInfo->bmiHeader.biHeight = nHeight;
	lpBitInfo->bmiHeader.biPlanes = 1;
	lpBitInfo->bmiHeader.biBitCount = 24;
	lpBitInfo->bmiHeader.biCompression = BI_RGB;
	lpBitInfo->bmiHeader.biSizeImage = nWidth * nHeight * 3;
	lpBitInfo->bmiHeader.biXPelsPerMeter = 0;
	lpBitInfo->bmiHeader.biYPelsPerMeter = 0;
	lpBitInfo->bmiHeader.biClrUsed = 0;
	lpBitInfo->bmiHeader.biClrImportant = 0;         
	////BITMAPINFO  

	HDC hdc=::GetDC(this->m_hWnd);
	GetDIBits(hdc, (HBITMAP)BMP, 0, nHeight, pDib, lpBitInfo, DIB_RGB_COLORS);
	::ReleaseDC(this->m_hWnd, hdc);

	static DOCINFO docinfo= {sizeof(DOCINFO), _T("IMAGE"), NULL};

	CPrintDialog dlg(FALSE);
	if(dlg.DoModal()== IDCANCEL)
		return; 

	HDC hpdc= dlg.GetPrinterDC();
	int cx, cy ;

	cy=GetDeviceCaps(hpdc,VERTRES);
	cx=GetDeviceCaps(hpdc,HORZRES);

	if(StartDoc(hpdc,&docinfo))
	{
		if(StartPage(hpdc))
		{
			StretchDIBits(hpdc,
				0, 0, cx, cy, 0, 0, nWidth, nHeight, pDib, lpBitInfo, DIB_RGB_COLORS,SRCCOPY);
			EndPage(hpdc);
		}
		EndDoc(hpdc);
	}
	::RestoreDC(hpdc, -1);


출처 : http://www1.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=793631&ref=793631&page=1

Posted by frostguy
// 인쇄 다이얼로그 박스 출력
CPrintDialog printDlg(FALSE);
if (printDlg.DoModal() == IDCANCEL) return;

// 프린터 DC를 얻음
CDC dc;
dc.Attach(printDlg.GetPrinterDC());
dc.m_bPrinting = TRUE;

// 인쇄될 도큐먼트에 관한 정보 설정
CString strTitle;                           
strTitle.LoadString(AFX_IDS_APP_TITLE);
DOCINFO di;                       
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = strTitle;
    
// 도큐먼트 인쇄 시작
BOOL bPrintingOK = dc.StartDoc(&di); 

// CPrintInfo에 인쇄 관련 정보 설정
CPrintInfo Info;
//width = 4725, height 6792
Info.m_rectDraw.SetRect(500,500, dc.GetDeviceCaps(HORZRES)-500, dc.GetDeviceCaps(VERTRES)-500);
    
CRect           r;
int             nHeight;    

dc.SetMapMode(MM_TEXT);    
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=227478&ref=227094
 // m_strEDIT는 프린트할 String 데이터가 들어있는 CString 변수 입니다.
char * p = m_strEDIT.GetBuffer(m_strEDIT.GetLength());
char *startAt = p;

//이 부분이 여러페이지 인쇄를 위해서 쓰이는 부분 같습니다.
 int totalDone = 0;    
 int lengthToGo = m_strEDIT.GetLength();

// 페이지를 인쇄하는 루프
for (UINT page = Info.GetMinPage(); bPrintingOK && totalDone < lengthToGo ; page++)
{
    // 페이지 인쇄 시작
   dc.StartPage(); 
    Info.m_nCurPage = page;
                
    r = Info.m_rectDraw;
    r.bottom = r.top;
    int i = 0;
    while (r.bottom < Info.m_rectDraw.bottom && totalDone + i < lengthToGo)
    {
            r.right = Info.m_rectDraw.right;            
            nHeight = dc.DrawText(startAt, i++, r, DT_CALCRECT|DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
    }
    // go one back to assure correct height
    if (r.bottom >= Info.m_rectDraw.bottom)
    i--;
    //print page number
    CString strPageNum;
    strPageNum.Format("- %d -",Info.m_nCurPage);
    dc.DrawText(strPageNum,i, r, DT_CENTER|DT_SINGLELINE|DT_VCENTER);

    // print that text
    dc.DrawText(startAt, i, r, DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
        
    // go to next page
    startAt += i;
    totalDone += i;        

   // 페이지 인쇄 완료
  bPrintingOK = (dc.EndPage() > 0); 
}
m_strEDIT.ReleaseBuffer();

// 도큐먼트 인쇄 종료
if (bPrintingOK) dc.EndDoc(); 
else dc.AbortDoc(); 

dc.Detach();
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=227478&ref=227094
Posted by frostguy

최근에 달린 댓글

글 보관함