1

ユーザーがチェックボックスをオンにしたときに、MFCダイアログに画像を挿入し、その上にポイントを印刷する必要があります。MFCで画像に点を描くことはできますか?

ありがとう。

4

2 に答える 2

1

ビットマップを表示するために、独自の CStatic 所有者描画ベースのコントロールを作成してみてください。DrawItem 要求を取得したら、元のビットマップを互換性のある DC に読み込みます。次に、変更を DC に描画し、完了したら、DRAWITEMSTRUCT 情報で提供される実際の画面 DC に DC を BitBlt します。

一歩一歩。

  1. CMyPic と呼ばれる CStatic に基づいて新しい MFC コントロールを作成します。

  2. ダイアログにピクチャ コントロールを配置します (コントロールのプレース ホルダーとして)。

  3. ピクチャ コントロールの名前を IDC_STATIC から IDC_MYPIC に変更します。

  4. コントロールのタイプを「Frame」から「Owner Draw」に変更します

  5. コントロールを右クリックし、「変数を追加」します。m_mypic のような名前の制御変数にして、変数の型を CMyPic に変更します。

  6. CMyPic で、DrawItem のオーバーライドを追加します

  7. DrawItem では、次のようなビットマップを描画できます (私の場合、PNG を描画してテキストをオーバーレイしています)。

    void CMyPic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){
    
        CPngImage img;
        img.Load( IDB_PNG1 );
    
        CDC dcScreen;
        dcScreen.Attach( lpDrawItemStruct->hDC );
    
        CDC dcMem;
        dcMem.CreateCompatibleDC( &dcScreen );
        CBitmap * pold = (CBitmap*)dcMem.SelectObject( img );
    
        dcMem.DrawText( L"Hi", &lpDrawItemStruct->rcItem, NULL );
    
        dcScreen.BitBlt( 0, 0, lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.bottom, &dcMem, 0, 0, SRCCOPY );
    
        dcMem.SelectObject( pold ); 
        dcScreen.Detach( );
    }
    
于 2012-07-05T09:35:20.003 に答える
0

可能ですが、直接行うことは強くお勧めしません。

通常、ダイアログボックスはコントロールのコンテナとしてのみ機能する必要があります。

そのため、おそらく必要なのは、ビットマップを背景として表示できる、ある種の階層化された描画コントロールと、その前にある他のオブジェクト(点、場合によっては線、曲線など)です。MFCでActiveXコントロールを作成して、それを簡単に行うことができます。ATLを使用するのは少し難しいですが、それほど多くはありません。結果は、より小さく、(おそらく)より高速であるという観点から、ほぼ必然的に「より良い」ものになります。

于 2012-07-05T04:10:10.627 に答える