求教!!用dc 在CStatic 上绘出文字后,怎么才能实现滚动效果?

只爱浓茶 2004-08-11 06:07:52
我在CStatic 上绘制了一个RECT ,然后在Rect 中输入了文字,请问如何才能实现只有Rect 中的文字自下而上滚动,而Rect 不动的效果呢?

谁能给出完成代码再加100分,谢谢!
...全文
215 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kvw3000 2004-08-11
  • 打赏
  • 举报
回复

实现文字在视图中从右到左滚动效果
void CTestView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default


if (nIDEvent !=1)
return;
CDC* pDC = GetDC();
if(m_X > -40)
pDC->TextOut( m_X--, 20, "你的文字");
}

void CTestView::OnInitialUpdate()
{
CView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class
CRect rc;
GetClientRect(&rc);
m_X = rc.right;
}

BOOL CTestView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class

int ret = CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
ASSERT(SetTimer(1, 10, NULL) != 0);
return ret;
}


Kudeet 2004-08-11
  • 打赏
  • 举报
回复
一个用CStatic 显示动画的例子

3. 显示动画
编写一个字符串在静态控件中不停的移动的程序。
⑴ 使用AppWizard创建一个基于对话框的MFC应用程序,设置其工程名为ShowAnimation。
⑵ 在对话框上增加一个静态控件。将静态控件的ID值设置为IDC_PREVIEW。
⑶ 使用ClassWizard添加WM_INITDIALOG消息处理函数OnInitDialog和WM_TIMER的消息处理函数OnTimer。
⑷ 在CshowAnimationDlg类中,增加两个变量m_x和m_y,用以表示字符串的坐标。
⑸ 在OnInitDialog函数中添加下列代码:
m_x=0;
m_y=0;
KillTimer(1);
VERIFY(SetTimer(1, 500, NULL) != 0);
1. 在CshowAnimationDlg类中,增加一个成员函数Draw()如下:
void CshowAnimationDlg::Draw()
{
CWnd *pWnd=GetDlgItem(IDC_PREVIEW);
CDC *pDC=pWnd->GetDC();
RECT rect;
pWnd->GetClientRect(&rect);
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,rect.right,rect.bottom);
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(0,0,0));
if((m_x>=rect.right)||(m_y>=rect.bottom-20))
{ m_x=0;
m_y=0;
}
pDC->TextOut(m_x,m_y,"动画");
}
2. 在OnTimer函数中,添加如下代码:
if (nIDEvent == 1)
{
m_x+=5;
m_y+=5;
Draw();
}
else CWnd::OnTimer(nIDEvent);
flyelf 2004-08-11
  • 打赏
  • 举报
回复
使用定时器
holyeagle 2004-08-11
  • 打赏
  • 举报
回复
走马灯效果。自己计算位置,不断刷新,楼上的方法不错
keansun 2004-08-11
  • 打赏
  • 举报
回复
这有一个制作滚动字幕的文章,希望对你有所帮助
用VC制作带有滚动字幕的软件封面
SWM


软件启动时,常常需要自下而上循环滚动显示一些诸如软件名称、功能、版本、用户名、研制单位等信息的文字,在用户按任意键或点击鼠标键后,立即结束演示进入程序主界面。本文在VC中通过向工程中添加Splash screen组件,然后扩展CSplashWnd类方便地实现了这一功能。设计步骤如下:

1.创建一个名为test的SDI工程;

2.向工程中添加Splash screen组件,即添加CSplashWnd类;

3.导入软件封面的位图资源,标识号为IDB_SPLASH;

4.向CSplashWnd类中添加函数DrawText,在软件封面中显示文字。代码如下:

void CSplashWnd::DrawText(CDC *pDC, int x, int y, int nAlign,
CString sFontName, int nFONTSIZE0,COLORREF crTextColor, CString sText)
{ //pDC:内存dc,x,y:文字位置,nAlign:对齐方式
//sFont:字体,nFONTSIZE0:字号,crTextColor:文字颜色,sText:正文
LOGFONT lf;//字体
lf.lfStrikeOut=0;//删除线
lf.lfCharSet = DEFAULT_CHARSET ;//字符集
lf.lfEscapement =0;//角度
lf.lfItalic = 0 ;//倾斜
lf.lfUnderline = 0 ;//下划线
lf.lfHeight = nFONTSIZE0 ;//字号
strcpy(lf.lfFaceName,sFaceName.GetBuffer(sFontName.GetLength()));
CFont font ;
font.CreateFontIndirect(&lf);
CFont *pOldFont = (CFont *)pDC->SelectObject(&font);
UINT oldAlign,uAlign ;
switch(nAlign)
{
case 0: uAlign = TA_LEFT | TA_TOP ; break;
case 1: uAlign = TA_CENTER | TA_TOP; break;
case 2: uAlign = TA_RIGHT | TA_TOP ; break;
default: uAlign = TA_LEFT | TA_TOP ; break;
}
oldAlign = pDC->SetTextAlign(uAlign);
int oldMode = pDC->SetBkMode(TRANSPARENT);
int oldColor = pDC->SetTextColor(crTextColor) ;
pDC->TextOut(x,y,sText);pDC->SetTextColor(oldColor) ;
pDC->SetTextAlign(oldAlign);
pDC->SetBkMode(oldMode);
pDC->SelectObject(pOldFont);
font.DeleteObject();
}
5. 给CSplashWnd类中添加以下变量,并在构造函数中加入初始化代码;
class CSplashWnd : public CWnd
{public: CDC m_dcText,m_dcImage;//显示dc的兼容内存dc
CBitmap* m_pBitmap;//位图对象指针
CBitmap* m_pOldBitmapText,*m_pOldBitmap;//跟踪内存dc中的原位图
CRgn m_rgn;//用于生成矩形区域
CRect m_TextRect ;//显示文字的矩形区域
int m_nCurPos ;//文字当前位置
}
CSplashWnd::CSplashWnd()
{ m_nCurPos = 50 ;
}
6.设置显示文字的矩形区域。
BOOL CSplashWnd::Create(CWnd* pParentWnd /*= NULL*/)
{ m_TextRect.CopyRect(&CRect(50,100,500,300));
}
7.添加 WM_PAINT消息处理函数,调用CSplashWnd::DrawText显示文字。
void CSplashWnd::OnPaint()
{ CPaintDC dc(this);
BITMAP bm;
m_bitmap.GetBitmap(&bm);
static BOOL bFirst = TRUE;//指示是否第一次绘制窗口
if(bFirst)
{ if (!m_dcImage.CreateCompatibleDC(&dc)) return;
m_pOldBitmap = m_dcImage.SelectObject(&m_bitmap);
if (!m_dcText.CreateCompatibleDC(&dc)) return;
m_pBitmap = new CBitmap ;
int nBitCount = m_dcText.GetDeviceCaps(BITSPIXEL);
m_pBitmap->CreateBitmap(bm.bmWidth,bm.bmHeight,1,nBitCount,NULL);
m_pOldBitmapText = m_dcText.SelectObject(m_pBitmap);
m_rgn.CreateRectRgn(m_TextRect.left,m_TextRect.top,
m_TextRect.right,m_TextRect.bottom);
bFirst = FALSE;
}
m_dcText.SelectClipRgn(NULL);
m_dcText.BitBlt(0, 0, bm.bmWidth, bm.bmHeight,&m_dcImage, 0, 0, SRCCOPY);
m_dcText.SelectClipRgn(&m_rgn);
int nBasex = m_TextRect.left ;
int nBasey = m_TextRect.bottom-m_nCurPos;
int nMidx = m_TextRect.left + m_TextRect.Width()/2 ;
DrawText(&m_dcText,nMidx,nBasey, 1,
"楷体_GB2312",20, RGB(0,0,255) ,"研制单位");
DrawText(&m_dcText,nMidx,nBasey+30, 1,
"楷体_GB2312",15, RGB(0,255,255) ,"武警指挥学院模拟中心");
dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight,&m_dcText, 0,0, SRCCOPY);
}
8.改变文字垂向位置,出现循环滚动效果:
void CSplashWnd::OnTimer(UINT nIDEvent)
{ m_nCurPos++;
if( m_nCurPos>300 ) //循环
{ m_nCurPos = 0 ;
}
Invalidate(TRUE);
}
9. 演示软件封面时,隐藏主框架窗口:
BOOL CTestApp::InitInstance()
{ m_pMainWnd->ShowWindow(SW_HIDE);
m_pMainWnd->UpdateWindow();
}
10.按任意键或点击鼠标键结束封面演示:
LRESULT CSplashWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{ if (c_pSplashWnd)
{
if (message == WM_KEYDOWN ||message == WM_SYSKEYDOWN ||
message == WM_LBUTTONDOWN ||message == WM_RBUTTONDOWN ||
message == WM_MBUTTONDOWN ||message == WM_NCLBUTTONDOWN ||
message == WM_NCRBUTTONDOWN ||message == WM_NCMBUTTONDOWN)
{ c_pSplashWnd->HideSplashScreen();
AfxGetMainWnd()->ShowWindow(SW_MAXIMIZE);
return TRUE;
}
}
return CWnd::WindowProc(message, wParam, lParam);
}
11.封面窗口销毁后,释放有关对象:
void CSplashWnd::PostNcDestroy()
{ m_dcImage.SelectObject(m_pOldBitmap);
m_dcText.SelectClipRgn(NULL);
m_dcText.SelectObject(m_pOldBitmapText);
m_bitmap.DeleteObject();
m_rgn.DeleteObject();
delete this;
}


16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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