在窗口上写文字 现在有一个窗口,上面有子控件,我需要在窗口上写几行字用定时器控制它移动,当他移动到子控件上时让字显示在最上面一层而不被子控件覆盖 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 方法1:创建一个静态标签,并设置层次在最顶层,在定时器事件里控制标签移动方法2:在定时器事件里获取窗口DC,用DrawText等方式输出文字 我就是用DrawText输出的文字,但是文字在移动的过程里被其他子控件给覆盖掉一部分,如何让他不被覆盖掉啊 还有别的方法么,子控件太多了,文字要从底部逐渐移动到上边,中间经过很多子控件,怎么才能让它不被遮挡,我是将文字写在一个新的子控件上,然后用CombineRgn跟窗口位图合并,然后通过OffsetRgn来移动的,但是这样又有新问题了,如果又收到一条消息,继续滚动新的文字,而此时上一次滚动的文字还没消失,我该如何合并呢,如果同时有3甚至5条信息要滚动呢 现在一条信息可以了,但是两条信息该怎么弄呢 ,我是这么弄的:/调整位置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);} ODBC创建数据源后,如何创建mdb数据库? 关于钩子函数 工具栏图标怎么实现 晕了,难道是我落伍了? 请问ActiveX和COM有何异同?? 有关串口编程的问题,请大家帮帮忙啊,我信誉好啊。 求助:关于软件的换肤功能 一个很少有人问的问题 数据库的问题 求 visual C++ 开发经验技巧宝典 源代码 ,感谢 怎么解决这个问题error LNK2019: unresolved external symbol __imp__closesocket@4 reference 主对话框里有个tab控件,tab上有两个页,分别放两个dlg
/调整位置
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);
}