【问题标题】:Static control with WS_EX_TRANSPARENT style not repainted未重绘 WS_EX_TRANSPARENT 样式的静态控件
【发布时间】:2010-09-24 01:55:12
【问题描述】:

我正在尝试创建一个控件,该控件在绘制 32 位位图时实现每像素 alpha 混合。

我扩展了一个 CWnd 并在资源编辑器中使用静态控件。我设法正确地绘制了 alpha 通道,但静态控件仍然继续绘制灰色背景。

我重写了 OnEraseBkgnd 以防止控件绘制背景,但它没有工作。我终于设法通过使用 WS_EX_TRANSPARENT 做到了。

我现在的问题是我的控件被置于其他控件之上。第一次绘制对话框时一切正常……但如果我单击“父”控件(即我控制下的那个),我的控件不会收到 WM_PAINT 消息。所以不再画了。

如果我最小化应用程序并再次最大化它,控件会再次绘制。

拜托,谁能给个提示?我对这个控件快疯了!!!

谢谢。

【问题讨论】:

    标签: mfc user-controls gdi cwnd


    【解决方案1】:

    我会认为,如果您同时处理 WM_ERASEBKGNDWM_PAINT 消息,那么您应该涵盖所有绘画选项,而不必求助于使用WS_EX_TRANSPARENT 样式。

    您确定您的代码没有将这些消息传递给默认处理吗?

    另一种选择可能是子类化静态控件,以确保您的代码是唯一处理这两条消息的代码。

    【讨论】:

      【解决方案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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 2014-07-24
        相关资源
        最近更新 更多