キーボードの同時押し – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] キーボードの同時押し

固定ページ 2 / 3

LPO
 LPO
(@LPO)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

nさん ありがとうございます ちらつきで検索した結果
裏画面っていうのがあったのですが

一度OnPaintに描画させてそれをOnDrawに転送というやり方にしたいのですが
OnPaintにビットマップが描画できません 
例などがあれば教えてもらえないでしょうか


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

>裏画面っていうのがあったのですが
>例などがあれば

そのトピックが例にならないですか?


返信引用
LPO
 LPO
(@LPO)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

void CxxxView::OnPaint()
{
CPaintDC dc(this);
CxxxDoc* pDoc = GetDocument();

CBitmap bitmap1,bitmap2;
bitmap1.LoadBitmap(IDB_BITMAP1);
bitmap2.LoadBitmap(IDB_BITMAP2);
CDC MemDC1,MemDC2;
CBitmap*poldBitmap1 = MemDC1.SelectObject(&bitmap1);
CBitmap*poldBitmap2 = MemDC2.SelectObject(&bitmap2);

MemDC1.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC1.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);

MemDC1.SelectObject(poldBitmap1);
MemDC2.SelectObject(poldBitmap2);
}

void CxxxView::OnDraw(CDC* pDC)
{
CxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CDC MemDC1;
MemDC1.CreateCompatibleDC(pDC);
pDC->BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC1.SelectObject(poldBitmap1);
}

これを動かすと何も表示されずに描画されるのですが
Bitmap1は背景画像で Bitmap2は単体の画像です。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

期待通りに動作しないのは
OnPaint() では dc に何も描画していませんし、仮に
OnDraw() で何か描画できるとしても、
OnDraw() の MemDC1 にはあなたが描画したいビットマップを選択していない
からでしょう


返信引用
LPO
 LPO
(@LPO)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

OnPaintの
MemDC1.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC1.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);


dc.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
dc.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);

に書き換えてみたところ描画することができるのですがすごくちらつくのですが
どうすればメモリ上での描画ができるのでしょうか


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

今現在3つのDC

CPaintDC dc (実画面に対応)
CDC MemDC1 (ビットマップ1に対応 裏画面の一つ)
CDC MemDC2 (ビットマップ2に対応 裏画面の一つ)

があるようですが、実画面上でMemDC1とMemDC2の内容の混合を行っているために
その過程が見えてちらつくのです。

実画面と2つの裏画面との間にもう一つ裏画面を作り、そこで一度MemDC1とMemDC2の
内容の混合を済ませた後で、その内容を実画面に転送すればちらつきが無くなるはず
です。

※ちなみに裏画面DCには対応するビットマップを作成して選択しておく必要がありま
す。


返信引用
LPO
 LPO
(@LPO)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

MemDC3をなにもない(白紙のウインドウサイズ)裏画面用につくったとして
OnPaint()で

MemDC3.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC3.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);

とやり

OnDrawで
pDC->BitBlt(0,0,500,500,&MemDC3,0,0,SRCCOPY);

とすればいいのでしょうか


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>とすればいいのでしょうか
やってみればそれでいいかどうかすぐにわかると思いますが、どうですか?

そもそも、あなたがどのようにして再描画を促しているのかさえ不明なのですから
(適切な答えが欲しいのでしたら、あなたの状況が読む側に判る程度の内容を提示
する必要があると思いますけど、間違ってますか?)、ちらつく原因が特定できない
のであまり適切なことはお返事しかねます

それはそうと、 MFC + SDI で OnPaint() で描画するというのはあまり普通では
ないように思うのですけど、どうなんでしょうか(悪いといっているわけではありません)


返信引用
LPO
 LPO
(@LPO)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

すいません

void CxxxView::OnDraw(CDC* pDC)
{
CxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

SetTimer(1,10,NULL);
CDC MemDC3;
MemDC3.CreateCompatibleDC(pDC);
pDC->BitBlt(0,0,500,500,&MemDC3,0,0,SRCCOPY);
MemDC3.SelectObject(poldBitmap1);
}

void CxxxView::OnTimer(UINT nIDEvent)
{
Invalidate();
}

SetTimerを使い再描画をしています
やってみたところなにも描画されませんでした


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

あのー、OnPaint() と OnDarw() との関係についてどの程度ご理解なさっています
でしょうか

また、OnDraw() 内で SetTimer() する訳は何でしょうか
そして MemDC3 にビットマップを何も選択しないで BitBlt() するのは
何故なんでしょうか


返信引用
LPO
 LPO
(@LPO)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

OnPaint() と OnDarw() との関係って

OnPaint() が読み込まれてから
OnDarw() で描画じゃないですか


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

OnPaintはCWndクラスから継承されているメソッドですね。
すべてのウインドウはこのメソッドを持っています。
これに対してOnDrawは、この場合ならCViewクラスのメソッドです。
CViewはCWndから派生したクラスです。

CViewクラスのOnPaintの実装では、描画対象のCDCを取得し、
OnDrawを呼び出すということを行っているはずです。

LPOさんの実装では、CxxxViewクラス側でOnPaintのオーバーライドを
行っているので元のCView::OnPaintが呼び出されませんよね。
この辺が理解できないのであれば、C++言語の勉強をした方が良いと思います。
C++言語の知識なしでMFCを使ってもこういった部分が理解できないので
きちんと使いこなすことが出来ません。

CView系のOnDrawを持っているクラスで描画を行うのであれば、
OnPaintはオーバーライドせずにOnDrawに描画処理を実装するのが
MFCでは普通だと思いますよ。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

もっと言ってしまうと、
CxxxViewクラス側でOnPaintのオーバーライドを行っていると
CView::OnPaintが呼ばれないので内部で読んでいるはずのCView::OnDrawも
呼び出されません。
こうなってしまうと自分で明示的にOnDrawを呼び出さないと駄目です。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>OnPaint() が読み込まれてから
>OnDarw() で描画じゃないですか

良くお分かりのようですので、あなたが示されたコードのどこで CxxxView::OnDraw() を
呼び出しているのか教えて下さい(Invalidate() の結果というのは無しですよ)

私にはあなたの CxxxView::OnPaint() が CxxxView::OnDraw() を呼び出しているようには
読めませんでした(OnPaint() が読み込まれてという言い回しで何がいいたいのか判らない
ところが気になりますが...)


返信引用
LPO
 LPO
(@LPO)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

void CxxxView::OnDraw(CDC* pDC)
{
CxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

SetTimer(1,10,NULL);

CBitmap bitmap3,bitmap1,bitmap2;
bitmap1.LoadBitmap(IDB_BITMAP1);
bitmap2.LoadBitmap(IDB_BITMAP2);
bitmap3.LoadBitmap(IDB_BITMAP3);
CDC MemDC1,MemDC2,MemDC3;
MemDC1.SelectObject(&bitmap1);
MemDC2.SelectObject(&bitmap2);
MemDC3.SelectObject(&bitmap3);

MemDC3.BitBlt(0,0,500,500,&MemDC1,0,0,SRCCOPY);
MemDC3.BitBlt(pDoc->m_user1.x,pDoc->m_user1.y,48,48,&MemDC2,0,0,SRCCOPY);

pDC->BitBlt(0,0,500,500,&MemDC3,0,0,SRCCOPY);
}

MemDC3は裏画面の画像につかいました。
タイマーをつかったのはキーボードで画像を動かすためにつかいました。
こうすると動いたのですが描画するとちらつきがでてきます
何か対処策はありますか


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

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