我有个不明白的,他贴图既然是整个窗口一起贴上来的
那他在需要更改其中一块图片的时候咋办? 整个窗口全部清空重新拷到内存再贴上来吗? 还是咋的?我没用库 自己模仿写的 就是在贴图的时候有些不解我目前是吧每个控件全都自绘了 没把他们也当成图的一部分整合到窗口内存中 贴起来效率不高 就想干脆把所有东西全部贴到窗口中 那样效率就高了 可问题就是我需要改变其中一块图片的时候不知道咋办才好
那他在需要更改其中一块图片的时候咋办? 整个窗口全部清空重新拷到内存再贴上来吗? 还是咋的?我没用库 自己模仿写的 就是在贴图的时候有些不解我目前是吧每个控件全都自绘了 没把他们也当成图的一部分整合到窗口内存中 贴起来效率不高 就想干脆把所有东西全部贴到窗口中 那样效率就高了 可问题就是我需要改变其中一块图片的时候不知道咋办才好
2.根据无效区域绘制缓存DC
3.根据无效区域拷贝缓存DC到屏幕DC
整个以前就碰到过 没用起来 楼上2位InvalidateRect生成无效区域怎么做的?能否给一个源码参考下?
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
这里面是这样实现的
InvalidateRect和Invalidate在directui中没什么区别,再WM_PAINT中都得重新绘制所有控件的图片。
这位朋友,你是说 窗口上画一个按钮 然后重写CButton类给这个按钮自绘?如果是这样的话你偏离主题了。DirectUI的东西就是不存在任何控件
在看了 这个DEMO是绘制上去的 不错 多谢了 我研究下