문제

32 비트 비트 맵을 그리는 동안 픽셀 당 알파 블렌드를 구현하는 컨트롤을 만들려고합니다.

CWND를 확장하고 리소스 편집기에서 정적 제어를 사용합니다. 나는 알파 채널을 올바르게 페인트 할 수 있었지만 여전히 정적 컨트롤은 회색 배경을 페인트합니다.

컨트롤이 배경을 칠하는 것을 막기 위해 Onerasebkgnd를 덮어 썼지 만 작동하지 않았습니다. 마침내 WS_EX_TRANSPARENT를 사용하여 수행했습니다.

내 문제는 이제 내 제어가 다른 제어에 대한 제어가 있다는 것입니다. 대화 상자가 처음으로 칠해지면 모든 것이 잘 작동합니다 ... 그러나 "부모"컨트롤을 클릭하면 (예 : 제어 컨트롤 아래의 컨트롤) 내 컨트롤은 wm_paint 메시지를받지 못합니다. 따라서 더 이상 페인트되지 않습니다.

INSUCHATION을 최소화하고 다시 극대화하면 컨트롤이 다시 페인트됩니다.

제발, 아무도 힌트를 줄 수 있습니까? 나는이 컨트롤에 미쳤다 !!!

감사.

도움이 되었습니까?

해결책

나는 당신이 두 가지를 처리한다면 WM_ERASEBKGND 그리고 WM_PAINT 그런 다음 메시지를 사용하지 않고 모든 그림 옵션을 다루어야합니다. ws_ex_transparent 스타일.

코드가 확실합니까? 지나가지 않습니다 이 메시지는 기본 처리?

다른 옵션 중 하나가 될 수 있습니다 아강 정적 컨트롤은 코드 가이 두 메시지를 처리하는 유일한 것인지 확인하는 것입니다.

다른 팁

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);
}

http://unick-soft.ru/articles.cgi?id=12 - 러시아어로 미안하지만 예를 들어 있습니다. 예는 코드 샘플 이후 하단 기사에 Hyper Link "В примере, ¬который Вы можете ска ·ть"가 있습니다. 러시아어 배우십시오 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top