SetROP2を使用時、正常な色で描画されない – プログラミング – Home

SetROP2を使用時、正常な色で描画...
 
通知
すべてクリア

SetROP2を使用時、正常な色で描画されない


じゃこ
 じゃこ
(@じゃこ)
ゲスト
結合: 17年前
投稿: 13
Topic starter  

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

WinXP SP2
V6.0 MFC 使用です。

下記のように、SetROP2を使って、CViewに要素を書き、また削除するという事を
繰り返して処理しています。(ラバーバンドのような処理です)
正常に書いて、消してを繰り返しますが、指定した色で描画してくれません。
下記のソースだと白色になるはずですが、何故かうす暗い赤色で描画されます。

SetROP2に渡すパラメータが悪いのか、OnEraseBkgndが悪いのでしょうか?
SetROP2に渡すパラメータはヘルプを読んでも、初心者の私には理解に苦しんで
います。
(色々なモードを試してみましたが同様です)

よくサンプルで、CreateCompatibleDCを使用したソースをよく見ます。
それをしていないのが悪いのでしょうか?

すいませんが、お知恵を借りたいと思います。
よろしくお願いします。

BOOL CMyClassView::TempDraw()
{
INT nTempColor[3];
nTempColor[0] = nTempColor[1] = nTempColor[2] = 0;

CDC *pDC = GetDC ();
if (pDC != NULL) {
// DC をR2_NOTモードに変更
INT iBeforDrawMode = pDC->SetROP2 (R2_NOT);

// 描画
TempDraw2 (pDC, nTempColor, PS_SOLID, 1);

// DC をR2_NOTモードから元に戻す
pDC->SetROP2 (iBeforDrawMode);
int iRet = ReleaseDC(pDC);
}

return (TRUE);
}

BOOL CMyClassView::TempDraw2(CDC* pDC, INT nWriteColor[3],
INT nWritePenStyle, INT nWritePenWide)
{
LOGBRUSH LogBrush;

// 初期化
ZeroMemory( &LogBrush, sizeof(LogBrush) );
LogBrush.lbStyle = BS_SOLID;

// ペンの作成
LogBrush.lbColor = RGB(nWriteColor[0],
nWriteColor[1],
nWriteColor[2]);
hPenElem = ExtCreatePen (PS_GEOMETRIC | nWritePenStyle,
nWritePenWide, &LogBrush, 0, NULL );
OldPen = SelectObject( pDC->m_hDC, hPenElem );
// ブラシの作成
hBrush = CreateSolidBrush( RGB(nWriteColor[0],
nWriteColor[1],
nWriteColor[2]) );
OldBrush = SelectObject( pDC->m_hDC, hBrush );

// ここで描画
MoveToEx(pDC->m_hDC, p1.x, p1.y, NULL );
LineTo (pDC->m_hDC, p2.x, p2.y );

// ペンの破棄
SelectObject( pDC->m_hDC, OldPen );
DeleteObject( hPenElem );
// ブラシの破棄
SelectObject( pDC->m_hDC, OldBrush );
DeleteObject( hBrush );

return (TRUE);
}

BOOL CMyClassView::OnEraseBkgnd(CDC* pDC)
{
CBrush newBrush;
newBrush.CreateSolidBrush(RGB(m_nBackGoundColor[0],
m_nBackGoundColor[1],
m_nBackGoundColor[2] ));
// 変更する背景色のブラシを作成
HBRUSH hOldBrush = (HBRUSH)SetClassLong(GetSafeHwnd(),
GCL_HBRBACKGROUND,
(LONG)(HBRUSH)newBrush.m_hObject);
// 現在の背景色のブラシを変更
BOOL bRet = CWnd::OnEraseBkgnd(pDC);
SetClassLong(GetSafeHwnd(),GCL_HBRBACKGROUND,(LONG)hOldBrush);

return bRet;

// return CView::OnEraseBkgnd(pDC);
}


引用解決済
トピックタグ
らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
 

>下記のソースだと白色になるはずですが、何故かうす暗い赤色で描画されます。

R2_NOT は ペンの色に関係なく、画面の色を反転させるんじゃなかったかしら。
画面の色が白のときは黒、画面が黒のときは白なので、画面の色によってはうす暗い赤色のこと
もあるのでは?

という意味ではなくてですか?違ったらすみません。


返信引用
じゃこ
 じゃこ
(@じゃこ)
ゲスト
結合: 17年前
投稿: 13
Topic starter  

ららさん
いえ、そうです。投稿してからも色々と試してみましたが、そのようです。
と言う事は、画面のバックグラウンドの色に関わらず、白で描画し、その後で削除
したい場合はどのモードを使えば良いのでしょうか?
本当に初歩的な問題で申し訳ありませんが、ご指示をお願いします。


返信引用
らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
 

SetROP2を使ってそういうことできなかったような・・・。
たとえばドラッグでしたら、MouseMoveのたびにその範囲を再描画する感じでしょうか。
ちらつくようなら、OnDraw()のパラメータのDCに直接描かず、一旦、(CDCとCBitmapを作っ
て)メモリ上に描画してから、BitBltでパラメータのDCに貼り付ける方がいいと思います。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

まず、背景色のR2_XORPENで描画(これで背景部分が黒になる)
次に、描画色のR2_XORPENで描画
という2回描く方法があります。


返信引用
じゃこ
 じゃこ
(@じゃこ)
ゲスト
結合: 17年前
投稿: 13
Topic starter  

Kerryさん、ありがとうございます。
やってみます。


返信引用
じゃこ
 じゃこ
(@じゃこ)
ゲスト
結合: 17年前
投稿: 13
Topic starter  

Kerryさん、ありがとうございました。
正常に描画と削除が出来るようになりました。
ただ新たな問題が・・・。
連続線などを描画する際に、線と線の交点部分が表示されません。
(当然と言えば、当然なのかもしれませんが)
これはもうどうしようも無いのでしょうか?
お知恵をお願い致します。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

一度メモリDC等に描画し、そのビットマップをXORで転送する、
みたいな方法しかないでしょうねぇ。


返信引用
じゃこ
 じゃこ
(@じゃこ)
ゲスト
結合: 17年前
投稿: 13
Topic starter  

Kerryさん、ありがとうございます。
一度メモリDC等に描画し、そのビットマップをXORで転送する方法を試してみます。


返信引用
じゃこ
 じゃこ
(@じゃこ)
ゲスト
結合: 17年前
投稿: 13
Topic starter  

すっかり遅くなり申し訳ありません。
一度メモリDC等に描画し(バックグラウンドの色は本来の画面の色で作成)、そのビット
マップを転送する方法を試してみようと思っているのですが、その方法が良く分かりません。

BitBltを使って転送しようとしましたが、ラスタ オペレーションにSRCCOPYを指定すると
作成したビットマップによって上書きされ、SRCINVERTを指定すると元々の要素の色まで
変色されます。
SRCPAINTだと変色された色でビットマップが描画されます。

TransparentBltだと透過の処理が出来ましたが、ラスターオペレーションの指定がないの
で、ビットマップの部分のみ描画・消去する事が出来ません。

BitBltを使った透過の処理が必要なのでしょうか?
申し訳ありませんが、ご回答をお願い致します。


返信引用
yoh2
 yoh2
(@yoh2)
ゲスト
結合: 18年前
投稿: 70
 

> バックグラウンドの色は本来の画面の色で作成

ここがおかしいのでしょう。

> まず、背景色のR2_XORPENで描画(これで背景部分が黒になる)
> 次に、描画色のR2_XORPENで描画

と同じ方法で描画したいなら、

1. 黒背景に、背景色で描画したビットマップをSRCINVERTでBitBlt。
2. 黒背景に、描画色で描画したビットマップをSRCINVERTでBitBlt。

ではないかと。

でも、メモリDCを併用した反転処理ができる程メモリ&ビットマップ転送速度に余裕があるのなら、

1. 描画前に、元のビットマップをメモリDCに退避。
2. ペンモードはR2_COPYPENのまま描画色で要素を描画。

として、要素を削除する場合は退避したビットマップを書き戻す、というのが一番素直かも。
背景色以外の部分の色がKerryさんの方法と異なり、問答無用で描画色で上書きされますが、ひとつ目の書
き込みを読む限り、xorがかかった図形が描画されるよりも目的に適っているような気が。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました