質問: getdc(); crect myrect; getclientrect(&myrect); mydc->selectobject(&myrect); mydc->drawtext(str,-1,&myrect,dt_center); //strを表示 releasedc(mydc); myfont.deleteobject(); } というプログラムを作成しているのですが、この方法でのダイアログへの文字の表示では、たとえば90が表示され、次に100が表示されるのであればいいのですが、100のあとに90が表示された時に100の上にそのまま90が表示されてしまい、うまく表示できません。 再描画のときに、上書きではなく、前回の数値を消去してから新たな数値を表示できればいいとは思うのですが、やり方がわからず、ご意見をいただければと思い質問させていただきました。 どうか宜しくお願いいたします。 開発環境は windows ce 6.0 visual studio 2005 です。
回答: wm_erasebkgndメッセージのハンドラoneasebkgndをオーバーライドして ココで消去するように組めばいいように思います cbrush型のメンバー変数を追加しておいて コンストラクタの中で初期化します csamplestatic::csamplestatic() { m_brback.create( rgb( 255, 255, 255 ) ); } onerasebkgndでクライアント領域を塗りつぶします bool csamplestatic::onerasebkgnd(cdc* pdc) { crect rc; getclientrect( &rc ); pdc->fillrect( rc, &m_brback ); return cstatic::onerasebkgnd(pdc); } これでinvalidate()を呼んだときに onerasebkgndも呼ばれるので 前回描画した領域を背景色で塗りつぶします 外部から背景色をアクセスしたいなら m_brbackを変更できるような getbkcolor/setbkcolorなどをメンバー関数に加えましょう 例 メンバー変数として colorref m_bkcolor; を追加 colorref csamplestatic::getbkcolor() { return m_bkcolor; } void csamplestatic::setbkcolor( colorref col ) { if ( m_brback.m_hobject ) { m_brback.deleteobject(); } m_brback.create( col ); } といった具合で ・・・