我有个不明白的,他贴图既然是整个窗口一起贴上来的
那他在需要更改其中一块图片的时候咋办?   整个窗口全部清空重新拷到内存再贴上来吗? 还是咋的?我没用库  自己模仿写的   就是在贴图的时候有些不解我目前是吧每个控件全都自绘了 没把他们也当成图的一部分整合到窗口内存中 贴起来效率不高 就想干脆把所有东西全部贴到窗口中 那样效率就高了  可问题就是我需要改变其中一块图片的时候不知道咋办才好

解决方案 »

  1.   

    1.生成无效区域
    2.根据无效区域绘制缓存DC
    3.根据无效区域拷贝缓存DC到屏幕DC
      

  2.   

    InvalidateRect,而且 Each Part是个Widget,这个Part将显示成什么样子,这个Widget自己会知道,它维护状态,更新显示即可。
      

  3.   

    又是 InvalidateRect
    整个以前就碰到过   没用起来   楼上2位InvalidateRect生成无效区域怎么做的?能否给一个源码参考下?
      

  4.   

    别想太多,你想画什么地方,就把什么地方的Rect传给函数就行了什么无效有效的。
      

  5.   

    1.假如你的按钮要改变状态
    void CButtonUI::Event(TEventUI& event)
    {
       if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_DBLCLICK )
       {
          if( ::PtInRect(&m_rcItem, event.ptMouse) && IsEnabled() ) {
             m_uButtonState |= UISTATE_PUSHED | UISTATE_CAPTURED;
             Invalidate();
          }
       }
       ...
    }
    // CButton继承ControlUI的实现
    void CControlUI::Invalidate()
    {
       if( m_pManager != NULL ) m_pManager->Invalidate(m_rcItem);
    }
    // CPaintManagerUI负责整个分发消息和整个窗口界面的绘制
    void CPaintManagerUI::Invalidate(RECT rcItem)
    {
       ::InvalidateRect(m_hWndPaint, &rcItem, FALSE); // 产生 WM_PAINT 消息
    }
    2.产生的 WM_PAINT 消息由 CPaintManagerUI处理
    bool CPaintManagerUI::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes)
    {
    // ......
         case WM_PAINT:
    {
    // 离屏DC
     if( m_bOffscreenPaint && m_hbmpOffscreen == NULL )
                {
                   RECT rcClient = { 0 };
                   ::GetClientRect(m_hWndPaint, &rcClient);
                   m_hDcOffscreen = ::CreateCompatibleDC(m_hDcPaint);
                   m_hbmpOffscreen = ::CreateCompatibleBitmap(m_hDcPaint, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top); 
                   ASSERT(m_hDcOffscreen);
                   ASSERT(m_hbmpOffscreen);
                }
                // Begin Windows paint
                PAINTSTRUCT ps = { 0 };
                ::BeginPaint(m_hWndPaint, &ps);
                if( m_bOffscreenPaint )
                {
                   // We have an offscreen device to paint on for flickerfree display.
                   HBITMAP hOldBitmap = (HBITMAP) ::SelectObject(m_hDcOffscreen, m_hbmpOffscreen);
                   // Paint the image on the offscreen bitmap
                   int iSaveDC = ::SaveDC(m_hDcOffscreen);
    // 控件自己负责绘制自己,绘制到离屏DC上
                   m_pRoot->DoPaint(m_hDcOffscreen, ps.rcPaint);
                   ::RestoreDC(m_hDcOffscreen, iSaveDC);
                   // Draw alpha bitmaps on top?
                   for( int i = 0; i < m_aPostPaint.GetSize(); i++ ) {
                      TPostPaintUI* pBlit = static_cast<TPostPaintUI*>(m_aPostPaint[i]);
                      CBlueRenderEngineUI::DoPaintAlphaBitmap(m_hDcOffscreen, this, pBlit->hBitmap, pBlit->rc, pBlit->iAlpha);
                   }
                   m_aPostPaint.Empty();// 拷贝离屏DC到屏幕DC上
                   // Blit offscreen bitmap back to display
                   ::BitBlt(ps.hdc, 
                      ps.rcPaint.left, 
                      ps.rcPaint.top, 
                      ps.rcPaint.right - ps.rcPaint.left,
                      ps.rcPaint.bottom - ps.rcPaint.top,
                      m_hDcOffscreen,
                      ps.rcPaint.left,
                      ps.rcPaint.top,
                      SRCCOPY);
    }
    http://www.viksoe.dk/code/windowless1.htm
    这里面是这样实现的
      

  6.   

    全部图片弄到cdc保存着,然后Invalidate,再WM_PAINT中用BitBlt重新绘制控件的图片。
    InvalidateRect和Invalidate在directui中没什么区别,再WM_PAINT中都得重新绘制所有控件的图片。
      

  7.   


    这位朋友,你是说  窗口上画一个按钮 然后重写CButton类给这个按钮自绘?如果是这样的话你偏离主题了。DirectUI的东西就是不存在任何控件
      

  8.   


    在看了 这个DEMO是绘制上去的 不错 多谢了 我研究下
      

  9.   

    给你个源码参考:http://blog.csdn.net/cometnet/article/details/6535377