Initial
This commit is contained in:
306
printman/Printman.cpp
Normal file
306
printman/Printman.cpp
Normal file
@@ -0,0 +1,306 @@
|
||||
#include <printman/printman.hpp>
|
||||
#include <printman/abortdlg.hpp>
|
||||
#include <printman/pickdlg.hpp>
|
||||
#include <common/regkey.hpp>
|
||||
#include <common/guiwnd.hpp>
|
||||
#include <common/bitmap.hpp>
|
||||
#include <common/resbmp.hpp>
|
||||
#include <common/bminfo.hpp>
|
||||
#include <common/purebmp.hpp>
|
||||
#include <common/version.hpp>
|
||||
#include <common/commdlg.hpp>
|
||||
|
||||
PrintManager::PrintManager(void)
|
||||
: mIndexPrinter(0), mIsInDoc(FALSE), mIsInPage(FALSE),
|
||||
mPrinterKey("System\\CurrentControlSet\\Control\\Print\\Printers")
|
||||
{
|
||||
getPrinters();
|
||||
}
|
||||
|
||||
PrintManager::PrintManager(const PrintManager &somePrintManager)
|
||||
{ // private implementation
|
||||
*this=somePrintManager;
|
||||
}
|
||||
|
||||
PrintManager::~PrintManager()
|
||||
{
|
||||
closePrinter();
|
||||
}
|
||||
|
||||
bool PrintManager::choosePrinter(GUIWindow &parentWindow,String &strPrinter)
|
||||
{
|
||||
PickDlg pickDlg;
|
||||
strPrinter=mDefaultPrinter.printerName();
|
||||
return pickDlg.perform(parentWindow,mPrinters,strPrinter);
|
||||
}
|
||||
|
||||
bool PrintManager::choosePrinter(GUIWindow &parentWindow,Printer &printer)
|
||||
{
|
||||
PRINTDLG printDlg;
|
||||
GlobalData<BYTE> devNames;
|
||||
DEVNAMES *pDevNames=0;
|
||||
|
||||
::memset(&printDlg,0,sizeof(PRINTDLG));
|
||||
printDlg.lStructSize=sizeof(PRINTDLG);
|
||||
if(!PrintDlg(&printDlg))return false;
|
||||
pDevNames=(DEVNAMES*)::GlobalLock(printDlg.hDevNames);
|
||||
printer.printerName((char*)((char*)pDevNames+pDevNames->wDriverOffset));
|
||||
printer.driverName((char*)((char*)pDevNames+pDevNames->wDeviceOffset));
|
||||
printer.portName((char*)((char*)pDevNames+pDevNames->wOutputOffset));
|
||||
::GlobalUnlock(printDlg.hDevNames);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::getPrinters(void)
|
||||
{
|
||||
mPrinters.remove();
|
||||
RegKey regKey(RegKey::CurrentConfig);
|
||||
if(regKey.openKey(mPrinterKey))
|
||||
{
|
||||
getPrinters(regKey,mPrinterKey);
|
||||
regKey.closeKey();
|
||||
}
|
||||
if(regKey.openKey(RegKey::LocalMachine,mPrinterKey))
|
||||
{
|
||||
getPrinters(regKey,mPrinterKey);
|
||||
regKey.closeKey();
|
||||
}
|
||||
if(mPrinters.size()&&mDefaultPrinter.printerName().isNull())
|
||||
{
|
||||
mDefaultPrinter=mPrinters[0];
|
||||
}
|
||||
return mPrinters.size()?true:false;
|
||||
}
|
||||
|
||||
bool PrintManager::getPrinters(RegKey ®Key,const String &strPrinterKey)
|
||||
{
|
||||
String strDefaultPrinter;
|
||||
Printer printer;
|
||||
String strPrinter;
|
||||
int enumKey(0);
|
||||
|
||||
regKey.queryValue("Default",strDefaultPrinter);
|
||||
if(getPrinter(strPrinterKey+String("\\")+strDefaultPrinter,printer))mDefaultPrinter=printer;
|
||||
while(true)
|
||||
{
|
||||
if(!regKey.enumKey(enumKey++,strPrinter))break;
|
||||
if(getPrinter(strPrinterKey+String("\\")+strPrinter,printer))mPrinters.insert(&printer);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::getPrinter(String &strPrinterKey,Printer &printer)
|
||||
{
|
||||
RegKey mchKey(RegKey::LocalMachine);
|
||||
String strPrinterNameKey("Name");
|
||||
String strPrinterDriverKey("Printer Driver");
|
||||
String strPrinterPortKey("Port");
|
||||
String strQuery;
|
||||
|
||||
if(!mchKey.openKey(strPrinterKey))return false;
|
||||
mchKey.queryValue(strPrinterNameKey,strQuery);
|
||||
printer.printerName(strQuery);
|
||||
mchKey.queryValue(strPrinterDriverKey,strQuery);
|
||||
printer.driverName(strQuery);
|
||||
mchKey.queryValue(strPrinterPortKey,strQuery);
|
||||
printer.portName(strQuery);
|
||||
mchKey.closeKey();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::openPrinter(const Printer &printer,GUIWindow &parentWindow,const String &strPrintDocName)
|
||||
{
|
||||
mParentWindow=&parentWindow;
|
||||
WinVersionInfo winVersion;
|
||||
|
||||
closePrinter();
|
||||
mPrinterDevice=::CreateDC(printer.printerName(),printer.driverName(),printer.portName(),0);
|
||||
mPrinterDevice.disposition(PureDevice::DeleteDC);
|
||||
if(!mPrinterDevice.isOkay())return false;
|
||||
startDoc(strPrintDocName);
|
||||
::SetAbortProc(mPrinterDevice,&abortProc);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::openPrinter(const String &strPrinterName,GUIWindow &parentWindow,const String &strPrintDocName)
|
||||
{
|
||||
mParentWindow=&parentWindow;
|
||||
return openPrinter(strPrinterName,strPrintDocName);
|
||||
}
|
||||
|
||||
bool PrintManager::openPrinter(const String &strPrinterName,const String &strPrintDocName)
|
||||
{
|
||||
Printer printer;
|
||||
WinVersionInfo winVersion;
|
||||
int index;
|
||||
|
||||
closePrinter();
|
||||
if(strPrinterName==mDefaultPrinter.printerName())printer=mDefaultPrinter;
|
||||
else for(index=0;index<mPrinters.size();index++)if(strPrinterName==mPrinters[index].printerName()){printer=mPrinters[index];break;}
|
||||
if(index==mPrinters.size())return false;
|
||||
if(winVersion.isWin95())
|
||||
{
|
||||
mPrinterDevice=::CreateDC(0,printer.driverName(),0,0);
|
||||
}
|
||||
else
|
||||
{
|
||||
mPrinterDevice=::CreateDC("WINSPOOL",printer.driverName(),0,0);
|
||||
::OutputDebugString(String(String("Driver:")+String("WINSPOOL")+String("\n")).str());
|
||||
::OutputDebugString(String(String("Device:")+printer.driverName()+String("\n")).str());
|
||||
::OutputDebugString(String(String("Output:")+String("")+String("\n")).str());
|
||||
::OutputDebugString(String(String("DevMode:")+String("")+String("\n")).str());
|
||||
}
|
||||
mPrinterDevice.disposition(PureDevice::DeleteDC);
|
||||
if(!mPrinterDevice.isOkay())return false;
|
||||
startDoc(strPrintDocName);
|
||||
::SetAbortProc(mPrinterDevice,&abortProc);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::startDoc(const String &strPrintDocName)
|
||||
{
|
||||
DOCINFO printDocInfo;
|
||||
|
||||
::memset(&printDocInfo,0,sizeof(printDocInfo));
|
||||
printDocInfo.cbSize=sizeof(printDocInfo);
|
||||
printDocInfo.lpszDocName=(char*)(String&)strPrintDocName;
|
||||
::StartDoc(mPrinterDevice,&printDocInfo);
|
||||
isInDoc(true);
|
||||
createAbortDlg();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::printDevice(PureBitmap &pureBitmap,bool advancePage)
|
||||
{
|
||||
PureDevice cDev;
|
||||
cDev.compatibleDevice(mPrinterDevice);
|
||||
cDev.select(pureBitmap);
|
||||
if(!isInDoc()||!mPrinterDevice.isOkay())return false;
|
||||
if(!(::GetDeviceCaps(mPrinterDevice,RASTERCAPS)&RC_BITBLT))return false;
|
||||
if(advancePage&&isInPage())endPage();
|
||||
if(!isInPage()&&!startPage())return false;
|
||||
mPrinterDevice.bitBlt(Rect(0,0,pureBitmap.width(),pureBitmap.height()),cDev,Point(0,0));
|
||||
// mPrinterDevice.stretchBlt(Rect(0,0,pureBitmap.width(),pureBitmap.height()),cDev,Rect(0,0,pureBitmap.width(),pureBitmap.height()));
|
||||
// winDev.bitBlt(Rect(0,0,pureBitmap.width(),pureBitmap.height()),cDev,Point(0,0));
|
||||
if(advancePage)endPage();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::printBitmap(Bitmap &bitmap,bool advancePage,int width,int height)
|
||||
{
|
||||
if(!bitmap.isOkay())return false;
|
||||
if(!isInDoc()||!mPrinterDevice.isOkay())return false;
|
||||
if(!(::GetDeviceCaps(mPrinterDevice,RASTERCAPS)&RC_BITBLT))return false;
|
||||
if(advancePage&&isInPage())endPage();
|
||||
if(!isInPage())startPage();
|
||||
if(!width)width=bitmap.width();
|
||||
if(!height)height=bitmap.height();
|
||||
::StretchDIBits(mPrinterDevice,0,0,width,height,0,0,bitmap.width(),bitmap.height(),bitmap.getDataPtr(),(BITMAPINFO *)bitmap.getInfoPtr(),DIB_RGB_COLORS,SRCCOPY);
|
||||
if(advancePage)endPage();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::printBitmap(ResBitmap &resBitmap,bool advancePage,int width,int height)
|
||||
{
|
||||
if(!resBitmap.isOkay())return false;
|
||||
if(!isInDoc()||!mPrinterDevice.isOkay())return false;
|
||||
if(!(::GetDeviceCaps(mPrinterDevice,RASTERCAPS)&RC_BITBLT))return false;
|
||||
if(advancePage&&isInPage())endPage();
|
||||
if(!isInPage())startPage();
|
||||
if(!width)width=resBitmap.width();
|
||||
if(!height)height=resBitmap.height();
|
||||
::StretchDIBits(mPrinterDevice,0,0,width,height,0,0,resBitmap.width(),resBitmap.height(),resBitmap.ptrData(),(BITMAPINFO *)resBitmap,DIB_RGB_COLORS,SRCCOPY);
|
||||
if(advancePage)endPage();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::printBitmap(PureBitmap &pureBitmap,bool advancePage,WORD scale)
|
||||
{
|
||||
PurePalette purePalette;
|
||||
PureDevice compatibleDevice;
|
||||
BitmapInfo bmInfo;
|
||||
GlobalData<BYTE> bitmapBits;
|
||||
WORD scaleWidth;
|
||||
WORD scaleHeight;
|
||||
|
||||
if(!pureBitmap.isOkay())return false;
|
||||
if(!isInDoc()||!mPrinterDevice.isOkay())return false;
|
||||
if(!(::GetDeviceCaps(mPrinterDevice,RASTERCAPS)&RC_BITBLT))return false;
|
||||
if(advancePage&&isInPage())endPage();
|
||||
if(!isInPage()&&!startPage())return false;
|
||||
purePalette.systemPalette();
|
||||
pureBitmap.getBitmapInfo(bmInfo);
|
||||
if(bmInfo.bitCount()<=8)
|
||||
{
|
||||
purePalette.systemPalette();
|
||||
bmInfo=purePalette;
|
||||
}
|
||||
pureBitmap.getBitmapBits(bitmapBits,true);
|
||||
bmInfo.width(pureBitmap.width());
|
||||
bmInfo.height(pureBitmap.height());
|
||||
if(bmInfo.bitCount()<=8)mPrinterDevice.select(purePalette.getPalette(),true);
|
||||
scaleWidth=pureBitmap.width();
|
||||
scaleHeight=pureBitmap.height();
|
||||
scaleImage(scale,scaleWidth,scaleHeight);
|
||||
::StretchDIBits(mPrinterDevice,0,0,scaleWidth,scaleHeight,0,0,pureBitmap.width(),pureBitmap.height(),(BYTE*)&bitmapBits[0],(BITMAPINFO*)bmInfo,DIB_RGB_COLORS,SRCCOPY);
|
||||
if(advancePage)endPage();
|
||||
if(bmInfo.bitCount()<=8)mPrinterDevice.select(purePalette.getPalette(),false);
|
||||
return true;
|
||||
}
|
||||
|
||||
void PrintManager::scaleImage(float factor,WORD &width,WORD &height)const
|
||||
{
|
||||
float aspectRatio=((float)width/(float)height)-.05;
|
||||
|
||||
factor/=100.00;
|
||||
width=(float)width*factor;
|
||||
height=(float)width/aspectRatio;
|
||||
}
|
||||
|
||||
bool PrintManager::printLines(Block<String> &strLines,Font &pageFont,Point xyPoint,bool advancePage)
|
||||
{
|
||||
Point startPoint(xyPoint);
|
||||
SIZE sizeData;
|
||||
|
||||
if(!isInDoc()||!mPrinterDevice.isOkay())return false;
|
||||
if(advancePage&&isInPage())endPage();
|
||||
if(!isInPage())startPage();
|
||||
mPrinterDevice.select((GDIObj)pageFont,true);
|
||||
for(int index=0;index<strLines.size();index++)
|
||||
{
|
||||
String &strLine=strLines[index];
|
||||
if(xyPoint.y()>mPrinterDevice.verticalResolution()+5){endPage();startPage();xyPoint=startPoint;}
|
||||
mPrinterDevice.getTextExtentPoint32(strLine,&sizeData);
|
||||
mPrinterDevice.textOut(xyPoint.x(),xyPoint.y(),strLine);
|
||||
xyPoint.y(xyPoint.y()+sizeData.cy+5);
|
||||
if(mAbortDlg.isOkay())
|
||||
{
|
||||
mAbortDlg->yieldTask();
|
||||
if(mAbortDlg->isCancelled()){abortDoc();return false;}
|
||||
}
|
||||
}
|
||||
endPage();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrintManager::createAbortDlg(void)
|
||||
{
|
||||
if(!mParentWindow.isOkay())return true;
|
||||
if(mAbortDlg.isOkay()){mAbortDlg->destroy();mAbortDlg.destroy();}
|
||||
mAbortDlg=::new AbortDlg;
|
||||
mAbortDlg.disposition(PointerDisposition::Delete);
|
||||
mAbortDlg->perform(*mParentWindow);
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL CALLBACK PrintManager::abortProc(HDC hDC,int nCode)
|
||||
{
|
||||
MSG msg;
|
||||
if(!nCode)return true;
|
||||
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
|
||||
{
|
||||
::TranslateMessage(&msg);
|
||||
::DispatchMessage(&msg);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user