0

私は一般的にMFCとWindowsプログラミングに不慣れで、これは私が理解していないものです
.OnPaintでCClientDCを使用せず、CPaintDCのみを使用するように読んでいるどこでも
、私のコードでは、長方形の描画関数をデフォルトのOnPaintに追加します() ウィザードを使用してダイアログ ベースの MFC アプリケーションを作成するときに作成されるハンドラー

void Cgraph_on_dlgboxDlg::OnPaint()
{
    CPaintDC dc(this); // ----------------------------> LINE 1
    if (IsIconic())
    {
        // CPaintDC dc(this); // device context for painting // ----------------------------> LINE 2

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }

    COLORREF pencolour = RGB(0, 0, 0);
    COLORREF brushcolour = RGB(0, 0, 255);
    CPen pen(PS_SOLID, 5, pencolour);
    CBrush brush(HS_CROSS, brushcolour);
     // CPaintDC Dc(this);      // ----------------------------> LINE 3
     // CClientDC Dc(this);     // ----------------------------> LINE 4
    dc.SetBkMode(TRANSPARENT);
/****
get rectangle coordinates and properties
****/
    dc.Rectangle(CRect(point1, point2));
}

このコードでは、もともとLINE 1存在しません。この場合、CClientDCが で宣言されている場合、プログラムは四角形を描画しますが、が有効LINE 4になっている では何も描画しません。の CPaintDC を削除し、LINE 3 と 4 をコメントアウトすると機能します。なぜこうなった?私が理解したことから、ここでは CClientDC はまったく機能しないはずですか、それとも何か不足していますか? 繰り返しますが、 in は if ブロック内のみにスコープを持つべきではありませんか? CPaintDC を 2 回宣言すると出力がまったく作成されないのはなぜですか?CPaintDCLINE 3LINE 2LINE 1
CPaintDCLINE 2

4

1 に答える 1

1

CPaintDC コンストラクターは、BeginPaint を呼び出して、無効な領域 (描画が必要な領域) にクリップされた DC を取得します。2 番目の CPaintDC を構築すると、空の無効な領域が取得されるため、何も描画できません。

既定のコードは、ダイアログが最小化されているときに CDialogEx::OnPaint を呼び出さないため、2 行目でのみ CPaintDC を構築します。ダイアログが最小化されていない場合、CDialogEx::OnPaint は CPaintDC を構築します。OnPaint への特定の呼び出しには、1 つの CPaintDC のみを使用できます。

CPaintDC の元の処理をそのままにしておく限り、CClientDC を使用して四角形を描画できます。

于 2013-07-03T15:19:13.273 に答える