如何实现选择指定的打印机打印???

elexu 2007-04-03 03:11:37
电脑上装了2台打印机,一台是打小回单的,一台是打A4报表的。怎么样在需要的时候选择指定的打印机打印。不能弹对话框选择,直接打印。用CPrintDialog是否可以实现,如何实现,最好有代码,谢谢!!!
...全文
1448 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
elexu 2007-04-03
  • 打赏
  • 举报
回复
明白了,谢谢,开始发奖。
会思考的草 2007-04-03
  • 打赏
  • 举报
回复
BOOL GetSystemDefaultPrinter(LPTSTR pPrinterName, LPDWORD lpdwBufferSize)
{
BOOL bFlag = FALSE;
DWORD dwNeeded = 0;
DWORD dwReturned = 0;
TCHAR cBuffer[_MAX_PATH] = {0};
OSVERSIONINFO OsvrInfo = {0};
PRINTER_INFO_2* pstPrintInfo2 = NULL;

OsvrInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsvrInfo);

if(OsvrInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) //Win9x
{
EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, NULL, 0, &dwNeeded, &dwReturned);
if(dwNeeded == 0)
{
return FALSE;
}

pstPrintInfo2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR, dwNeeded);
if(pstPrintInfo2 == NULL)
{
return FALSE;
}

bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, (LPBYTE)pstPrintInfo2, dwNeeded, &dwNeeded, &dwReturned);
if(!bFlag)
{
GlobalFree(pstPrintInfo2);
return FALSE;
}

if((DWORD)lstrlen(pstPrintInfo2->pPrinterName) >= *lpdwBufferSize)
{
*lpdwBufferSize = (DWORD)lstrlen(pstPrintInfo2->pPrinterName) + 1;
GlobalFree(pstPrintInfo2);
return FALSE;
}

lstrcpy(pPrinterName, pstPrintInfo2->pPrinterName);

*lpdwBufferSize = (DWORD)lstrlen(pstPrintInfo2->pPrinterName) + 1;
}
else if(OsvrInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
#if(WINVER >= 0x0500)
if(OsvrInfo.dwMajorVersion >= 5) // Windows 2000 or later
{
bFlag = GetDefaultPrinter(pPrinterName, lpdwBufferSize);
if(!bFlag)
{
return FALSE;
}
}
else // NT4.0 or earlier
#endif
{
if(::GetProfileString("windows", "device", ",,,", cBuffer, _MAX_PATH) <= 0)
{
return FALSE;
}

// Printer name precedes first "," character...
strtok(cBuffer, ",");

// If given buffer too small, set required size and fail...
if((DWORD)lstrlen(cBuffer) >= *lpdwBufferSize)
{
*lpdwBufferSize = (DWORD)lstrlen(cBuffer) + 1;
return FALSE;
}

// Copy printer name into passed-in buffer...
lstrcpy(pPrinterName, cBuffer);

// Set buffer size parameter to min required buffer size...
*lpdwBufferSize = (DWORD)lstrlen(cBuffer) + 1;
}
}

if(pstPrintInfo2)
{
GlobalFree(pstPrintInfo2);
}
return TRUE;
}


BOOL SetSystemDefaultPrinter(LPTSTR pPrinterName)
{
if(pPrinterName == NULL)
{
return FALSE;
}

BOOL bFlag = FALSE;
LONG lResult = 0;
DWORD dwNeeded = 0;
LPTSTR pBuffer = NULL;
HANDLE hPrinter = NULL;
OSVERSIONINFO OsvrInfo = {0};
PRINTER_INFO_2* pstPrintInfo2 = NULL;

OsvrInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsvrInfo);

if(OsvrInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) //Win9x
{
// Open this printer so we can get information about it
bFlag = OpenPrinter(pPrinterName, &hPrinter, NULL);
if(!bFlag || hPrinter==NULL)
{
return FALSE;
}

GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
if(dwNeeded == 0)
{
ClosePrinter(hPrinter);
return FALSE;
}

pstPrintInfo2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
if(pstPrintInfo2 == NULL)
{
ClosePrinter(hPrinter);
return FALSE;
}

bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pstPrintInfo2, dwNeeded, &dwNeeded);
if(!bFlag)
{
ClosePrinter(hPrinter);
GlobalFree(pstPrintInfo2);
return FALSE;
}

// Set default printer attribute for this printer...
pstPrintInfo2->Attributes |= PRINTER_ATTRIBUTE_DEFAULT;
bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pstPrintInfo2, 0);
if(!bFlag)
{
ClosePrinter(hPrinter);
GlobalFree(pstPrintInfo2);
return FALSE;
}

lResult = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L,
(LPARAM)(LPCTSTR)"windows", SMTO_NORMAL, 1000, NULL);
// lResult = SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0L,
// (LPARAM)(LPCTSTR)"windows");
}
else if (OsvrInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
#if(WINVER >= 0x0500)
if(OsvrInfo.dwMajorVersion >= 5) // Windows 2000 or later...
{
bFlag = SetDefaultPrinter(pPrinterName);
if(!bFlag)
{
return FALSE;
}
}
else // NT4.0 or earlier...
#endif
{
bFlag = OpenPrinter(pPrinterName, &hPrinter, NULL);
if(!bFlag || hPrinter==NULL)
{
return FALSE;
}

GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
if(dwNeeded == 0)
{
ClosePrinter(hPrinter);
return FALSE;
}

pstPrintInfo2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR, dwNeeded);
if(pstPrintInfo2 == NULL)
{
ClosePrinter(hPrinter);
return FALSE;
}

bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pstPrintInfo2, dwNeeded, &dwNeeded);
if((!bFlag) || (!pstPrintInfo2->pDriverName) || (!pstPrintInfo2->pPortName))
{
ClosePrinter(hPrinter);
GlobalFree(pstPrintInfo2);
return FALSE;
}

pBuffer =
(LPTSTR)GlobalAlloc(GPTR, lstrlen(pPrinterName)+lstrlen(pstPrintInfo2->pDriverName)+lstrlen(pstPrintInfo2->pPortName)+3);
if(pBuffer == NULL)
{
ClosePrinter(hPrinter);
GlobalFree(pstPrintInfo2);
return FALSE;
}

// Build string in form "printername,drivername,portname"
lstrcpy(pBuffer, pPrinterName); lstrcat(pBuffer, ",");
lstrcat(pBuffer, pstPrintInfo2->pDriverName); lstrcat(pBuffer, ",");
lstrcat(pBuffer, pstPrintInfo2->pPortName);

bFlag = WriteProfileString("windows", "device", pBuffer);
if(!bFlag)
{
ClosePrinter(hPrinter);
GlobalFree(pstPrintInfo2);
GlobalFree(pBuffer);
return FALSE;
}
}

lResult =
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L, 0L, SMTO_NORMAL, 1000, NULL);
}

if(hPrinter)
{
ClosePrinter(hPrinter);
}
if(pstPrintInfo2)
{
GlobalFree(pstPrintInfo2);
}
if(pBuffer)
{
GlobalFree(pBuffer);
}

return TRUE;
}
elexu 2007-04-03
  • 打赏
  • 举报
回复
那如何把我要用的打印机设为默认打印机(用程序)
会思考的草 2007-04-03
  • 打赏
  • 举报
回复
BOOL CRefinerView::GetPrinterDevice(LPCTSTR lpszPrinterName, HGLOBAL* phDevNames, HGLOBAL* phDevMode)
{
if(phDevMode==NULL || phDevNames==NULL)
{
return FALSE;
}

HANDLE hPrinter = NULL;
if(OpenPrinter(const_cast<LPTSTR>(lpszPrinterName),&hPrinter,NULL) == FALSE)
{
return FALSE;
}

DWORD dwBytesNeeded = 0;
DWORD dwBytesReturned = 0;
GetPrinter(hPrinter, 2, NULL, 0, &dwBytesNeeded);
PRINTER_INFO_2* pPrntInfo2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR, dwBytesNeeded);
if(GetPrinter(hPrinter, 2, (LPBYTE)pPrntInfo2, dwBytesNeeded, &dwBytesReturned) == 0)
{
GlobalFree(pPrntInfo2);
ClosePrinter(hPrinter);
return FALSE;
}
ClosePrinter(hPrinter);

HGLOBAL hDevMode = GlobalAlloc(GHND, sizeof(*pPrntInfo2->pDevMode)+pPrntInfo2->pDevMode->dmDriverExtra);
ASSERT(hDevMode);
DEVMODE* pDevMode = (DEVMODE*)GlobalLock(hDevMode);
ASSERT(pDevMode);

// copy DEVMODE data from PRINTER_INFO_2::pDevMode
memcpy(pDevMode, pPrntInfo2->pDevMode, sizeof(*pPrntInfo2->pDevMode)+pPrntInfo2->pDevMode->dmDriverExtra);
GlobalUnlock(hDevMode);

// Compute size of DEVNAMES structure from PRINTER_INFO_2's data
DWORD drvNameLen = lstrlen(pPrntInfo2->pDriverName)+1; // driver name
DWORD ptrNameLen = lstrlen(pPrntInfo2->pPrinterName)+1; // printer name
DWORD porNameLen = lstrlen(pPrntInfo2->pPortName)+1; // port name

// Allocate a global handle big enough to hold DEVNAMES.
HGLOBAL hDevNames =
GlobalAlloc(GHND, sizeof(DEVNAMES)+(drvNameLen+ptrNameLen+porNameLen)*sizeof(TCHAR));
ASSERT(hDevNames);
DEVNAMES* pDevNames = (DEVNAMES*)GlobalLock(hDevNames);
ASSERT(pDevNames);

// Copy the DEVNAMES information from PRINTER_INFO_2
// nOffset = TCHAR Offset into structure
INT nOffset = sizeof(DEVNAMES)/sizeof(TCHAR);
ASSERT(sizeof(DEVNAMES) == nOffset*sizeof(TCHAR));

pDevNames->wDriverOffset = (WORD)nOffset;
memcpy((LPTSTR)pDevNames + nOffset, pPrntInfo2->pDriverName, drvNameLen*sizeof(TCHAR));
nOffset += drvNameLen;

pDevNames->wDeviceOffset = (WORD)nOffset;
memcpy((LPTSTR)pDevNames + nOffset, pPrntInfo2->pPrinterName, ptrNameLen*sizeof(TCHAR));
nOffset += ptrNameLen;

pDevNames->wOutputOffset = (WORD)nOffset;
memcpy((LPTSTR)pDevNames + nOffset, pPrntInfo2->pPortName, porNameLen*sizeof(TCHAR));
pDevNames->wDefault = 0;

GlobalUnlock(hDevNames);
GlobalFree(pPrntInfo2);

*phDevMode = hDevMode;
*phDevNames = hDevNames;

return TRUE;
}


BOOL CRefinerView::OnPreparePrinting(CPrintInfo* pInfo)
{
……
if(pInfo->m_bDirect) //ID_FILE_PRINT_DIRECT,直接打印不弹出对话框
{
HGLOBAL hDevMode = NULL;
HGLOBAL hDevNames = NULL;
if(!GetPrinterDevice(pJob->PrintSetting.strPrinterName, &hDevNames, &hDevMode))
{
return FALSE;
}
pInfo->m_pPD->m_pd.hDevMode = hDevMode;
pInfo->m_pPD->m_pd.hDevNames = hDevNames;
pInfo->m_pPD->CreatePrinterDC();
}
return DoPreparePrinting(pInfo);

会思考的草 2007-04-03
  • 打赏
  • 举报
回复
可能表达有些疏漏,等晚上回去把完整代码贴给你.
东文-桑晨 2007-04-03
  • 打赏
  • 举报
回复
可以用程序获取打印机的名称,直接指定打印机打印,
另外再设置那个打印对话框的属性为不可视
会思考的草 2007-04-03
  • 打赏
  • 举报
回复
如果是MFC的话,在OnPreparePrinting里,把m_bDirect设为TRUE就可以不弹出选择打印机的对话框.或者你把"打印"这个菜单的ID设为ID_FILE_PRINT_DIRECT也可以.
至于自动选定打印机,你可以先保存系统当前默认打印机,然后把你所选定的打印机设为系统默认打印机,取得该打印机的DEVMODE后,CreatePrinterDC,打印之,打印完之后再把原先的默认打印机设回来就ok了.
CathySun118 2007-04-03
  • 打赏
  • 举报
回复
不能弹对话框选择,怎么知道用哪个打印机?要判断纸张大小?呵呵
elexu 2007-04-03
  • 打赏
  • 举报
回复
自己顶一把,大家帮忙啊

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧