質問: 画面がチカチカする win32apiでタイマーを作成しましたが 時間は正しく表示されましたが画面がチカチカしてしまいます これを防止するにはどうすればよろしいのでしょうか? よろしくお願いします
回答: #include /* このファイルで使用する定数 */ #define case break;case #define default break;default # #define max_width (500) // 画面の横サイズ #define max_height (300) // 画面の縦サイズ #define tid_clock (9868) // タイマーid #define tid_cycle (10) // タイマー間隔 //ウィンドウプロシージャ lresult callback wndproc( hwnd hwnd, uint msg, wparam wp, lparam lp ) { static hfont hfont; // フォント static hdc hmemdc; // メモリデバイスコンテキスト static hbitmap hmembmp; // ビットマップ switch ( msg ){ case wm_create: { hdc hdc; if ( (hdc = getdc(hwnd)) != null ){ // メモリデバイスコンテキストを作成 hmemdc = createcompatibledc( hdc ); hmembmp = createcompatiblebitmap( hdc, max_width, max_height ); selectobject( hmemdc, hmembmp ); // メモリデバイスコンテキストの背景を真っ白に描画 selectobject( hmemdc, getstockobject(null_pen) ); selectobject( hmemdc, createsolidbrush(rgb(0xff,0xff,0xff)) ); rectangle( hmemdc, 0, 0, max_width, max_height ); deleteobject( selectobject(hmemdc,getstockobject(white_brush)) ); // 解放 releasedc( hwnd, hdc ); } hfont = create( 23, shiftjis_charset, text("hgs明朝e") ); settimer( hwnd, tid_clock, tid_cycle, null ); } case wm_close: { lpctstr lptitle = text("確認"); lpctstr lptext = text("終了してもよろしいですか"); uint ustyle = (mb_yesno | mb_iconquestion); if ( messagebox(hwnd,lptext,lptitle,ustyle) == idyes ){ if ( !killtimer(hwnd,tid_clock) ){ messagebox( hwnd, text("killtimerエラー"), text("エラー"), mb_ok | mb_iconquestion ); } destroywindow( hwnd ); } } case wm_destroy: deleteobject( hfont ); deleteobject( hmembmp ); deletedc( hmemdc ); postquitmessage( 0 ); case wm_timer: { static lpctstr lpstring1 = text("プログラム開始時刻/または更新時刻は"); static lpctstr lpstring2 = text("でした左クリックで更新"); tchar szbuff[ 256 ]; systemtime st; // 時間取得と文字列作成 getlocaltime( &st ); wsprintf( szbuff, text("%02d:%02d:%02d.%03d"), st.whour, st.wminute, st.wsecond, st.wmilliseconds ); // メモリデバイスコンテキストに描画 selectobject( hmemdc, hfont ); textout( hmemdc, 100, 10, lpstring1, lstrlen(lpstring1) ); settextcolor( hmemdc, rgb(0,23,200) ); textout( hmemdc, 150, 70, szbuff, lstrlen(szbuff) ); settextcolor( hmemdc, rgb(0,0,0) ); textout( hmemdc, 185, 130, lpstring2, lstrlen(lpstring2) ); // 再描画の指示(更新リージョンの追加) invalidaterect( hwnd, null, false ); } case wm_paint: { paintstruct ps; hdc hdc; // メモリ・デバイスコンテキストを画面のデバイスコンテキストに転送 hdc = beginpaint( hwnd, &ps ); bitblt( hdc, 0, 0, max_width, max_height, hmemdc, 0, 0, srccopy ); endpaint( hwnd, &ps ); } case wm_lbuttondown: sendmessage( hwnd, wm_close, 0, 0 ); default:return defwindowproc( hwnd, msg, wp, lp ); } return 0; }