none
CDC::SetROP2(R2_XORPEN)のCDC::GrayString()に与える影響について RRS feed

  • 質問

  • いつもお世話になっております。

    VS2015U3で作業しています。


    連投、誠に申し訳ございません。

    表題の件ですが、GrayStringはCBrushを設定しますが、消えないのはR2_XORPENの仕様でしょうか?
    (同時に描画する線や円は消えます)

    ソースは以下のようにしています。

    CDC*  pDC = GetDC();
    CBrush grayBrush(GetSysColor(COLOR_GRAYTEXT));
    CBrush* pOldBrush = pDC->SelectObject(&grayBrush);
    
    int oldDrawMode = pDC->SetROP2(R2_XORPEN);
    
    pDC->GrayString(&grayBrush, NULL, (LPARAM)(std::to_string(0).c_str()), 0, xs, ys, 0, 0);
    
    pDC->SetROP2(oldDrawMode);
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldBrush);
    ReleaseDC(pDC);

    そもそもの間違いが多々あろうかと存じます。
    お忙しいところ恐縮ですが、何卒ご教示の程、宜しくお願いいたします。
    2018年12月6日 1:44

回答

  • 経験上、いわゆるテキスト描画系関数は、バイナリラスターオペレーションに対応していないと記憶しています。
    (ちょっと探してみたのですが、公式のドキュメントは見つかりませんでした)
    従って、テキスト出力を一旦別の描画要素にしてから出力することになろうかと思います。
    すぐに思いつくのは、テキストを一旦、

    (A)ビットマップに描画
    (B)パスに描画

    等を行ってから、ラスターオペレーションの効いたDCにそれらを再出力するということですね。
    2018年12月6日 2:15
  • >"出す消える"の近道は、その2通りでしょうか。

    最近の描画は非常に早いので、ラスターオペレーションを使わない、
    単純な全書き換えでもあまりバタつくことは無いかもしれません。
    この場合、再描画は必要最小限の矩形を指定します。

    (1)移動物体等の再描画が必要な矩形(RcInv)を算定する。
    (2)InvalidateRect( RcInv, TRUE);する
    (3)UpdateWindow();する => WM_PAINTが発行される。=>全て再描画が実行される。
      この時移動物体等は描画しない。
    (4)移動物体を移動後の位置に描画する。

    てな感じ。
    もちろん、XORラスターオペレーションの方が早いのですが、
    その場合以下の件について注意が必要になります。

    (a)移動物体の「色」の表現は完全には無理。
    (b)移動中にアプリがインアクティブになった場合の考慮が必要。

    などですかね。
    メモリーDC等を背景バッファにするとさらに高速にできるので、GDIの場合はそうしてますです。
    2018年12月6日 5:37

すべての返信

  • 経験上、いわゆるテキスト描画系関数は、バイナリラスターオペレーションに対応していないと記憶しています。
    (ちょっと探してみたのですが、公式のドキュメントは見つかりませんでした)
    従って、テキスト出力を一旦別の描画要素にしてから出力することになろうかと思います。
    すぐに思いつくのは、テキストを一旦、

    (A)ビットマップに描画
    (B)パスに描画

    等を行ってから、ラスターオペレーションの効いたDCにそれらを再出力するということですね。
    2018年12月6日 2:15
  • 仲澤@失業者 様

    早速のレス、ありがとうございます。
    未解決中の連投にも関わらずご対応いただき、誠にありがとうございます。


    テキスト系はROP非対応とのこと。やはりです。
    しょうがないですね。

    確かに。"出す消える"の近道は、その2通りでしょうか。
    仕様再検討し、やってみます。


    ご多忙の中、恐縮です。ご教示ありがとうございました。
    2018年12月6日 4:16
  • >"出す消える"の近道は、その2通りでしょうか。

    最近の描画は非常に早いので、ラスターオペレーションを使わない、
    単純な全書き換えでもあまりバタつくことは無いかもしれません。
    この場合、再描画は必要最小限の矩形を指定します。

    (1)移動物体等の再描画が必要な矩形(RcInv)を算定する。
    (2)InvalidateRect( RcInv, TRUE);する
    (3)UpdateWindow();する => WM_PAINTが発行される。=>全て再描画が実行される。
      この時移動物体等は描画しない。
    (4)移動物体を移動後の位置に描画する。

    てな感じ。
    もちろん、XORラスターオペレーションの方が早いのですが、
    その場合以下の件について注意が必要になります。

    (a)移動物体の「色」の表現は完全には無理。
    (b)移動中にアプリがインアクティブになった場合の考慮が必要。

    などですかね。
    メモリーDC等を背景バッファにするとさらに高速にできるので、GDIの場合はそうしてますです。
    2018年12月6日 5:37
  • 仲澤@失業者 様

    レス、ありがとうございます。


    手順のご説明、大変分かりやすく、ありがとうございました。
    参考にさせていただきます。

    memDCの方向かな~と考えています。
    ありがとうございました。
    2018年12月6日 8:11