Winapi SetROP2是否对打印机设备有效?

Winapi SetROP2是否对打印机设备有效?,winapi,mfc,gdi,Winapi,Mfc,Gdi,我用高亮显示的笔绘制/打印表格的每一行 CPen pen(PS_SOLID,nPenWidth,crPrint); CPen* pOldPen = pDC->SelectObject(&pen); pDC->SetROP2(R2_MASKPEN); pDC->MoveTo(rc.left+m_cxPrinter,y); pDC->LineTo(rc.right-m_cxPrinter,y); pDC->SelectObject(pOl

我用高亮显示的笔绘制/打印表格的每一行

CPen pen(PS_SOLID,nPenWidth,crPrint);
CPen* pOldPen = pDC->SelectObject(&pen);            
pDC->SetROP2(R2_MASKPEN);
pDC->MoveTo(rc.left+m_cxPrinter,y);
pDC->LineTo(rc.right-m_cxPrinter,y);
pDC->SelectObject(pOldPen);
我现在遇到的问题是,对于某些打印机,它覆盖了所有底层文本,因此看不到任何文本

“Microsoft打印到PDF”打印机也存在同样的问题

从备注:

绘图模式仅适用于光栅设备;它不适用于矢量设备。图形模式是二进制光栅操作代码,表示两个变量的所有可能的布尔组合,使用二进制运算符AND、OR和XOR(异或)以及一元运算NOT

我认为这不可能,因为pdf打印机不是矢量设备

--

编辑: 添加其他代码以对每个人进行测试:

void CTestPrintView::OnDraw(CDC* pDC)
{
    CTestPrintDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    int static c = 0;
    
    // Resourcen select
    CFont* pOldFont = (CFont*)pDC->SelectStockObject(DEVICE_DEFAULT_FONT);

    TEXTMETRIC tm;
    pDC->GetTextMetrics(&tm);
    int m_cxPrinter = tm.tmAveCharWidth;
    int m_cyPrinter = tm.tmHeight + tm.tmExternalLeading;


    ////////////////////
    // Print this
    //
    int x = 10;
    int y = 10;

    for (int i = 0; i < 10; i++)
    {
        CString str;
        str.Format(L"%d Hello, can you Print me? ", c++);
        pDC->TextOut(x, y += m_cyPrinter, str);

        if (i % 2)
            DrawLineColor(pDC, CRect(x, y - m_cyPrinter / 2, x + m_cxPrinter * 80, y + m_cyPrinter));
    }

    pDC->SelectObject(pOldFont);
}


void CTestPrintView::DrawLineColor(CDC* pDC, const CRect& rc)
{
    // Print Ok in Preview
    // Fails with some printers and with "Microsoft Print to PDF" printer

    long y = rc.top;
    int nPenWidth = rc.Height(); // / 2;
    CPen pen(PS_SOLID, nPenWidth, RGB(187, 255, 255));
    CPen* pOldPen = pDC->SelectObject(&pen);
    int nOldROP = pDC->SetROP2(R2_MASKPEN);
    pDC->MoveTo(rc.left, y);
    pDC->LineTo(rc.right, y);
    pDC->SetROP2(nOldROP);
    pDC->SelectObject(pOldPen);
}
void CTestPrintView::OnDraw(CDC*pDC)
{
CTestPrintDoc*pDoc=GetDocument();
断言有效(pDoc);
if(!pDoc)
返回;
int静态c=0;
//资源选择
CFont*pOldFont=(CFont*)pDC->选择StockObject(设备默认字体);
textmetricTM;
pDC->GetTextMetrics(&tm);
int m_cxPrinter=tm.tmAveCharWidth;
int m_cypinter=tm.tmHeight+tm.tmexternalreading;
////////////////////
//打印这个
//
int x=10;
int y=10;
对于(int i=0;i<10;i++)
{
CString-str;
str.Format(L“%d喂,你能打印我吗?”,c++);
pDC->TextOut(x,y+=m_-cyPrinter,str);
如果(i%2)
DrawLineColor(pDC,正确(x,y-m_-cyPrinter/2,x+m_-cxPrinter*80,y+m_-cyPrinter));
}
pDC->选择对象(pOldFont);
}
void CTestPrintView::DrawLineColor(CDC*pDC、const-CRect和rc)
{
//在预览中打印Ok
//某些打印机和“Microsoft打印到PDF”打印机出现故障
长y=rc.top;
int nPenWidth=rc.Height();///2;
CPen笔(PS_实心、nPenWidth、RGB(187、255、255));
CPen*pOldPen=pDC->SelectObject(&pen);
int nOldROP=pDC->SetROP2(R2_MASKPEN);
pDC->移动到(右向左,y);
pDC->LineTo(右,y);
pDC->SetROP2(NOLDOP);
pDC->选择对象(pOldPen);
}

GetDeviceCaps
带有索引的
技术
应能为您提供分类为光栅设备的信息。如果有坚实的背景,也可以删除光栅操作。只需将最终颜色计算为
final\u color=pen\u color&background\u color
(我认为这对于
R2\u MASKPEN
)并在
CPen
构造函数中使用此值。
GetDeviceCaps
为“Microsoft打印到PDF”提供正确的信息
DT\u RASPRINTER
。我所看到的是,PrintPreview总是用SetRop2显示正确的内容,Print覆盖了底层文本。我的经验是,如果你开始将所有内容都绘制到内存DC中,然后从那里简单地复制到打印机,结果会更可靠。是的,我也在内存DC中尝试过这一点,并获得了相同的结果。我将添加代码,这样每个人都可以测试这个问题。
GetDeviceCaps
带有索引的
技术
应该会提供您关于它是否被归类为光栅设备的信息。如果有坚实的背景,也可以删除光栅操作。只需将最终颜色计算为
final\u color=pen\u color&background\u color
(我认为这对于
R2\u MASKPEN
)并在
CPen
构造函数中使用此值。
GetDeviceCaps
为“Microsoft打印到PDF”提供正确的信息
DT\u RASPRINTER
。我所看到的是,PrintPreview总是用SetRop2显示正确的内容,Print覆盖了底层文本。我的经验是,如果你开始将所有内容都绘制到内存DC中,然后从那里简单地复制到打印机,结果会更可靠。是的,我也在内存DC中尝试过这一点,并获得了相同的结果。我将添加代码,这样每个人都可以测试这个问题。