Здравствуйте, помогите советом кто может.
Необходимо распечатать 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);
Здравствуйте, 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>>
Здравствуйте, 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 в контекст принтера... Но чудес ведь не бывает.