|
你想拥有自己的电子家庭影集吗?其实用VB就能实现。方法如下:
准备:家庭普通照片经扫描后储存。
构想:照片一张接一张出现在屏幕中间,出现时的方式采取动态切换,上方一行标题从左向右移过,标题与照片的背景色随机变化。
关键:调用Bitblt Windows API函数实现照片的动态切换。
内容:工程由Form1和modlue1构成。
Form1中的内容如下:
Const bmpfilemax = 11 ′照片数目常量 Dim bmpfile(bmpfilemax) As String ′照片的文件组 Dim drawbmpmode(bmpfilemax) As Integer '照片的切换方式 Dim bmpnum, movestep, xmax, ymax, endmax, lleft, r, n As Integer ′照片的序号、步进参数等 Dim kxy As Single ′x、y方向的比例 Private Sub Exit_Click() End End Sub Private Sub Form_Load() Label1.Left = 0 Label1.Caption = ″Family Album″ Picture1.AutoSize = True Picture1.Visible = False bmpfile(0) = App.Path + ″ \son1.jpg″ bmpfile(1) = App.Path + ″\mom_son1.jpg″ bmpfile(2) = App.Path + ″\daddy-son.jpg″ bmpfile(3) = App.Path + ″\yu99yantai.jpg″ bmpfile(4) = App.Path + ″\yu98singap2.jpg″ bmpfile(5) = App.Path + ″\yu98singapore.jpg″ bmpfile(6) = App.Path + ″\mom_son2.jpg″ bmpfile(7) = App.Path + ″\yu99yan2.jpg″ bmpfile(8) = App.Path + ″\family.jpg″ bmpfile(9) = App.Path + ″\fan-yantai.jpg″ bmpfile(10) = App.Path + ″\yu99yan3.jpg″ drawbmpmode(bmpnum) = 1 + Int(Rnd() * 4) movestep = 0 ′步进参数 xmax = Form1.ScaleWidth / ymax = Form1.ScaleHeight / kxy = ymax / xmax Picture1.Picture = LoadPicture(bmpfile(bmpnum)) Timer1.Interval = 30 End Sub Private Sub Timer1_Timer() m = Form1.ScaleWidth / - Picture1.Width / ′照片显示结束时的X方向居中定位 n = Form1.ScaleHeight / - Picture1.Height / ′照片显示结束时的Y方向居中定位 hDestDC = Form1.hDC hSrcDC = Picture1.hDC drawflag = drawbmpmode(bmpnum) ′照片显示时的切换方式 Select Case drawflag Case 1 ′切换方式为从左右向中间进行 Timer1.Interval = 30 endmax = xmax w = movestep h = Picture1.Height i = BitBlt(hDestDC, 0 + m, 0 + n, w, h, hSrcDC, 0, 0, SRCCOPY) X1 = Picture1.Width - movestep i = BitBlt(hDestDC, X1 + m, 0 + n, w, h, hSrcDC, X1, 0, SRCCOPY) Case 2 ′切换方式为从中间向四周扩散进行 Timer1.Interval = 30 endmax = xmax X1 = xmax - movestep w = movestep * 2 Y1 = CInt(ymax - movestep * kxy) h = CInt(2 * movestep) i = BitBlt(hDestDC, X1 + m, Y1 + n, w, h, hSrcDC, X1, Y1, SRCCOPY) Case 3 ′切换方式为栅栏翻转进行 Timer1.Interval = 200 ednmax = CInt(2 * xmax / 10) tempi = CInt(2 * xmax / 10) w = movestep h = Picture1.ScaleHeight For ij = 0 To 9 i = BitBlt(hDestDC, tempi * ij + m, 0 + n, w, h, hSrcDC, tempi * ij, 0, SRCCOPY) Next ij Case 4 ′切换方式为从左向右进行 Timer1.Interval = 30 endmax = xmax w = movestep * 2 h = Form1.ScaleHeight i = BitBlt(hDestDC, 0 + m, 0 + n, w, h, hSrcDC, X1, Y1, SRCCOPY) End Select Form1.Refresh movestep = movestep + 4 Label1.Left = movestep If movestep > endmax + 60 Then bmpnum = bmpnum + 1 If bmpnum >= bmpfilemax Then bmpnum = 0 End If Cls movestep = 0 Picture1.Picture = LoadPicture(bmpfile(bmpnum)) drawbmpmode(bmpnum) = 1 + Int(Rnd() * 4) BackColor = QBColor(Rnd * 15) Label1.ForeColor = QBColor(Rnd * 10) If BackColor = Label1.ForeColor Then Label1.ForeColor = vbBlack End If Label1.Caption = ″Family Album″ Label1.Top = Picture1.Top End If End Sub Modlue1中的内容如下: Option Explicit Public Const SRCCOPY = &HCC0020 ' (DWORD) dest = source Declare Function BitBlt Lib ″gdi32″ (ByVal hDestDC As _ Long, ByVal x As Long, ByVal Y As Long, ByVal nWidth _ As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, _ ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
|