WINCE系统下,大的位图按钮焦点切换时,位图会闪烁怎么回事?我用的是那种,选中/不选中/得到焦点各自对应一张位图的普通位图按钮类
在DRAWITEM函数里面再对各自不同的状态,BITBLT位图到当前的CDC。我的程序在PC上没这个问题,也许是PC的速度快好多!
用缓存没有?
如果没有可以看一下历史帖子。有详细说明的。
不能用位图按钮了吗?然后处理virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);在这个函数里面针对不同的 状态,BitBlt对应的位图到对应的DC里面去。为什么这样做会闪烁?
为什么会刷白底呢?能不能给个双缓冲技术实现的位图按钮类,这个问题困扰我很久了,在网上/eeworld GOOGLE了很久都没找到好的解决办法。
void CBitmapBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
UINT uStyle = DFCS_BUTTONPUSH;
// This code only works with buttons.
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
// Get the button's text.
CString strText=L"";
// TCHAR strbuf[100];
GetWindowText(strText);
// GetDlgItemText(GetDlgCtrlID(),strbuf,100);
// Draw the button text using the text color red.
BITMAP bm;
HDC hdc;
HBITMAP hbmp;
COLORREF crOldColor;
crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, mTextColor);
//2008--7--30 XQH 只是一个判断逻辑!
if (lpDrawItemStruct->itemState & ODS_DISABLED)
{
hbmp=thbmpdis[hindex];
//crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, crTextBk);
}
else if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
if(lpDrawItemStruct->itemAction & ODA_SELECT)
{
hbmp=thbmpsel[hindex];
}
}
else if (lpDrawItemStruct->itemState & ODS_FOCUS)
{
hbmp=thbmpfoucs[hindex];
}
else
{
//2008--7--30 xqh_xg
// ::PostMessage(GetParent()->m_hWnd,WM_KILLFOCUS,(WPARAM)lpDrawItemStruct->hwndItem,0);
hbmp=thbmpup[hindex];
}
//===========================================
if((lpDrawItemStruct->itemAction & ODA_FOCUS) && (lpDrawItemStruct->itemState & ODS_FOCUS))
{
hbmp=thbmpfoucs[hindex];
}
if (hbmp==NULL) //2008--10--21 xqh 没有背景图就用UP状态下的位图
{
hbmp=thbmpup[hindex];
}
//===================================================================================
GetObject(hbmp,sizeof(BITMAP),&bm);
hdc=CreateCompatibleDC(lpDrawItemStruct->hDC); //2008--7--30 xqh_xg
SelectObject(hdc,hbmp);
BitBlt(lpDrawItemStruct->hDC,0,0,bm.bmWidth,bm.bmHeight,hdc,
0,0,SRCCOPY);
DeleteObject(hdc);
//2008--7--30 XQH 界面闪烁,怎么调节解决???
SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT); //2008---7--30 XQH 这条语句起什么作用?
::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
}
//=====================================================================
上面是我的位图按钮类中对DRAWITEM的处理------根据按钮的状态,BITBLT不同的位图过去。
GetObject(hbmp,sizeof(BITMAP),&bm);
hdc=CreateCompatibleDC(lpDrawItemStruct->hDC); //2008--7--30 xqh_xg
SelectObject(hdc,hbmp);
BitBlt(lpDrawItemStruct->hDC,0,0,bm.bmWidth,bm.bmHeight,hdc,
0,0,SRCCOPY);
是这段代码有问题,你不应该这个时候进行SelectObject(hdc,hbmp); 操作的,如果在BitBlt之前才进行SelectObject,时间需要很长,PC上面你查觉不到,但是wince里面用时间显示会很长,这就是问题的更本。我也是搞了一个多礼拜才明白了。这是致命的问题。
那应该在什么时候进行SelectObject(hdc,hbmp);
这个问题困扰我很久很久了,有人说通过模拟的方式进行位图按钮的操作,这样改我就要改很多东西了!!!
希望楼上给个好方法啊!!!