现在有一个窗口,上面有子控件,我需要在窗口上写几行字用定时器控制它移动,当他移动到子控件上时让字显示在最上面一层而不被子控件覆盖

解决方案 »

  1.   

    方法1:创建一个静态标签,并设置层次在最顶层,在定时器事件里控制标签移动方法2:在定时器事件里获取窗口DC,用DrawText等方式输出文字
      

  2.   

    我就是用DrawText输出的文字,但是文字在移动的过程里被其他子控件给覆盖掉一部分,如何让他不被覆盖掉啊
      

  3.   

    还有别的方法么,子控件太多了,文字要从底部逐渐移动到上边,中间经过很多子控件,怎么才能让它不被遮挡,我是将文字写在一个新的子控件上,然后用CombineRgn跟窗口位图合并,然后通过OffsetRgn来移动的,但是这样又有新问题了,如果又收到一条消息,继续滚动新的文字,而此时上一次滚动的文字还没消失,我该如何合并呢,如果同时有3甚至5条信息要滚动呢
      

  4.   

    现在一条信息可以了,但是两条信息该怎么弄呢 ,我是这么弄的:
    /调整位置
    void CMessageView::RectifyControl()
    {

    //计算大小
    CSize ControlSize;
    ControlSize.cx=MESSAGE_END_POS_X;
    ControlSize.cy=MESSAGE_END_POS_Y;
    int nXPos =MESSAGE_BEGIN_POS_X;
    int nYPos=MESSAGE_BEGIN_POS_Y; //移动位置
    SetWindowPos(NULL,nXPos,nYPos,ControlSize.cx,ControlSize.cy,SWP_NOZORDER); //创建位图
    CImage ImageConsult;
    ImageConsult.Create(ControlSize.cx-nXPos,ControlSize.cy-nYPos,32); HDC hdc = ImageConsult.GetDC(); COLORREF crTransColor=RGB(255,0,255);
      
    CBrush   NewBrush;
    NewBrush.CreateSolidBrush(crTransColor);
    SelectObject(hdc,NewBrush); CPen NewPen;
    NewPen.CreatePen(PS_SOLID,1,crTransColor);
    SelectObject(hdc,NewPen); Rectangle(hdc,0,0,ControlSize.cx-nXPos,ControlSize.cy-nYPos);
       
    //选颜色
    CFont InfoFont;
    InfoFont.CreateFont(20,0,0,0,200,0,0,0,134,3,2,1,2,TEXT("黑体"));
    SelectObject(hdc,InfoFont);
    SetTextColor(hdc,RGB(255,0,0));
    SetBkMode(hdc,TRANSPARENT);

    TextOut(hdc,50,ControlSize.cy-nYPos-20,m_strMessage,strlen(m_strMessage)); //调整位图
    BITMAP ImageInfo;
    GetObject(ImageConsult,sizeof(ImageInfo),&ImageInfo);
    while ((ImageInfo.bmWidthBytes%4)!=0) ImageInfo.bmWidthBytes++; ImageConsult.ReleaseDC(); //获取属性
    BYTE cbRTranColor=GetRValue(crTransColor);
    BYTE cbGTranColor=GetGValue(crTransColor);
    BYTE cbBTranColor=GetBValue(crTransColor);
    BYTE * pcbImageBitIndex=(BYTE *)ImageInfo.bmBits+(ImageInfo.bmHeight-1)*ImageInfo.bmWidthBytes; //变量定义
    CRgn CardRegion,SignedRegion; //设置区域
    CardRegion.CreateRectRgn(0,0,0,0);

    for (int i=0; i<ControlSize.cy-nYPos; i++)
    {
    for (int j=0; j<ControlSize.cx-nXPos; j++)
    {
    //变量定义
    INT nXStartPos=j; //透明判断
    do
    {
    COLORREF crImageColor=*(((LONG *)pcbImageBitIndex)+j);
    if ((cbRTranColor==GetRValue(crImageColor))&&(cbGTranColor==GetGValue(crImageColor))&&(cbBTranColor==GetBValue(crImageColor))) break;
    } while ((++j)<ImageInfo.bmWidth); if (j-nXStartPos>0)
    {
    //合并区域
    SignedRegion.CreateRectRgn(nXStartPos,i,j,i+1);
    CardRegion.CombineRgn(&CardRegion,&SignedRegion,RGN_OR);
    SignedRegion.DeleteObject();
    }
    }
    //设置位置
    pcbImageBitIndex-=ImageInfo.bmWidthBytes;
    } m_MessageRegion.CombineRgn(&m_MessageRegion,&CardRegion,RGN_OR);
    //设置区域
    SetWindowRgn(CardRegion,TRUE);
    CardRegion.DeleteObject();
    CardRegion.Attach(CardRegion.Detach()); //重画界面
    Invalidate(TRUE); return;
    }
    //设置开始信息
    void CMessageView::SetMessage(CString strMessage)
    {
    m_strMessage=strMessage;
    if (m_bDisplay==true)
    {
    //调整控件
    if (m_hWnd!=NULL) RectifyControl(); m_iMessageYPos=0;
    SetTimer(IDI_MESSAGE_VIEW,30,NULL);
    }
    }
    //移动信息
    bool CMessageView::MoveMessage()
    {
    //计算大小
    m_iMessageYPos=m_iMessageYPos+1;
    CRgn cRgnTemp;
    cRgnTemp.CreateRectRgn(0,0,0,0);
    cRgnTemp.CombineRgn(&cRgnTemp,&m_MessageRegion,RGN_OR);
    cRgnTemp.OffsetRgn(0,-m_iMessageYPos);
    if (m_iMessageYPos==MESSAGE_END_POS_Y-MESSAGE_BEGIN_POS_Y-20)
    {
    m_iMessageYPos=0;
    }
    //设置区域
    SetWindowRgn(cRgnTemp,TRUE);
    //重画界面
    Invalidate(FALSE); return true;
    }
    //重画函数
    void CMessageView::OnPaint()
    {
    CPaintDC dc(this);
    //获取位置
    CRect rcClient;
    GetClientRect(&rcClient);
    dc.FillSolidRect(0,0,rcClient.Width(),rcClient.Height(),RGB(255,255,255));
    }
    //定时器消息
    void CMessageView::OnTimer(UINT_PTR nIDEvent)
    {
    if(nIDEvent==IDI_MESSAGE_VIEW)
    {
    MoveMessage();
    }
    if (nIDEvent==IDI_NEXTMESSAGE_VIEW)
    {
    MoveNextMessage();
    }
    CWnd::OnTimer(nIDEvent);
    }