在fromview单文档中很多button控件移动时产生闪烁问题(在线等,需详细点,我是菜鸟)

csdnNo1 2006-10-31 11:42:02
在formview的客户区里有很我我自己创建的button,当我创建多个,超过客户区时出现滚动条,但拉动滚动条时(拖拉)时,在button移动过成中出现闪烁现象,请问怎么解决,谢谢了,在现等。
主要是在处理CPersianBlindsView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)消息时,调用RefurbishBox3()来刷新控件(RefurbishBox3中主要用SetMyBoxPos实际下面有实现),滚动是自己创建的。就差闪烁的问题。谢谢。
CMyList::RefurbishBox3(CMyList* pNoteMyList,int y)//这里处理的是现对整个链表移动的问题。
{
CMyList* p,*q;
//Rect rc;

int yTitleBox,yButton;
q=pHead;
p=pHead->pNext;
if (q->pTitleBox->m_butStatus==BUT_STATUS_DOWN) //1 展开、2 收缩
{
//从头处理以后可以考虑更加灵活的处理停靠
q->SetMyBoxPos(0,y+q->hTitleBox);
//q->pTitleBox->ShowWindow(SW_SHOW);
q->SetMyButtonPos(0,y+q->hTitleBox+30);
q->pButton->ShowWindow(SW_SHOW);

}
else
{
q->SetMyBoxPos(0,y+q->hTitleBox);//以后可以考虑更加灵活的处理停靠
//ShowWindow 显示/隐藏面板(SW_SHOW-显示、SW_HIDE-隐藏)
q->pButton->ShowWindow(SW_HIDE);
// q->pTitleBox->ShowWindow(SW_SHOW);
}
while (p!=NULL)
{


if (q->pTitleBox->m_butStatus==BUT_STATUS_DOWN) //1-展开、2-收缩
{
p->SetMyBoxPos(0,q->hTitleBox+60);//以后可以考虑更加灵活的处理停靠
//p->pTitleBox->ShowWindow(SW_SHOW);
//BUT_STATUS_DOWN 1 //箭头向下的标题框
//BUT_STATUS_RIGHT 2 //箭头向右的标题框
if (p->pTitleBox->m_butStatus==BUT_STATUS_DOWN)
{
p->SetMyButtonPos(0,p->hTitleBox+30);
p->pButton->ShowWindow(SW_SHOW);
}
else
p->pButton->ShowWindow(SW_HIDE);
}
else
{
p->SetMyBoxPos(0,q->hTitleBox+30);//以后可以考虑更加灵活的处理停靠
p->pTitleBox->ShowWindow(SW_SHOW);
if (p->pTitleBox->m_butStatus==BUT_STATUS_DOWN)
{
p->SetMyButtonPos(0,p->hTitleBox+30);
p->pButton->ShowWindow(SW_SHOW);
}
else
p->pButton->ShowWindow(SW_HIDE);
}

q=p;
p=p->pNext;
}
}
CMyList::SetMyBoxPos(int x,int y) //将控件移动到x,y处大小不变
{
hTitleBox=y;
//pTitleBox->ShowWindow(SW_HIDE);
pTitleBox->SetWindowPos( NULL,x,y,0,0,SWP_NOZORDER | SWP_NOSIZE );
//pTitleBox->ShowWindow(SW_SHOW);
pTitleBox->Invalidate();
}

CMyList::SetMyButtonPos(int x,int y) //将控件移动到x,y处大小不变
{
hButton=y;
//pButton->ShowWindow(SW_HIDE);
pButton->SetWindowPos(NULL,x,y,0,0,SWP_NOZORDER|SWP_NOSIZE);
//pButton->ShowWindow(SW_SHOW);
pButton->Invalidate();
}
//处理当用户滚动滚动条时相对应的界面移动问题
void CPersianBlindsView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if (iMylist1>4)
iMylist1=1;
char sPos[10];
int i,iNowPos,iMin,iMax;//用于记录前一次的pos
SCROLLINFO info;
CRect rect;
GetClientRect(&rect);
m_scrollbar.GetScrollRange(&iMin,&iMax);

switch(nSBCode)
{
if (pScrollBar==&m_scrollbar)
{
case SB_THUMBTRACK://拖动滚动华块时需判断鼠标按下和抬起的变化

itest+=1;
m_scrollbar.SetScrollPos(nPos);
itoa(itest,sPos,10);
m_Edit.SetSel(0,-1);
m_Edit.ReplaceSel(sPos);
iMylist2=iMylist1;
iMylist1=iMylist1+1;
if (0<nPos&&nPos<iMax-rect.bottom+1)
{

if(nPos>iPrePos)//向下拖动
//for(i=1;i<nPos-iPrePos+1;i++)
pHeadFrame->RefurbishBox3(pHeadFrame,-(nPos-iPrePos));
else //向上拖动
// for(i=1;i<iPrePos-nPos+1;i++)
pHeadFrame->RefurbishBoxup(pHeadFrame,iPrePos-nPos);
}
//Sleep(5);
//RefurbishBox5();
iPrePos=nPos;
if(nPos==0)
AdjustMyList(nPos);
if(nPos==iMax-rect.bottom+1)
AdjustMyList(-1);
break;
case SB_LINEDOWN://单击滚动条向下的箭头
iNowPos=m_scrollbar.GetScrollPos();
iNowPos=iNowPos+1;
if(iNowPos>iMax)
iNowPos=iMax;
if (iNowPos<iMax-rect.bottom+1)
{
pHeadFrame->RefurbishBox3(pHeadFrame,-1);
}


m_scrollbar.SetScrollPos(iNowPos);
itoa(m_scrollbar.GetScrollPos(),sPos,10);
m_Edit.SetSel(0,-1);
m_Edit.ReplaceSel(sPos);
iMylist2=iMylist1;
iMylist1=iMylist1+1;
if(iNowPos==0)
AdjustMyList(iNowPos);
if(iNowPos==iMax-rect.bottom+2)
AdjustMyList(-1);
//MyControlList(nSBCode,nPos,pScrollBar);
iPrePos=iNowPos;
break;
case SB_LINEUP:
iNowPos=m_scrollbar.GetScrollPos();
iNowPos=iNowPos-1;
m_Edit.SetSel(0,-1);
m_Edit.ReplaceSel(sPos);
iMylist2=iMylist1;
iMylist1=iMylist1+1;
if (iNowPos>0)
{
pHeadFrame->RefurbishBox3(pHeadFrame,1);
}
if(iNowPos<0)
iNowPos=0;
m_scrollbar.SetScrollPos(iNowPos);
itoa(m_scrollbar.GetScrollPos(),sPos,10);
//pHeadFrame->RefurbishBox3(pHeadFrame,1);
//MyControlList(nSBCode,nPos,pScrollBar);
if(iNowPos==0)
AdjustMyList(iNowPos);
if(iNowPos==iMax-rect.bottom+2)
AdjustMyList(-1);
iPrePos=iNowPos;
break;
case SB_PAGEDOWN: //单击滚动条上面的箭头与滚动之间的区域
iNowPos=m_scrollbar.GetScrollPos();
iNowPos=iNowPos+3;
if(iNowPos>iMax)
iNowPos=iMax;
m_scrollbar.SetScrollPos(iNowPos);
itoa(m_scrollbar.GetScrollPos(),sPos,10);

m_Edit.SetSel(0,-1);
m_Edit.ReplaceSel(sPos);
iMylist2=iMylist1;
iMylist1=iMylist1+1;
if (iNowPos<iMax-rect.bottom+1)
{
pHeadFrame->RefurbishBox3(pHeadFrame,-3);
}
//pHeadFrame->RefurbishBox3(pHeadFrame,-3);
//MyControlList(nSBCode,nPos,pScrollBar);
if(iNowPos==0)
AdjustMyList(iNowPos);
if(iNowPos==iMax-rect.bottom+2)
AdjustMyList(-1);
iPrePos=iNowPos;
break;
case SB_PAGEUP:
iNowPos=m_scrollbar.GetScrollPos();
iNowPos=iNowPos-3;
if (iNowPos>=0)
{
pHeadFrame->RefurbishBox3(pHeadFrame,3);
}
if(iNowPos<0&&iNowPos>-3)
{
pHeadFrame->RefurbishBox3(pHeadFrame,iNowPos+3);
iNowPos=0;
}
m_scrollbar.SetScrollPos(iNowPos);
itoa(m_scrollbar.GetScrollPos(),sPos,10);

m_Edit.SetSel(0,-1);
m_Edit.ReplaceSel(sPos);
iMylist2=iMylist1;
iMylist1=iMylist1+1;

//pHeadFrame->RefurbishBox3(pHeadFrame,3);
//MyControlList(nSBCode,nPos,pScrollBar);
if(iNowPos==0)
AdjustMyList(iNowPos);
if(iNowPos==iMax-rect.bottom+2)
AdjustMyList(-1);
iPrePos=iNowPos;
break;
iPrePos=iNowPos;
}

}
//Code end
//调用局部重画pTitleBox->Invalidate();
CFormView::OnVScroll(nSBCode, nPos, pScrollBar);

}
...全文
90 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧