KotlinとSwiftとVC++(MFC)のアナログ時計で同じのPNG画像を組込む:MFCでの覚えメモ-5 ー 再描画のチラチラ対策
こんにちは、川上です。
Kotlin・Swift・VC++(MFC)で作っていたアナログ時計アプリの開発メモは、「Kotlinって、何?」から始めたアナログ時計開発メモ向けのブログは26回目となりました。
MFCの件でこの件は一応終わりですので、アナログ時計開発メモブログは、今回で最終回となります。(スバラシイ!)👏👏
ー・ー
CTimerを動かして、1秒毎に再描画をして、時計針画像を回転して、アナログ時計をチクタク、チクタク・・・・。
1 2 3 4 5 6 7 8 9 | 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の作動処理は、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | //ビットマップ画像の透過色 #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アナログ時計
での動作感じです。
ではでは。( ^_^)/~~~