Initial
This commit is contained in:
147
test/Printman.cpp
Normal file
147
test/Printman.cpp
Normal file
@@ -0,0 +1,147 @@
|
||||
#include <test/printman.hpp>
|
||||
#include <test/abortdlg.hpp>
|
||||
#include <common/regkey.hpp>
|
||||
#include <common/guiwnd.hpp>
|
||||
|
||||
Block<VInfo> PrintManager::smVInfoBlock;
|
||||
|
||||
BOOL PrintManager::getPrinters(void)
|
||||
{
|
||||
String strPrinterKey("System\\CurrentControlSet\\Control\\Print\\Printers");
|
||||
String strDefaultPrinter;
|
||||
RegKey cfgKey(RegKey::CurrentConfig);
|
||||
Printer printer;
|
||||
String strPrinter;
|
||||
int enumKey(0);
|
||||
|
||||
mPrinters.remove();
|
||||
if(!cfgKey.openKey(strPrinterKey))return FALSE;
|
||||
cfgKey.queryValue("Default",strDefaultPrinter);
|
||||
if(getPrinter(strPrinterKey+String("\\")+strDefaultPrinter,printer))mDefaultPrinter=printer;
|
||||
while(TRUE)
|
||||
{
|
||||
if(!cfgKey.enumKey(enumKey++,strPrinter))break;
|
||||
if(getPrinter(strPrinterKey+String("\\")+strPrinter,printer))mPrinters.insert(&printer);
|
||||
}
|
||||
cfgKey.closeKey();
|
||||
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 String &strPrinterName,GUIWindow &parentWindow,const String &strPrintDocName)
|
||||
{
|
||||
mParentWindow=&parentWindow;
|
||||
return openPrinter(strPrinterName,strPrintDocName);
|
||||
}
|
||||
|
||||
BOOL PrintManager::openPrinter(const String &strPrinterName,const String &strPrintDocName)
|
||||
{
|
||||
Printer printer;
|
||||
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;
|
||||
mPrinterDevice=::CreateDC(0,printer.driverName(),0,0);
|
||||
mPrinterDevice.disposition(PureDevice::DeleteDC);
|
||||
if(!mPrinterDevice.isOkay())return FALSE;
|
||||
smVInfoBlock.insert(&VInfo((DWORD)this,mPrinterDevice));
|
||||
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::printLines(Block<String> &strLines,Font &pageFont,Point xyPoint)
|
||||
{
|
||||
SIZE sizeData;
|
||||
|
||||
if(!isInDoc()||!mPrinterDevice.isOkay())return FALSE;
|
||||
if(isInPage())endPage();
|
||||
startPage();
|
||||
mPrinterDevice.select((GDIObj)pageFont,TRUE);
|
||||
for(int index=0;index<strLines.size();index++)
|
||||
{
|
||||
String &strLine=strLines[index];
|
||||
mPrinterDevice.getTextExtentPoint32(strLine,&sizeData);
|
||||
mPrinterDevice.textOut(xyPoint.x(),xyPoint.y(),strLine);
|
||||
xyPoint.y(xyPoint.y()+sizeData.cy+5);
|
||||
}
|
||||
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)
|
||||
{
|
||||
SmartPointer<PrintManager> printManager;
|
||||
MSG msg;
|
||||
|
||||
if(smVInfoBlock.size())for(int index=0;index<smVInfoBlock.size();index++)
|
||||
if(smVInfoBlock[index].hDC()==hDC)
|
||||
{printManager=(PrintManager*)smVInfoBlock[index].baseAddress();break;}
|
||||
if(!printManager.isOkay())
|
||||
{
|
||||
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
|
||||
{
|
||||
::TranslateMessage(&msg);
|
||||
::DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while(printManager->mAbortDlg.isOkay()&&!printManager->mAbortDlg->isDestroyed())
|
||||
{
|
||||
printManager->mAbortDlg->yieldTask();
|
||||
if(printManager->mAbortDlg->isCancelled())return FALSE;
|
||||
}
|
||||
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
|
||||
{
|
||||
::TranslateMessage(&msg);
|
||||
::DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user