如何用C语言制作一个可以在开始屏幕上滚动的字幕?

如何用C语言制作一个可以在开始屏幕上滚动的字幕?,第1张

实现滚动厅虚启字幕:

一、单行滚动,写一个函数,每次调用让全局或静态字符数组向一个方向移位(比如左移,从最右边一个非0字符开始遍历,依次覆盖左边的一个字符,最左边的字符被第二个字符覆盖,最右边一个非0位变移出的那个字符)。记得保留结束符号0。

二、之后循环打印字符数组。每次使用system("cls"誉磨)清空控制台显示。

三、多行滚动,同理,只不过把字符移动覆盖,改成字符串移动覆盖。(移动方向的后一行覆盖前一行,把移动方向第一行内容赋值给最后一行)。

//ps:由于肉眼观察,移动需要间隔,用Sleep函数,但该函数会让线程停止,如滚屏间隔期间,还希望其它部分正常运行,需要写线程。

下面是参考代码:

#include<stdio.h>

#include <windows.h>

void sScreen(char str[],int len,int f)//len:内容长度,不包含结束符号。f=1向左移动。f=0向右移动

int main()

{

  char str[]="I LOVE YOU"

  while(1)

  {

      printf("%s\n",str)

      sScreen(str,10,0)

      Sleep(1000)

      system("cls")

  }

  return 0

}

void sScreen(char str[],int len,int f)

{

  int i

  char c

  if(f)

  {

      c=str[0]

      for(i=0i<len-1i++)

          str[i]=str[i+1]

      str[len-1]=c

  }

  if(!f)

  {

      c=str[len-1]

   扮如   for(i=len-1i>0i--)

          str[i]=str[i-1]

      str[0]=c

  }

}

以下代码实现字符从右到左循环滚动.

C语言控册仔乎戚禅制台程序

#include <stdio.h>

#include <string.h>

#include 州悉<windows.h>

int main()

{

char str[100] = "HELLO WORLD! GOOD BYE!"

int i,j

for(i=0i<strlen(str)i++)

{

system("cls")

for(j=ij<strlen(str)j++)

{

printf("%c",str[j])

}

Sleep(100)

printf("\n")

}

return 0

}

在软件启动时,为了加深软件在用户头脑中的印象,可以在软件封面上由下而上循环滚动显示一些包含软件名称、功能、版本、用户名、研制单位等文字信息,在用户按下任意键或点击鼠标键后,立即结束演示进入程序主界面。本文通过向工程中添加Splash screen组件,然后在CsplashWnd类中添加DrawText成员方便地实现了具有滚动文字效果的软件封面,其中文字的位置、对齐方式、字体祥猛型、字号、颜色都由程序来控制。

---- 详细设计步骤如下:

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

---- 2.向工程中添加Splash screen组件,即添加一个CWnd类的派生类CsplashWnd;

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

---- 4.向CsplashWnd类中添加一个公有成员函数DrawText,此函数用来在软件封面中显示文字,的实现代码如下:(其中参数含义分别为:内存dc,文字位置,对齐方式,字体,字号,颜色,正文文字)

void CSplashWnd::DrawText(CDC *pDC,

int x, int y, int nAlign,

CString sFontName, int nFONTSIZE0,

COLORREF crTextColor, CString 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_TOPbreak

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.在SPLASH.CPP中加入以下预定义命令:

#define TITLECOLOR RGB(0,0,255)//默认标题颜色

#define CONTENTCOLOR RGB(0,255,255)//默认说明文字颜色

#define FONTSIZE0 15 //默认字号

---- 7. 在CsplashWnd类Create中拷贝矩形区域到m_TextRect ;

BOOL CSplashWnd::Create

(CWnd* pParentWnd /*= NULL*/)

{......

m_TextRect.CopyRect

(&CRect(50,100,500,300))

......

}

---- 8. 在CsplashWnd类的成员OnPaint中添加代码,响应显示窗口时发送的WM_PAINT消息。

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", FONTSIZE0+5,TITLECOLOR,"研制单位")

DrawText(&m_dcText,nMidx,nBasey+30, 1,

"楷体_GB2312", FONTSIZE0,CONTENTCOLOR,

"武警指挥学院模拟中心")

DrawText(&m_dcText,nMidx,nBasey+50, 1,

"楷体_GB2312", FONTSIZE0,TITLECOLOR,"邮政编码")

DrawText(&m_dcText,nMidx,nBasey+70, 1,

"楷体_GB2312", FONTSIZE0,CONTENTCOLOR,"300350")

dc.BitBlt(0, 0, bm.bmWidth,

bm.bmHeight,&m_dcText, 0,0, SRCCOPY)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12507552.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存