各位大家好,我做了个软件,出现闪屏的现象。界面类似于放大的360界面,布满整个屏幕,主界面上面是6个按钮,背景是个bmp贴图,点击上面的某个按钮,会生成子界面覆盖在下面。但每次点击按钮切换子界面时,都会短暂的看到主界面再生成子界面。我感觉是在每次调用子界面时调用了OnEraseBKgnd,因为在这里添加了加载主界面背景贴图的代码。另外,我试了把这部分代码放到OnShowWindow或OnCreate中,都会出现显示的问题。不知怎么改,请各位指点,谢谢
调试欢乐多
int CMainFrame:OnCreate( )
{ Long nStyle=GetWindowLong(m_hWnd,GWL_STYLE);
nStyle=nStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX & ~WS_CAPTION & WS_BORDER & ~WS_CLIPCHILDREN;
SetWindowLong(m_hWnd,GWL_STYLE,nStyle);
CreateButton();
return 0;
}
BOOL CMainFrame::PreCreateWindow( )
{ cs.Menu=NULL;
cs.cx=GetSystemMetrics(SM_CXSCREEN);
cs.cy=GetSystemMetrics(SM_CYSCREEN);
return true;
}
{ HBITMAP hbitmap=(HBITMAP)LoadImage( );
.........
pDC->BitBlt( );
.......
return true;
}
void CMainFrame::CreateButton ()
{ for(int i=0;i<6;i++)
{ m_button[i].Create( );
}
void CMainFrame::OnButtonClick(UINT nCmdID)
{ RECT r;
r.left=0; r.right .......
CRuntimeClass* pNewViewClass;
switch(nCmdID)
{ case IDC_HEADBUTTON:
pNewViewClass=RUNTIME_CLASS(CRunView);
m_pRunView=(CRunView*)CreateViewEx(pNewViewClass,r,true);
m_pRunView->ShowWindow(SW_SHOW);
m_pRunView->OnInitUpdate();
::SetWindowLong(m_pRunView->m_hWnd,GWL_ID,nCmdID);
break;
.. ..........
.............
}
WS_CLIPCHILDREN
WS_CLIPSIBLINGS
上面的代码中有子界面的切换,就在OnButtonClick中实现的。
我今天把原来在OnEraseBkgnd中加载主界面背景图的代码放在OnPaint中,效果好了一些,但还是会出现轻微的闪烁现象。都说使用双缓冲,我对其也没怎么理解,感觉就是先放在内存中,再拷贝到界面上。我的代码应该没问题吧:
HBITMAP hbitmap=(HBITMAP)LoadImage( );
CRect rc;
CBitmap bkBmp;
bkBmp.Attach(hbitmap);
GetUpdateRect(&rc);
CDC srcDC;
srcDC.CreateCompatibleDC(pDC);
SrcDC.SelectObject(bkBmp);
pDC->BitBlt( );
srcDC.DeleteDC();
bkBmp.DeleteObject();
10楼说的是这个问题吗
绘图相关操作整理到OnPaint中