/************************************************************************* * StartDocA [GDI32.@] * */ INT WINAPI StartDocA(HDC hdc, const DOCINFOA* doc) { LPWSTR szDocName = NULL, szOutput = NULL, szDatatype = NULL; DOCINFOW docW; INT ret, len; docW.cbSize = doc->cbSize; if (doc->lpszDocName) { len = MultiByteToWideChar(CP_ACP,0,doc->lpszDocName,-1,NULL,0); szDocName = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR)); MultiByteToWideChar(CP_ACP,0,doc->lpszDocName,-1,szDocName,len); } if (doc->lpszOutput) { len = MultiByteToWideChar(CP_ACP,0,doc->lpszOutput,-1,NULL,0); szOutput = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR)); MultiByteToWideChar(CP_ACP,0,doc->lpszOutput,-1,szOutput,len); } if (doc->lpszDatatype) { len = MultiByteToWideChar(CP_ACP,0,doc->lpszDatatype,-1,NULL,0); szDatatype = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR)); MultiByteToWideChar(CP_ACP,0,doc->lpszDatatype,-1,szDatatype,len); } docW.lpszDocName = szDocName; docW.lpszOutput = szOutput; docW.lpszDatatype = szDatatype; docW.fwType = doc->fwType; ret = StartDocW(hdc, &docW); HeapFree( GetProcessHeap(), 0, szDocName ); HeapFree( GetProcessHeap(), 0, szOutput ); HeapFree( GetProcessHeap(), 0, szDatatype ); return ret; }
VOID DIALOG_FilePrint(VOID) { DOCINFOW di; PRINTDLGW printer; int page, dopage, copy; LOGFONTW lfFont; HFONT hTextFont, old_font = 0; DWORD size; BOOL ret = FALSE; RECT rc; LPWSTR pTemp; TEXTINFO tInfo; WCHAR cTemp[PRINT_LEN_MAX]; /* Get Current Settings */ ZeroMemory(&printer, sizeof(printer)); printer.lStructSize = sizeof(printer); printer.hwndOwner = Globals.hMainWnd; printer.hDevMode = Globals.hDevMode; printer.hDevNames = Globals.hDevNames; printer.hInstance = Globals.hInstance; /* Set some default flags */ printer.Flags = PD_RETURNDC | PD_NOSELECTION; printer.nFromPage = 0; printer.nMinPage = 1; /* we really need to calculate number of pages to set nMaxPage and nToPage */ printer.nToPage = 0; printer.nMaxPage = -1; /* Let commdlg manage copy settings */ printer.nCopies = (WORD)PD_USEDEVMODECOPIES; if (!PrintDlgW(&printer)) return; Globals.hDevMode = printer.hDevMode; Globals.hDevNames = printer.hDevNames; SetMapMode(printer.hDC, MM_TEXT); /* initialize DOCINFO */ di.cbSize = sizeof(DOCINFOW); di.lpszDocName = Globals.szFileTitle; di.lpszOutput = NULL; di.lpszDatatype = NULL; di.fwType = 0; if(printer.Flags & PD_PRINTTOFILE) { di.lpszOutput = dialog_print_to_file(printer.hwndOwner); if(!di.lpszOutput) return; } /* Get the file text */ size = GetWindowTextLengthW(Globals.hEdit) + 1; pTemp = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); if (!pTemp) { DeleteDC(printer.hDC); ShowLastError(); return; } size = GetWindowTextW(Globals.hEdit, pTemp, size); if (StartDocW(printer.hDC, &di) > 0) { /* Get the page margins in pixels. */ rc.top = MulDiv(Globals.iMarginTop, GetDeviceCaps(printer.hDC, LOGPIXELSY), 2540) - GetDeviceCaps(printer.hDC, PHYSICALOFFSETY); rc.bottom = GetDeviceCaps(printer.hDC, PHYSICALHEIGHT) - MulDiv(Globals.iMarginBottom, GetDeviceCaps(printer.hDC, LOGPIXELSY), 2540); rc.left = MulDiv(Globals.iMarginLeft, GetDeviceCaps(printer.hDC, LOGPIXELSX), 2540) - GetDeviceCaps(printer.hDC, PHYSICALOFFSETX); rc.right = GetDeviceCaps(printer.hDC, PHYSICALWIDTH) - MulDiv(Globals.iMarginRight, GetDeviceCaps(printer.hDC, LOGPIXELSX), 2540); /* Create a font for the printer resolution */ lfFont = Globals.lfFont; lfFont.lfHeight = MulDiv(lfFont.lfHeight, GetDeviceCaps(printer.hDC, LOGPIXELSY), get_dpi()); /* Make the font a bit lighter */ lfFont.lfWeight -= 100; hTextFont = CreateFontIndirectW(&lfFont); old_font = SelectObject(printer.hDC, hTextFont); for (copy = 1; copy <= printer.nCopies; copy++) { page = 1; tInfo.mptr = pTemp; tInfo.mend = pTemp + size; tInfo.lptr = cTemp; tInfo.len = 0; do { if (printer.Flags & PD_PAGENUMS) { /* a specific range of pages is selected, so * skip pages that are not to be printed */ if (page > printer.nToPage) break; else if (page >= printer.nFromPage) dopage = 1; else dopage = 0; } else dopage = 1; ret = notepad_print_page(printer.hDC, &rc, dopage, page, &tInfo); page++; } while (ret && tInfo.mptr < tInfo.mend); if (!ret) break; } EndDoc(printer.hDC); SelectObject(printer.hDC, old_font); DeleteObject(hTextFont); } DeleteDC(printer.hDC); HeapFree(GetProcessHeap(), 0, pTemp); }
static void print(LPPRINTDLGW pd, LPWSTR wszFileName) { FORMATRANGE fr; DOCINFOW di; HWND hEditorWnd = GetDlgItem(pd->hwndOwner, IDC_EDITOR); int printedPages = 0; fr.hdc = pd->hDC; fr.hdcTarget = pd->hDC; fr.rc = get_print_rect(fr.hdc); fr.rcPage.left = 0; fr.rcPage.right = fr.rc.right + margins.right; fr.rcPage.top = 0; fr.rcPage.bottom = fr.rc.bottom + margins.bottom; ZeroMemory(&di, sizeof(di)); di.cbSize = sizeof(di); di.lpszDocName = wszFileName; if(pd->Flags & PD_PRINTTOFILE) { di.lpszOutput = dialog_print_to_file(pd->hwndOwner); if(!di.lpszOutput) return; } if(pd->Flags & PD_SELECTION) { SendMessageW(hEditorWnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg); } else { GETTEXTLENGTHEX gt; gt.flags = GTL_DEFAULT; gt.codepage = 1200; fr.chrg.cpMin = 0; fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); if(pd->Flags & PD_PAGENUMS) char_from_pagenum(hEditorWnd, &fr, pd->nToPage); } StartDocW(fr.hdc, &di); do { if(StartPage(fr.hdc) <= 0) break; fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr); if(EndPage(fr.hdc) <= 0) break; printedPages++; if((pd->Flags & PD_PAGENUMS) && (printedPages > (pd->nToPage - pd->nFromPage))) break; } while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax); EndDoc(fr.hdc); SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0); }
void PrintEdit(HWND hEdit, wchar_t * lpDocName){ FORMATRANGE fr; CHARRANGE chrg; HDC hPrintDC; int tempFlags; int pageMin = 0, pageMax = 0; HFONT hFontPageNumber, hFontOld; LOGFONTW lf; int xNP, yNP, yDoc; DOCINFOW docinfo; wchar_t szPage[32]; int oldAlign; COLORREF oldColor; ZeroMemory(&g_pPdlg, sizeof(g_pPdlg)); g_pPdlg.lStructSize = sizeof(g_pPdlg); g_pPdlg.hwndOwner = g_hMain; g_pPdlg.hInstance = g_hInstance; SendMessageW(hEdit, EM_EXGETSEL ,0, (LPARAM)&chrg); if(chrg.cpMax == 0 || chrg.cpMax == chrg.cpMin){ g_pPdlg.Flags = PD_ALLPAGES | PD_NOSELECTION; } else{ if(chrg.cpMax > chrg.cpMin){ g_pPdlg.Flags = PD_SELECTION; } else{ g_pPdlg.Flags = PD_ALLPAGES; } } g_pPdlg.Flags |= PD_RETURNDC | PD_HIDEPRINTTOFILE | 0x20000; //PD_NONETWORKBUTTON GetPageInfo(hEdit, FALSE); g_pPdlg.nFromPage = 1; g_pPdlg.nToPage = m_CountPage; g_pPdlg.nMinPage = 1; g_pPdlg.nMaxPage = m_CountPage; g_pPdlg.nCopies = 1; if(PrintDlgW(&g_pPdlg)){ hPrintDC = g_pPdlg.hDC; fr.hdc = hPrintDC; fr.hdcTarget = NULL; tempFlags = g_pPdlg.Flags; tempFlags &= PD_ALLPAGES | PD_SELECTION | PD_PAGENUMS; if(tempFlags == PD_ALLPAGES){ pageMin = 0; pageMax = m_CountPage; } else if(tempFlags == PD_SELECTION){ GetPageInfo(hEdit, TRUE); pageMin = 0; pageMax = m_CountPage; } else if(tempFlags == PD_PAGENUMS){ pageMin = g_pPdlg.nFromPage; pageMin--; pageMax = g_pPdlg.nToPage; } fr.rc.left = m_Margin.left; fr.rc.top = m_Margin.top; fr.rc.right = m_Paper.x - m_Margin.right; fr.rc.bottom = m_Paper.y - m_Margin.bottom; ZeroMemory(&lf, sizeof(lf)); lf.lfHeight = -MulDiv(10, GetDeviceCaps(hPrintDC, LOGPIXELSY), 72); wcscpy(lf.lfFaceName, FONT_NP); hFontPageNumber = CreateFontIndirectW(&lf); yNP = GetDeviceCaps(hPrintDC, VERTRES); xNP = GetDeviceCaps(hPrintDC, HORZRES) / 2; yDoc = 16; fr.rcPage.left = 0; fr.rcPage.top = 0; fr.rcPage.right = m_Paper.x; fr.rcPage.bottom = m_Paper.y ; ZeroMemory(&docinfo, sizeof(docinfo)); docinfo.cbSize = sizeof(docinfo); docinfo.lpszDocName = lpDocName; StartDocW(hPrintDC, &docinfo); if(pageMax){ do{ pageMin++; StartPage(hPrintDC); hFontOld = SelectFont(hPrintDC, hFontPageNumber); wsprintfW(szPage, L"Page %i", pageMin); oldAlign = SetTextAlign(hPrintDC, TA_CENTER | TA_BOTTOM); oldColor = SetTextColor(hPrintDC, 0); TextOutW(hPrintDC, xNP, yNP, szPage, wcslen(szPage)); SetTextAlign(hPrintDC, TA_CENTER | TA_TOP); TextOutW(hPrintDC, xNP, yDoc, lpDocName, wcslen(lpDocName)); SetTextColor(hPrintDC, oldColor); SelectFont(hPrintDC, hFontOld); SetTextAlign(hPrintDC, oldAlign); if(m_pChar){ int min = pageMin; min--; fr.chrg.cpMin = *(m_pChar + min); min++; fr.chrg.cpMax = *(m_pChar + min); } else{ fr.chrg.cpMin = 0; fr.chrg.cpMax = 0; } SendMessageW(hEdit, EM_FORMATRANGE, TRUE, (LPARAM)&fr); EndPage(hPrintDC); }while(pageMin < pageMax); } DeleteFont(hFontPageNumber); SendMessageW(hEdit, EM_FORMATRANGE, FALSE, (LPARAM)NULL); EndDoc(hPrintDC); DeleteDC(hPrintDC); } }