掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
画面の描画ちらつきが解消できない (ID:148295)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>>yosiki 2011-09-03 21:36:41 No: 72900 >>裏画像を使用したダブルバッファリング処理に >>しましたが、今度は何も表示されなくなってしまいました。。 >>//ダブルバッファリング処理(仮画像→表示画像 へ転送処理) >>BitBlt(pDC->GetSafeHdc(), 0, 0, myRECT.Width(), myRECT.Height(), pDC->GetSafeHdc(), 0, 0, SRCCOPY); (1)根本的な記述ミスです。 BitBltの転送元と転送先のデバイスコンテキストのハンドルが同じでは何も表示できないでしょう。 スケッチブックの2ページ目から2ページ目にコピーしてっと、1ページ目に書いたイメージがコピーされないって言ってるようなもん。 二つ目の pDC->GetSafeHdc() を myPictDC.GetSafeHdc() の様に myPictDC を指定するべきでは? (2)何故 BitBlt 関数を使いデバイスコンテキストのハンドルを渡しているのでしょうか? CDialogクラスを継承したクラスの関数内では単に BitBlt を使うと C++の文法上 ::BitBlt というように :: を付けたの同然、グローバル領域のWin32APIを直接呼び出している事になる。 MFC を使っている意味が無くなってしまう。CDC クラスを継承したオブジェクト内なら意味というかメリットが有るけれど。 MFCにはデバイスコンテキストクラスがあり、CDialogクラスを継承したクラス(Cfullcolor_illumiDlg)オブジェクトの中のOnPaint関数から、 CDCクラスやCPaintDC又は、CClientDC クラスのオブジェクトのインスタンスを使って例えば CPaintDC pdc (this); pdc.BitBlt (0, 0, myRECT.Width(), myRECT.Height(), &myPictDC, 0, 0, SRCCOPY); としなきゃいけない。デバイスコンテキストのハンドルが CDC クラスなどでラッパーされているので、ハンドルを指定しなくて済む。 私が以前用いたメモリデバイスコンテキストは以下のようなもの(2004年頃から長らく使っていた) void Cxx_xx::OnPaint () { // クライアントウインドウの領域(位置及び大きさ)を取得します CRect rcClientWnd; GetClientRect (&rcClientWnd); if (!rcClientWnd.Width () || !rcClientWnd.Height ()) { // (水平又は垂直方向の大きさが 0 である) -- メモリデバイスコンテキストに割り当てるビットマップ領域の作成やイメージの転写などでビットマップ領域が無ければ意味がないので終了します return; } // デバイスコンテキストの属性と同じメモリデバイスコンテキストを作ります CPaintDC pdc (this); CDC pMemDC; if (pMemDC.CreateCompatibleDC (&pdc)) { // (作成に成功) -- メモリデバイスコンテキスト用のビットマップ領域を確保します CBitmap pMemBmp; if (pMemBmp.CreateBitmap (rcClientWnd.Width (), rcClientWnd.Height ())) { // (作成に成功) -- メモリデバイスコンテキストにビットマップ領域をマップ(割り当てとも云う?) CBitmap* pOrgBmp = pMemDC.SelectObject (&pMemBmp); // ここからメモリデバイスコンテキストにイメージを書込みます int nOrgBkMode = pMemDC.SetBkMode (TRANSPARENT); // 透過モードに切り換えます(文字の背景や幾何学図形の描画に影響する) COLORREF crOrgText = pMemDC.SetTextColor (RGB (0xFF, 0x00, 0x00)); // 赤色に切り換えます // 背景を塗り潰しします。 /* Description: ダイアログの背景を塗り潰す色を取得して用いるか、使用したい背景の色を予め ウインドウクラス(MFCのではなくWindowシステム上のウインドウを作る上で定 義するWNDCLASSとかいうもの)のhbBackgndだったかな綴り忘れた…。)を 変更する。 そしてOnBackgrndErase をオーバーライドして単にreturn (TRUE)する等色々しな ければならない。 */ COLORREF crBkgrnd = RGB (0xFF, 0xFF, 0xFF); // 白色の (赤色にしたい場合 RGB (0xFF, 0x00, 0x00) の様にします) CBrush pBrush (); // ブラシオブジェクトを作成します pMemDC.FillRect (&rcCleintWnd, &pBrush); // テキストを書込みます CString pstrTextMessage; #ifdef UNICODE pstrTextMessage = L"abc 0123"; // (UNICODEの場合) #else pstrTextMessage = _T ("abc 0123"); // (非UNICODEの場合) #endif /* end of #ifdef UNICODE */ pMemDC.TextOut (0, 0, pstrTextMessage); // テキストを左上隅に出力します pMemDC.SetTextColor (crOrgText); // オリジナルに戻します pMemDC.SetBkMode (nOrgBkMode); // オリジナルに戻します // 本家本元のデバイスコンテキストにイメージを転写します pdc.StretchBlt ( 0, 0, rcClientWnd.Width (), rcClientWnd.Height (), &pMemDC, 0, 0, rcClientWnd.Width (), rcClientWnd.Height (), SRCCOPY ); // メモリデバイスコンテキストのビットマップ領域をオリジナルに戻します pMemDC.SelectObject (pOrgBmp); // 用済みビットマップ領域を開放します pMemBmp.DeleteObject (); } // メモリデバイスコンテキストも開放します pMemDC.DeleteDC (); } }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.