WIN32 Print


HDC GetPrinterDC()
{
    PRINTDLG prtDlg;
    ZeroMemory( & prtDlg, sizeof( PRINTDLG ));
    prtDlg.lStructSize = sizeof( PRINTDLG );
    prtDlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC;

    ::PrintDlg( & prtDlg );
    
    return prtDlg.hDC;
}

void InitDocinfo( DOCINFO * pDi, LPCTSTR lpDocName )
{
    ZeroMemory( pDi, sizeof( DOCINFO ));
    pDi->cbSize = sizeof( DOCINFO );
    pDi->lpszDocName = lpDocName;
}

DWORD WINAPI StartPrint( LPVOID lpVoid )
{
    CDDRWindow * pWnd = ( CDDRWindow * ) lpVoid;
    while( TRUE )
    {
        EnterCriticalSection( &( pWnd->m_crtical ));
        if( pWnd->m_bIsRuning )
        {
            while( ! ( pWnd->m_prtLst.IsEmpty()))
            {
                HDC hDC = GetPrinterDC();   // Get Printer DC
                if( hDC != NULL )
                {
                    DOCINFO di;
                    InitDocinfo( & di, _T("Palette Doc"));
                    StartDoc( hDC, &di );
                    StartPage( hDC );
                    pWnd->m_prtLst.GetHead()->Print( hDC ); // Print First in List

                    EndPage( hDC );
                    EndDoc( hDC );

                    DeleteDC( hDC );
                }
                pWnd->m_prtLst.RemoveHead();
            }
        }
        else
        {
            LeaveCriticalSection( &( pWnd->m_crtical ));
            return 0;
        }
        LeaveCriticalSection( &( pWnd->m_crtical ));
        Sleep( 100 );
    }
    return 0;
}

 
CMovingPane::Print( HDC hdc )
{
    HDC hdcSurface;
    
    int pwidth = GetDeviceCaps( hdc, HORZRES );
    int pheight = GetDeviceCaps( hdc, VERTRES );
    int width = pwidth;
    int height = pheight;

    if( width >= 600 )
        width -= 400;
    if( height >= 600 )
        height -= 400;

    float blS = ( float ) (( float ) m_Surface.GetWidth() / ( float ) m_Surface.GetHeight());

    int cx, cy;

    cx = width;
    cy = ( int ) (( float ) width / blS );

    if( cy >= height )
    {
        cy = height;
        cx = ( int ) ( height * blS );
    }

    int x = (( pwidth - cx ) / 2 );
    int y = (( pheight -  cy ) / 2 );

    if( m_Surface.GetDirectSurface()->GetDC( & hdcSurface ) == DD_OK )
    {
        StretchBlt( hdc, x, y, cx, cy, hdcSurface, 0, 0, m_Surface.GetWidth(), m_Surface.GetHeight(), SRCCOPY );
        m_Surface.GetDirectSurface()->ReleaseDC( hdcSurface );
    }
}
### 关于 `win32print` 的技术信息和使用方法 `win32print` 是 Python 中用于与 Windows 打印系统交互的模块,属于 `pywin32` 库的一部分。通过该模块,开发者可以实现对打印机的状态查询、作业管理以及打印任务的创建等功能[^4]。以下是关于 `win32print` 的一些关键点及其使用示例: #### 1. 安装 `pywin32` 库 在使用 `win32print` 模块之前,需要确保已安装 `pywin32` 库。可以通过以下命令进行安装: ```bash pip install pywin32 ``` #### 2. 查询可用打印机列表 `win32print` 提供了 `EnumPrinters` 函数,用于枚举系统中的所有打印机。以下是一个简单的代码示例,展示如何列出所有可用的打印机: ```python import win32print # 获取所有本地及网络打印机 printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS) for printer in printers: print(printer[2]) # 打印机名称 ``` #### 3. 设置默认打印机 可以使用 `SetDefaultPrinter` 函数设置系统的默认打印机: ```python import win32print # 设置默认打印机为 "My Printer" win32print.SetDefaultPrinter("My Printer") ``` #### 4. 创建打印作业 `win32print` 提供了创建打印作业的功能,通过 `StartDocPrinter` 和 `StartPagePrinter` 等函数可以实现打印任务的创建。以下是一个简单的打印文本文件的示例: ```python import win32print import win32ui def print_text_file(filename, printer_name=None): if not printer_name: printer_name = win32print.GetDefaultPrinter() # 打开打印机 printer_handle = win32print.OpenPrinter(printer_name) job_id = win32print.StartDocPrinter(printer_handle, 1, ("Print Job", None, "RAW")) win32print.StartPagePrinter(printer_handle) # 读取文件内容并发送到打印机 with open(filename, 'r') as file: content = file.read() win32print.WritePrinter(printer_handle, content.encode('utf-8')) # 结束打印页和文档 win32print.EndPagePrinter(printer_handle) win32print.EndDocPrinter(printer_handle) win32print.ClosePrinter(printer_handle) # 示例:打印文件 "example.txt" print_text_file("example.txt") ``` #### 5. 查询打印机状态 可以使用 `GetPrinter` 函数获取打印机的详细信息,包括状态、错误代码等: ```python import win32print printer_name = win32print.GetDefaultPrinter() printer_handle = win32print.OpenPrinter(printer_name) printer_info = win32print.GetPrinter(printer_handle, 2) # 获取详细信息 print(f"Printer Name: {printer_info['pPrinterName']}") print(f"Status: {printer_info['Status']}") # 状态码 print(f"Error Code: {printer_info['LastError']}") ``` #### 注意事项 - 在使用 `win32print` 时,需确保运行环境为 Windows 系统。 - 部分功能可能需要管理员权限才能正常执行。 - 打印任务的具体实现可能因打印机驱动程序的不同而有所差异。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

示申○言舌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值