#include #include #include #include #include #include #include #include #include #include #include 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 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 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 &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;indexmPrinterDevice.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; }