none
文字に色がつかない RRS feed

  • 質問

  • TextOut関数で文字を描画しているのですが、SetTextColor関数で色を指定しても、その色の文字にならず黒色です。
    基本的なことかもしれませんが、何が足りてないのか突き止められませんでした。
    描画の前後で、GetTextColor関数で得られる値は指定した色なのですが・・・。

    わかる方がいればご指摘ください。

    環境:VC++2005 Pro、MFC、ダイアログアプリ

    テストアプリとして、ダイアログに描画ボタンと描画領域のピクチャーボックスを置いています。
    以下、描画ボタンを押した時の処理。

    Code Snippet

    void CTextDrawerDlg::OnBnClickedButton1()
    {
        ::HDC hdcPB = ::GetDC( ::GetDlgItem( m_hWnd, IDC_PICBOX ) );  // PicBoxのDC取得
        ::HDC hdc   = ::CreateCompatibleDC( hdcPB );  // 互換DC作成

        int width  = 1000;
        int height = 500;
        ::HBITMAP hbmp = ::CreateCompatibleBitmap( hdc, width, height );  // 互換ビットマップ
        ::SelectObject( hdc, hbmp );

        // DCの背景をクリア
        ::PatBlt( hdc, 0, 0, width, height, WHITENESS );

        // 背景モードを透過に設定
        ::SetBkMode( hdc, TRANSPARENT );

        // フォント生成
        HFONT font =  ::CreateFont( 50, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
                                    DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
                                    CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                                    DEFAULT_PITCH + FF_DONTCARE,
                                    _T( "MS ゴシック" ) );

        ::SelectObject( hdc, font );        // 文字を描画オブジェクトとして選択
        ::SetTextAlign( hdc, TA_LEFT );     // 文字の配置
        ::SetTextColor( hdc, RGB( 255, 0, 0 ) );   // 文字の色


        // 描画

        TCHAR Text[] = _T( "ほげほげ" );
        BOOL ret = ::TextOut( hdc, 0, 0, Text, static_cast<int>( _tcslen( Text ) ) );

        // 描画した大きさ
        SIZE size;
        ::GetTextExtentPoint32( hdc, Text, static_cast<int>( _tcslen( Text ) ), &size );

        // イメージを転送
        ::BitBlt( hdcPB, 0, 0, size.cx, size.cy, hdc, 0, 0, SRCCOPY );

        ::DeleteObject( hbmp );
        ::DeleteDC( hdc );
        ::ReleaseDC( NULL, hdcPB );
    }


    2008年3月25日 5:23

回答

すべての返信

  • CreateCompatibleBitmap に hdc ではなく hdcPB を渡してみてください。

    2008年3月25日 6:05
  • zakioさん

    色がつきました!
    ありがとうございます。

    でも、元のDCと互換DCでカラー/モノクロが違うのはなぜなのでしょう?
    ご存知でしたらお教えていただけないしょうか。
    2008年3月25日 6:19
  •  ぼーず さんからの引用
    でも、元のDCと互換DCでカラー/モノクロが違うのはなぜなのでしょう?


    MSDN の CreateCompatibleDC の解説に、「メモリデバイスコンテキストを作成した時点では、その表示サーフェスはモノクロームであり、高さと幅は 1 ピクセル×1 ピクセルです。」とあります。

    CreateCompatibleDC を使って作られた直後の hdc はモノクロームなので、それとコンパチなビットマップもモノクロになってしまうというわけです。
    「ちっともコンパチじゃないじゃん」と悩んだこともありますが、ビットマップ以外の部分がコンパチなのでしょう、きっと。

    2008年3月25日 6:36
  • なるほど。
    基本的なところを見落としていました。
    ありがとうございました。
    2008年3月25日 7:12
  •  

    色がつかない件とは関係ありませんが、

    ReleaseDCの第1引数は、GetDCの第1引数と同じでなければならないのでは?

    2008年3月25日 23:11
  • nmasaoさん

    ご指摘ありがとうございます。
    その通りです。

    実際のアプリでは画面表示はせずにスクリーンのDCを使って
    hdecScreen = GetDC( NULL )をReleaseDC( NULL, hdcScreen )してるので
    大丈夫なのですが、この質問用に中途半端にコピペしたので直し忘れです。
    2008年3月26日 0:55