大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

KotlinとSwiftとVC++(MFC)のアナログ時計で同じのPNG画像を組込む:MFCでの覚えメモ-5 ー 再描画のチラチラ対策

著者:川上洋
公開日:2019/09/13
最終更新日:2019/09/13
カテゴリー:技術情報 雑記

こんにちは、川上です。

Kotlin・Swift・VC++(MFC)で作っていたアナログ時計アプリの開発メモは、「Kotlinって、何?」から始めたアナログ時計開発メモ向けのブログは26回目となりました。
MFCの件でこの件は一応終わりですので、アナログ時計開発メモブログは、今回で最終回となります。(スバラシイ!)👏👏

ー・ー
CTimerを動かして、1秒毎に再描画をして、時計針画像を回転して、アナログ時計をチクタク、チクタク・・・・。

void CClockWin2View::OnInitialUpdate()
{
    CView::OnInitialUpdate();
 
    ・・・ CImageのPNG画像設定の初期化・・・
  
    // 1秒Timer設定
    CWnd::SetTimer(1, 1000, NULL);
}

して、
OnTimer から 
Invalidate()  
  ⬇︎ 
OnDraw(CDC* pDC) 
で、当初、再描画処理していましたが
PlgBlt()の回転処理との絡み(?)でチラチラとるので、もう一工夫が必要でした。

OnDraw(CDC* pDC) での再描画をやめて、OnTimer内での再描画としました。
ここでも”ダブル・バッファ”の使用で、背景画像のチカチカの対策となりました。

結局、1秒毎のTimerの作動処理は、

//ビットマップ画像の透過色
#define TRANSPARENT_COLOR RGB(0,0,0)
void CClockWin2View::OnTimer(UINT_PTR nIDEvent)
{
    // -- 描画処理でダブルバッファリングを行う方法
    // 実デバイスコンテキスト
    CDC* pDC = this->GetDC();

    // 仮想デバイスコンテキスト
    CDC memDC;
    // 仮想デバイスコンテキスト用ビットマップ
    CBitmap memBmp;
    // 矩形
    CRect rc;
    // 矩形の取得
    this->GetClientRect(rc);
    // 仮想デバイスコンテキストの生成
    memDC.CreateCompatibleDC(pDC);
    COLORREF oldBkColor = SetBkColor(memDC, TRANSPARENT_COLOR);
    // 仮想デバイスコンテキスト用ビットマップの生成
    memBmp.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
    // 仮想デバイスコンテキストにビットマップの割り当て
    memDC.SelectObject(&memBmp);
   
   // ===== アナログ時計再描画 ====
   // -- 背景画像の表示
    OnDrawPng3(&memDC);
    // -- 時計時間Txtの表示
    OnDrawClockText(&memDC);
    // -- 時計針の表示
    OnDrawPngHari(&memDC);
    // ===========================  

   // 仮想デバイスコンテキストを実デバイスコンテキストに貼り付け
    pDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);
    // 破棄
    ::DeleteObject(memDC);
    ::DeleteObject(memBmp);
    this->ReleaseDC(pDC);
    
    CView::OnTimer(nIDEvent);
}

となりました。

でもって、
MFCアナログ時計
での動作感じです。

ではでは。( ^_^)/~~~

    上に戻る