0

32 ビット ビットマップの描画中に、ピクセルごとのアルファ ブレンドを実装するコントロールを作成しようとしています。

CWnd を拡張し、リソース エディターで静的コントロールを使用します。アルファ チャネルを正しくペイントできましたが、静的コントロールは灰色の背景をペイントし続けます。

コントロールが背景を描画しないように OnEraseBkgnd を上書きしましたが、うまくいきませんでした。WS_EX_TRANSPARENT を使用して、最終的にそれを行うことができました。

私の問題は、私のコントロールが他のコントロールの上に配置されていることです。ダイアログが最初にペイントされたときはすべて正常に動作します...しかし、「親」コントロール (つまり、自分のコントロールの下にあるコントロール) をクリックすると、コントロールは WM_PAINT メッセージを受け取りません。そのため、もう塗装されていません。

アプリケーションを最小化して再度最大化すると、コントロールが再び描画されます。

誰かヒントを教えてください。私はこのコントロールに夢中になっています!!!

ありがとう。

4

2 に答える 2

3

ただし、 WM_ERASEBKGNDWM_PAINTメッセージの両方を処理している場合は、 WS_EX_TRANSPARENTスタイルを使用することなく、すべての描画オプションをカバーする必要があります。

あなたのコードはこれらのメッセージをデフォルトの処理に渡していませんか?

もう 1 つのオプションは、静的コントロールをサブクラス化して、コードがこれら 2 つのメッセージを処理する唯一のコードであることを確認することです。

于 2008-11-27T03:35:48.243 に答える
2
BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic)
    ON_WM_ERASEBKGND()
    ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

BOOL CTransparentStatic::OnEraseBkgnd(CDC* /*pDC*/)
{
    // Prevent from default background erasing.
    return FALSE;
}

BOOL CTransparentStatic::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.dwExStyle |= WS_EX_TRANSPARENT;
    return CStatic::PreCreateWindow(cs);
}

HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
{
    pDC->SetBkMode(TRANSPARENT);
    return reinterpret_cast<HBRUSH>(GetStockObject(NULL_BRUSH));
}

void CTransparentStatic::PreSubclassWindow()
{
    CStatic::PreSubclassWindow();

    const LONG_PTR exStyle = GetWindowLongPtr(m_hWnd, GWL_EXSTYLE);
    SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, exStyle | WS_EX_TRANSPARENT);
}
于 2010-12-15T19:53:52.607 に答える