1

背景が透明なコントロールを導入する CWnd ベースのクラスを作成したいと思います。

コントロールを作成し、コンテンツが静的である限り、透明な背景でそのコンテンツを描画することは、私にとって大したことではありません。

問題は、コンテンツを変更するコントロールを作成したいときです。これは、親の背景 (通常、単色ではない場合があります) を使用してコントロールのコンテンツを消去する方法がわからないためです。

したがって、私が達成したい目標は、コントロールが存在しなかったため(親、および他のコントロールが表示される可能性がある)、そのコンテンツをペイントする前にコントロールを消去し、この場所にコントロールをペイントすることです。

4

3 に答える 3

4

トップレベルのウィンドウを作成したい場合は、Roel の回答で問題ありません。子ウィンドウを作成する必要がある場合 (コントロールを作成している場合はそうでなければなりません)、WS_EX_LAYERED を使用することはできません (これは Windows 8 以降で変更されたと思います)。

簡単なトリックは、コントロールの背景として親を描画することです。したがって、OnEraseBkgnd に次のコードを追加できます。

BOOL uiBarcodeButton::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetClientRect(rect);

    return afxGlobalData.DrawParentBackground( this, pDC, rect);
}

afxGlobalData グローバル変数が MFC 2008 Feature Pack 専用かどうかは不明です。以前のバージョンの MFC を使用している場合は、DrawParentBackground のコードを使用できます。

ASSERT_VALID(pDC);
ASSERT_VALID(pWnd);

BOOL bRes = FALSE;

CRgn rgn;
if (rectClip != NULL)
{
    rgn.CreateRectRgnIndirect(rectClip);
    pDC->SelectClipRgn(&rgn);
}

CWnd* pParent = pWnd->GetParent();
ASSERT_VALID(pParent);

// In Windows XP, we need to call DrawThemeParentBackground function to implement
// transparent controls
if (m_pfDrawThemeBackground != NULL)
{
    bRes = (*m_pfDrawThemeBackground)(pWnd->GetSafeHwnd(), pDC->GetSafeHdc(), rectClip) == S_OK;
}

if (!bRes)
{
    CPoint pt(0, 0);
    pWnd->MapWindowPoints(pParent, &pt, 1);
    pt = pDC->OffsetWindowOrg(pt.x, pt.y);

    bRes = (BOOL) pParent->SendMessage(WM_ERASEBKGND, (WPARAM)pDC->m_hDC);

    pDC->SetWindowOrg(pt.x, pt.y);
}

pDC->SelectClipRgn(NULL);

return bRes;
于 2012-12-03T17:22:03.473 に答える
2

WS_EX_LAYERED と UpdateLayeredWindow() API を使用してウィンドウを描画します。http://msdn.microsoft.com/en-us/library/ms997507.aspxを参照してください。

于 2012-12-03T15:07:45.450 に答える
0

カスタム Static コントロールに以下のコードを使用しました。

BOOL MyStaticText::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetClientRect(&rect);
    pDC->SelectObject((HBRUSH)GetStockObject(NULL_BRUSH));
    return pDC->PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY); 
}
于 2014-03-17T02:12:15.247 に答える