Example #1
0
/*************************************************************************
 *                  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;
}
Example #2
0
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);
}
Example #3
0
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)&gt, 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);
}
Example #4
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);
	}
}