六、效果篇

    经常看到一些注册机的界面很炫,有的还带有音乐,这篇我们就来讨论如何编写炫一点的注册机,为注册机添加背景图片,网址链接以及背景音乐。
一、  加入地址链接。
比如我在注册机中加入我的EMAIL地址链接,要用到WIN32的API函数ShellExecuteA。
VB中实现方法,先声明API函数:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
调用:
Call ShellExecute(Form1.hWnd, "Open", "mailto:langxang@126.com", "", App.Path, 1)
同样,想加入网站链接的话:
Call ShellExecute(Form1.hWnd, "open", "http://bbs.pediy.com", vbNullString, vbNullString, &H0)
DELPHI有点类似,利用ShellAPI单元中的ShellExecute,在uses句中加入ShellAPI。
ShellExecute(handle,nil,pchar(′mailto:langxang@126.com′),nil,nil,SW_SHOWNORMAL);
VC也是用ShellExecute,比较麻烦: 
生成一个新的对话框。用AppWizard建立一个基于通用窗口的新类CHyperLinkWnd,并修改代码如下:
  CHyperLinkWnd::CHyperLinkWnd() //构造函数
  { m_hLinkCursor = AfxGetApp()-〉LoadCursor(IDC_LINK); //引入手指形状的光标 }
  void CHyperLinkWnd::OnMouseMove(UINT nFlags, CPoint point)
  { ::SetCursor(m_hLinkCursor);//当鼠标在窗口上移动,光标变成手指状
   CWnd::OnMouseMove(nFlags, point);}
  BOOL CHyperLinkWnd::Create( const RECT&& rect, CWnd pParentWnd)  //创建窗口
  { return CWnd::Create ( NULL, NULL, WS_CHILD|WS_VISIBLE, rect, pParentWnd,NULL,NULL);}
  BOOL CHyperLinkWnd::SetLinkString(CString m_LinkString)
  { LinkString =m_LinkString;  //设置窗口的提示信息
   return TRUE; }
  void CHyperLinkWnd::SetLink(CString m_Link)
  { Link=m_Link; //设置链接网址信息 }
  void CHyperLinkWnd::OnLButtonDown(UINT nFlags, CPoint point)
  { ::ShellExecute(this-〉m_hWnd,"open",Link,NULL,NULL,SW_SHOWMAXIMIZED); }
  void CHyperLinkWnd::OnPaint()
  { CFont Font=NULL;
  CPaintDC dc(this); //设置超级链接中的显示字体信息,即蓝色有下划线
   dc.SetTextColor(RGB(0, 0, 255));

   dc.SetBkColor(::GetSysColor(COLOR_3DFACE));
   m_font=dc.GetCurrentFont();
   LOGFONT lFont;
   m_font-〉GetObject(sizeof(lFont), &&lFont);
   m_font=NULL;
   m_font=new CFont();
   lFont.lfUnderline=TRUE;
   m_font-〉CreateFontIndirect(&&lFont);
   dc.SelectObject(m_font);
   dc.TextOut(0,0,LinkString);}
//使用这个类的一个范例,即在一个对话框中使用这些超级链接
  BOOL CNetPrice::OnInitDialog()
  { RECT rect;
  HyperLinkWnd[0]=new CHyperLinkWnd(); //使用这个类,可以先在对话框中用一个CStatic框定位,并去掉它的Visible属性,然后用代码取得它的位置,并将超级链接窗口放上去
  m_Canton.GetWindowRect(&&rect);
  this-}ScreenToClient(&&rect);
  HyperLinkWnd[0]-}SetLinkString("广州太平洋电脑城");
  HyperLinkWnd[0]-}SetLink("www.pconline.com.cnt");
  HyperLinkWnd[0]-}Create(rect,this);
  ……//略掉部分重复代码
  HyperLinkWnd[6]=new CHyperLinkWnd();//下面这个是使用邮件链接的例子
  m_SendEMail.GetWindowRect(&&rect);
  this-}ScreenToClient(&&rect);
  HyperLinkWnd[6]-}SetLinkString("发邮件");
  HyperLinkWnd[6]-}SetLink("MailTo:langxang@126.com");
  HyperLinkWnd[6]-〉Create(rect,this);
  return TRUE;}

二、  滚动效果
滚动的原理都一样,就是将滚动条字幕的宽度与窗体的宽度对比,一旦超出范围又重新回到初始位置。
VB滚动字幕实例:
l 在Form1中的控件:
(1)Label1
Caption="滚动字幕"
Autosize=True
 (2)为构成一种阴影效果,再复制一个Label2,调整Label2的位置使其比Label1略高,并将它的文字颜色改得淡一些(设置为蓝色或红色)。
(3)Timer1
Interval=100 (0.1秒)
l 程序代码:
Private Sub Form_Load()
Label1.ForeColor = RGB(128, 128, 128) '文字阴影设为深灰色
Label2.ForeColor = RGB(255, 0, 255) '文字颜色设为粉红色
Label1.Left = Width + 50 '文字的初始位置:在窗体右端外
Label2.Left = Width
End Sub

Private Sub Timer1_Timer()
If Label1.Left < 0 - Label1.Width Then '如果文字移到窗体左端之外,
Label1.Left = Width + 50 '则将它的位置立即移回到初始位置
Label2.Left = Width  '又进入窗体
End If
Label1.Left = Label1.Left - 100 '否则文字位置向左移100个单位
Label2.Left = Label2.Left - 100 
End Sub

如果要改进滚动效果,使文字的左面一部分从窗体左端出去以后,立即从右端进入窗体,则可将程序代码作如下修改:
Private Sub Form_Load()
Label1.ForeColor = RGB(255, 0, 255) '取消阴影,使两段文字完全相同
Label2.ForeColor = RGB(255, 0, 255)
Label1.Left = 0 '一段文字放在最左端
Label2.Left = -Width '一段文字放在最左端的外面,与Label1
End Sub '相差一个窗体距离

Private Sub Timer1_Timer()
Label1.Left = Label1.Left - 50 '两段文字同时向左移
Label2.Left = Label2.Left - 50 
If Label1.Left <= -Width Then '当文字在窗体外再走完一个窗体的距离时,
Label1.Left = Width '又进入窗体
End If
If Label2.Left <= -Width Then
Label2.Left = Width
End If
End Sub

DELPHI:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 If Label1.Left < 0 – Label1.Width Then
   begin
Label1.Left := Panel1.Width ;
   end
 else
Label1.Left := Label1.Left - 1 ;
end;

VC:
在状态条中显示滚动文本。
1. 从CCstatusBar派生MyStatusBar。
2. 在MainFrm.h中,改变状态条的类型: 
CMyStatusBar m_wndStatusBar;
3. 在MainFrm.cpp中,改变indicator数组:
static UINT indicators[] =
{
ID_SEPARATOR, 
IDS_SCROLL_PANE,//scrolling text
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
4. 在资源编辑器中,增加IDS_SCROLL_PANE字符串,其内容为若干空格。窗格的大小由要显示的滚动文本来决定。 
5. 增加下面成员到CMyStatusBar: Cstring m_strScrollText; 
6. 增加Add OnTimer()到CMyStatusBar: 
void CMyStatusBar::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
if (m_strScrollText.IsEmpty())
{
KillTimer(1);
SetPaneText(CommandToIndex(IDS_SCROLL_PANE), "");
return;
}
static UINT str_idx = 0;        //offset into string
//if end of string, return to top
if (str_idx >= (UINT) (m_strScrollText.GetLength() / 2) - 1)
{
str_idx = 0;
}
//display string
SetPaneText(CommandToIndex(IDS_SCROLL_PANE), ((LPCSTR) 
m_strScrollText)+str_idx); 
//scroll one character
str_idx = str_idx + 1;
CStatusBar::OnTimer(nIDEvent);
}
7. 撤除定时器: 

void CMyStatusBar::OnDestroy() 
{
CStatusBar::OnDestroy();
// TODO: Add your message handler code here
KillTimer(1);
}
8. 增加显示滚动文本的方法,该方法必须在主框架窗口创建后调用,通常在 CWinApp::InitInstance()中调用:
void CMyStatusBar::StartDisplay(void) 
{
//set text for scrolling
m_strScrollText = "   Hello! World.   "
//to make it circular scroll
m_strScrollText += m_strScrollText;
KillTimer(1);
VERIFY(SetTimer(1, 200, NULL) != 0);    //timer
}
三、  添加图片
添加位图没什么好说的,都可以直接导入。VC稍微麻烦点,可以在insert resource 中选import bitmap,在导入资源对话框中选择文件类型为所有文件(*.*),打开方式为AUTO,然后选择要导入的BMP图片既可。
四、  背景音乐
    XM是一种比较小的音乐,非常适合做注册机音乐。论坛中也有很多相关的文章,尤其是其中的uFMOD v1.08工具,非常好用,自动转化XM文件为各种程序的OBJ文件。eff.exe工具可以直接转XM音乐为DELPHI的PAS文件,和C语言的.C文件以及汇编的.ASM文件,还生成eff.inc库文件。可以直接到论坛下载该工具,里面都有源码和说明。
另外,论坛会员tankaiha写的文章“在VC6的工程中加入播放xm音乐的功能”讲的非常详细,可以对照那个在MFC中加入音乐。
附件中是我做的三种语言的最终编译后的效果,大家可以看一下。


【版权声明】:  本文由langxang原创于看雪论坛,转载请注明作者并保持文章的完整, 谢谢!