Ориентация листа при печати html-файла
От: Marinka  
Дата: 12.10.05 12:07
Оценка:
Здравствуйте, помогите советом кто может.

Необходимо распечатать html-файл, выставив при этом программно книжную ориентацию страницы (по дефолту стоит альбомная). ShellExecute не подходит, она вызывает стадартный диалог печати, в котором пользователю надо руками идти на закладку свойства...

Вот код, не пойму почему не печатает, что не так?



HDC hdcPrint;                
 char szDevString[120];      
 char *szPrinter, *szDriver; 
 char *szPort;                
DOCINFO docinf = {sizeof(DOCINFO)}; 
DEVMODE pDevMode; 

char *path = "C:\\VarBil.html"; 

docinf.cbSize = sizeof(DOCINFO); 
docinf.lpszDocName = "print";          
docinf.lpszOutput = path;            
docinf.lpszDatatype = NULL;          
docinf.fwType = 0;                        

pDevMode.dmOrientation = 2; 

GetProfileStringA("windows", "device", ",,,", szDevString, 120); 
if ((szPrinter = strtok(szDevString, (const char *) ",")) && (szDriver = strtok ((char *) NULL, (const char *) ", ")) && (szPort = strtok ((char *) NULL, (const char *) ", "))) 
{ 
  hdcPrint = CreateDC(szDriver, szPrinter,szPort, &pDevMode); 
} 

StartDoc(hdcPrint, &docinf); 
StartPage(hdcPrint ); 
EndPage(hdcPrint ); 
EndDoc(hdcPrint ); 

DeleteDC(hdcPrint);
Re: Ориентация листа при печати html-файла
От: Pavel Dvorkin Россия  
Дата: 13.10.05 06:53
Оценка:
Здравствуйте, Marinka, Вы писали:

M>Здравствуйте, помогите советом кто может.


M>Необходимо распечатать html-файл, выставив при этом программно книжную ориентацию страницы (по дефолту стоит альбомная). ShellExecute не подходит, она вызывает стадартный диалог печати, в котором пользователю надо руками идти на закладку свойства...


M>Вот код, не пойму почему не печатает, что не так?


Все так. Просто ничего не делается.



M>docinf.lpszOutput = path;


Это имя выходного файла для печати в файл.


M>StartDoc(hdcPrint, &docinf);

M>StartPage(hdcPrint );
M>EndPage(hdcPrint );
M>EndDoc(hdcPrint );

А здесь открываем печать и тут же ее закрываем, ничего не напечатав.
With best regards
Pavel Dvorkin
Re: Ориентация листа при печати html-файла
От: migel  
Дата: 13.10.05 07:17
Оценка:
Здравствуйте, Marinka, Вы писали:

M>Здравствуйте, помогите советом кто может.


M>Необходимо распечатать html-файл, выставив при этом программно книжную ориентацию страницы (по дефолту стоит альбомная). ShellExecute не подходит, она вызывает стадартный диалог печати, в котором пользователю надо руками идти на закладку свойства...


M>Вот код, не пойму почему не печатает, что не так?


M>

M>GetProfileStringA("windows", "device", ",,,", szDevString, 120); 
Depricated method
M>

Даже если заставить его печатать то этот код напечатает совсем не то что тебе хочеться
Ежели надо напечатать отрендеренный HTML то лучше попросить об этом IE — попробуй все таки ShellExecute но перед этим поставь WH_CBT HOOK (system wide) и отловя создание диалога выбора принтера из хука понажимай программно нужные настройки
например так
LRESULT CALLBACK CbtFunc (int nCode, WPARAM wParam, LPARAM lParam )
{
    if ( nCode == HCBT_CREATEWND && !hwndPrintDialog) 
        {
        HWND hWnd = (HWND)wParam;
        LPCBT_CREATEWND pcbt = (LPCBT_CREATEWND)lParam;
        LPCREATESTRUCT pcs = pcbt->lpcs;
        if ((DWORD)pcs->lpszClass == 0x00008002)
            {
            OSVERSIONINFO osvi;
            hwndPrintDialog = hWnd;  // Get hwnd of Page Setup dialog
            pcs->x = -2 * pcs->cx;   // Move dialog off screen
            osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
            GetVersionEx (&osvi);
            if (osvi.dwMajorVersion > 4)
                g_lpfnOldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, PrintSubDialog);
            SendMessage(hwndMain, WM_DIALOG_CREATED, 0, (LPARAM)hWnd); 
            }
        }
    if (nCode == HCBT_ACTIVATE && wParam == (WPARAM)hwndPrintDialog)
        {
        DWORD dwSize = MAX_PATH;
        TCHAR* psz = m_chPrinter;

        OSVERSIONINFO osvi;
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx (&osvi);
        if (osvi.dwMajorVersion > 4)
            {
            HWND hwndTab = NULL;
            if (DPGetDefaultPrinter(m_chPrinter, &dwSize) == FALSE)
                {
                dwSize++;
                psz = malloc(dwSize);
                if (psz)
                    DPGetDefaultPrinter(psz, &dwSize);
                }

            }
        else
            {
            UINT selItem = 0;
            SetDlgItemInt(hwndPrintDialog, 0x482, nCopyNum, FALSE) ;
            selItem = SendDlgItemMessage(hwndPrintDialog, 0x0473, CB_GETCURSEL, 0, 0);
            SendDlgItemMessage(hwndPrintDialog, 0x0473, CB_GETLBTEXT, selItem, (LPARAM)m_chPrinter);
            }
        SendMessage(hwndMain, WM_DIALOG_CLOSED, 0, (LPARAM)psz); 
        if (psz != m_chPrinter && psz)
            free(psz);
        
        //and close it!
        if (osvi.dwMajorVersion <= 4)
            SendMessage(hwndPrintDialog, WM_COMMAND, IDOK, 0);
        }
    return( CallNextHookEx(hhookHook, nCode,wParam, lParam));
}


/// ASCII версия для unicode преобразования тривиальны
LRESULT WINAPI PrintSubDialog(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndPage = NULL;
    if (uMsg == WM_INITDIALOG)
        {
        HWND hwndTab = NULL;
        LRESULT lRes = CallWindowProc((FARPROC)g_lpfnOldWndProc, hDlg, uMsg, wParam, lParam);
        hwndTab = GetDlgItem(hwndPrintDialog, 0x3020);
        if (hwndTab != NULL)
            {
            char szClass[48];
            GetClassName(hwndTab, szClass, sizeof(szClass));
            if (!strcmpi(szClass, "SysTabControl32"))
                {
                // it is Shell 5 Print Dialog
                HWND hwndChild = GetWindow(hwndPage, GW_CHILD);
                while (hwndChild != NULL)
                    {
                    GetClassName(hwndChild, szClass, sizeof(szClass));
                    if (!strcmpi(szClass, "#32770"))
                        {
                        hwndPrintDialog = NULL;
                        SetDlgItemInt(hwndChild, 0x481, nCopyNum, FALSE) ;
                        SendMessage(hDlg, WM_COMMAND, IDOK, 0);
                        return lRes;
                        }
                    hwndChild = GetWindow(hwndChild, GW_HWNDNEXT);
                    }
                }
            }
        return lRes;
        }
    if (uMsg == WM_PARENTNOTIFY && LOWORD(wParam) == WM_CREATE)
        {
        hwndPage = lParam;
        }
    return CallWindowProc((FARPROC)g_lpfnOldWndProc, hDlg, uMsg, wParam, lParam);
}
... << RSDN@Home 1.1.4 stable SR1 rev. 608>>
Re[2]: Ориентация листа при печати html-файла
От: Marinka  
Дата: 13.10.05 07:29
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Все так. Просто ничего не делается.

Ваша правда.

M>>docinf.lpszOutput = path;

PD>Это имя выходного файла для печати в файл.
The DOCINFO structure contains the input and output file names and other information used by the StartDoc function.
The StartDoc function starts a print job.
Иными словами, не имеет смысла заполнять DOCINFO, если надо вывести конкретный файл на печать. И вот эти параметры lpszOutput,lpszDatatype, fwType существуют только для создания файла.


M>>StartDoc(hdcPrint, &docinf);

M>>StartPage(hdcPrint );
M>>EndPage(hdcPrint );
M>>EndDoc(hdcPrint );
PD>А здесь открываем печать и тут же ее закрываем, ничего не напечатав.
Это я уже поняла, но TextOut мне не подходит, я не могу воспроизвести таблицы из html (а там именно таблицы) простым выводом символов на печать. В идеале мне нужна функция, выбирабщая html в контекст принтера... Но чудес ведь не бывает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.