Lập trình VBA tạo ảnh chuyển động trên Userform với BSAC

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Sao anh không làm 1 control hỗ trợ ảnh gif luôn đi anh

Anh chưa làm được đấy e :D, sau này BSImage trong BSAC có thể hỗ trợ ảnh gif chuyển động luôn. VÍ dụ này hướng dẫn khai thác BSImageList làm nền tảng kết nối với vài control khác như BSTreeView, BSListView, BSListBox, BSComboBox.
 
Nếu chỉ dùng 1 control đọc ảnh gif thì làm sao cho nó di chuyển từ A -> B ứng với chuyển động được em. :)
hihi em nghĩ chắc cũng giống nguyên tắc anh tuân làm thôi, khi nào Add ảnh Gif thì kiểm tra và tách ảnh gif lưu vào Imagelist rồi chạy qua các ảnh
 
hihi em nghĩ chắc cũng giống nguyên tắc anh tuân làm thôi, khi nào Add ảnh Gif thì kiểm tra và tách ảnh gif lưu vào Imagelist rồi chạy qua các ảnh

Có nguyên tắc cơ bản là như vậy nhưng gif động sẽ không linh hoạt bặt việc tự do draw ảnh với định hướng tuỳ biến xoay, đảo chiều theo một action thừ bàn phím hay chuột.
 
7 hay 8 năm trước anh @batman1 có làm trên vb6 con cá bơi trên form và màn hình pc code Trên GPE..., tìm là thấy
 
7 hay 8 năm trước anh @batman1 có làm trên vb6 con cá bơi trên form và màn hình pc code Trên GPE..., tìm là thấy
Quãng 6 năm 8 tháng.

Nguyên tắc thì đơn giản thôi. Chiếu phim là gì? Là chiếu các khung ảnh liên tiếp nhau theo một tốc độ nhất định, vd. 25 khung / 1 giây. Thế thôi. Hoạt hình thì nguyên lý cũng là thế. Chỉ là các khung là hình vẽ chứ không là hình chụp.

Thực ra Excel không phải là chương trình đồ họa, không dùng để tạo phim hoạt hình. Còn để chơi tí cho vui thì không cần tới control hay phụ thuộc vào code ngoài.

Nếu ta có 1 khung hình nhỏ hơn nền nhiều thì ta cũng có thể dịch chuyển khung hình trên nền đó để tạo nên chuyển động. Ví dụ thì là con cá trôi


Tức nếu ta muốn chiếu 25 khung hình trong 1 giây thì ta dùng đồng hồ, cứ 40 ms thì copy khung hình sang vị trí mới trên nền. Tất nhiên phải nhớ vị trí trước để sau đó trước khi copy sang vị trí mới thì phải xóa hình cũ ở vị trí trước.

Nhưng nếu ta có 16 ảnh thì ta cũng có thể dùng vd. Image. Cứ mỗi 40 ms thì ta nhập ảnh mới rồi hiển thị Image ở vị trí mới. Hiển thị Image ở vị trí mới chẳng qua là thay đổi Left và Top của Image. Ví dụ trong tập tin đính kèm. Tất nhiên làm như này hoạt hình thỉnh thoảng sẽ nháy nháy. Nhưng đây là cách chỉ chơi cho vui, ai cũng tự làm được, không cần nhờ người khác, không phụ thuộc vào code, control của người khác. Chơi trong Excel thế là đủ giải trí. Excel dùng để làm việc chứ không phải dùng để tạo hoạt hình. Tất nhiên nếu đã bỏ công viết phần mềm đồ họa trong vd. Delphi thì sẽ phải thực hiện các thao tác đồ họa chứ không thể chỉ load ảnh vào Image rồi dịch chuyển Image. Nhưng đó là phần mềm đồ họa chuyên nghiệp ở mức độ nào đó. Còn trong Excel người ta làm việc khác. Hoạt hình là chơi tí cho thỏa tò mò thôi.
 

File đính kèm

  • Animation.rar
    144.4 KB · Đọc: 46
Quãng 6 năm 8 tháng.

Nguyên tắc thì đơn giản thôi. Chiếu phim là gì? Là chiếu các khung ảnh liên tiếp nhau theo một tốc độ nhất định, vd. 25 khung / 1 giây. Thế thôi. Hoạt hình thì nguyên lý cũng là thế. Chỉ là các khung là hình vẽ chứ không là hình chụp.

Thực ra Excel không phải là chương trình đồ họa, không dùng để tạo phim hoạt hình. Còn để chơi tí cho vui thì không cần tới control hay phụ thuộc vào code ngoài.

Nếu ta có 1 khung hình nhỏ hơn nền nhiều thì ta cũng có thể dịch chuyển khung hình trên nền đó để tạo nên chuyển động. Ví dụ thì là con cá trôi


Tức nếu ta muốn chiếu 25 khung hình trong 1 giây thì ta dùng đồng hồ, cứ 40 ms thì copy khung hình sang vị trí mới trên nền. Tất nhiên phải nhớ vị trí trước để sau đó trước khi copy sang vị trí mới thì phải xóa hình cũ ở vị trí trước.

Nhưng nếu ta có 16 ảnh thì ta cũng có thể dùng vd. Image. Cứ mỗi 40 ms thì ta nhập ảnh mới rồi hiển thị Image ở vị trí mới. Hiển thị Image ở vị trí mới chẳng qua là thay đổi Left và Top của Image. Ví dụ trong tập tin đính kèm. Tất nhiên làm như này hoạt hình thỉnh thoảng sẽ nháy nháy. Nhưng đây là cách chỉ chơi cho vui, ai cũng tự làm được, không cần nhờ người khác, không phụ thuộc vào code, control của người khác. Chơi trong Excel thế là đủ giải trí. Excel dùng để làm việc chứ không phải dùng để tạo hoạt hình. Tất nhiên nếu đã bỏ công viết phần mềm đồ họa trong vd. Delphi thì sẽ phải thực hiện các thao tác đồ họa chứ không thể chỉ load ảnh vào Image rồi dịch chuyển Image. Nhưng đó là phần mềm đồ họa chuyên nghiệp ở mức độ nào đó. Còn trong Excel người ta làm việc khác. Hoạt hình là chơi tí cho thỏa tò mò thôi.
Tự khen chút là trí nhớ em tuyệt vời ... gần như Anh làm cái gì mà em thấy thích kể cả trên 7 or 8 năm gì đó mà em vẫn nhớ ???!!!
-0-0-0- -0-0-0--0-0-0-
 
Ví dụ này mục tiêu để ai đó biết dùng BSImageList trong BSAC, nó là control lưu trữ ảnh quan trọng phục vụ cho vài control hay dùng khác như BSTreeView, BSListView, BSListBox, BSComboBox, .... Game chỉ để thư giãn ... rồi lại phục vụ cho học tập tập khác thôi mà.
Hình ảnh dưới đây là kết hợp BSImageList, BSTreeView, BSTaskPaneX
D37264DE-ECE2-4EF6-9381-38E0F263D917.jpeg

Sẽ còn vài trò giải trí nữa.... :)
 
Lần chỉnh sửa cuối:
Ví dụ này mục tiêu để ai đó biết dùng BSImageList trong BSAC, nó là control lưu trữ ảnh quan trọng phục vụ cho vài control hay dùng khác như BSTreeView, BSListView, BSListBox, BSComboBox, .... Game chỉ để thư giãn ... rồi lại phục vụ cho học tập tập khác thôi mà.
Hình ảnh dưới đây là kết hợp BSImageList, BSTreeView, BSTaskPaneX
View attachment 247182

Sẽ còn vài trò giải trí nữa.... :)
cái này mới hay nè ... còn cái con vẹt bay bay kia chỉ vui vẻ thôi :D :p
Xem hình mạnh lại nhớ Năm ngoái Anh @batman1 cho mạnh code sau .... đại ý nó cũng check check như thế ... sẻ có ngày ứng dụng nó...

1602418258877.png
 
Em cho nó bay trên Sheet luôn.
 

File đính kèm

  • ChimBay.rar
    131.2 KB · Đọc: 40
Dùng control Image để vẹt bay trên Form hay chèn picture để vẹt bay trên sheet vẫn chưa là gì to tát. Không cần control Image, không cần chèn picture mà vẹt bay trên desktop thì chỉ có vẹt "đại ca". :D
 

File đính kèm

  • Animation.rar
    279.3 KB · Đọc: 39
Dùng control Image để vẹt bay trên Form hay chèn picture để vẹt bay trên sheet vẫn chưa là gì to tát. Không cần control Image, không cần chèn picture mà vẹt bay trên desktop thì chỉ có vẹt "đại ca". :D
Bác ơi bạn Vẹt nhỏ trên máy con không bay được , khi con kích vào Vẹt bay thì báo lỗi như ảnh kèm, xong tắt luôn Excel, Bác ạ.
Máy của còn Office 64bit.

1602509539548.png
 
Quãng 6 năm 8 tháng.

Nguyên tắc thì đơn giản thôi. Chiếu phim là gì? Là chiếu các khung ảnh liên tiếp nhau theo một tốc độ nhất định, vd. 25 khung / 1 giây. Thế thôi. Hoạt hình thì nguyên lý cũng là thế. Chỉ là các khung là hình vẽ chứ không là hình chụp.

Thực ra Excel không phải là chương trình đồ họa, không dùng để tạo phim hoạt hình. Còn để chơi tí cho vui thì không cần tới control hay phụ thuộc vào code ngoài.

Nếu ta có 1 khung hình nhỏ hơn nền nhiều thì ta cũng có thể dịch chuyển khung hình trên nền đó để tạo nên chuyển động. Ví dụ thì là con cá trôi


Tức nếu ta muốn chiếu 25 khung hình trong 1 giây thì ta dùng đồng hồ, cứ 40 ms thì copy khung hình sang vị trí mới trên nền. Tất nhiên phải nhớ vị trí trước để sau đó trước khi copy sang vị trí mới thì phải xóa hình cũ ở vị trí trước.

Nhưng nếu ta có 16 ảnh thì ta cũng có thể dùng vd. Image. Cứ mỗi 40 ms thì ta nhập ảnh mới rồi hiển thị Image ở vị trí mới. Hiển thị Image ở vị trí mới chẳng qua là thay đổi Left và Top của Image. Ví dụ trong tập tin đính kèm. Tất nhiên làm như này hoạt hình thỉnh thoảng sẽ nháy nháy. Nhưng đây là cách chỉ chơi cho vui, ai cũng tự làm được, không cần nhờ người khác, không phụ thuộc vào code, control của người khác. Chơi trong Excel thế là đủ giải trí. Excel dùng để làm việc chứ không phải dùng để tạo hoạt hình. Tất nhiên nếu đã bỏ công viết phần mềm đồ họa trong vd. Delphi thì sẽ phải thực hiện các thao tác đồ họa chứ không thể chỉ load ảnh vào Image rồi dịch chuyển Image. Nhưng đó là phần mềm đồ họa chuyên nghiệp ở mức độ nào đó. Còn trong Excel người ta làm việc khác. Hoạt hình là chơi tí cho thỏa tò mò thôi.
Bác ơi , Vẹt bài này thì bay được, bay tung tăng như video của anh Tuân , Bác ạ ahihi
 
Bác ơi bạn Vẹt nhỏ trên máy con không bay được , khi con kích vào Vẹt bay thì báo lỗi như ảnh kèm, xong tắt luôn Excel, Bác ạ.
Máy của còn Office 64bit.

View attachment 247252
Rất có thể. Do tôi không có office 64 bit để test và tôi cũng không kiểm tra kỹ.

Bạn thử như sau:

1. Trong Sub TimerProc bạn thêm dòng
Mã:
StopTimer
trước dòng
Mã:
DC = GetDC(0)

2. Bạn đặt breakpoint ở dòng DC = GetDC(0) và bạn chạy code từng dòng xem ở dòng nào thì có lỗi. Nếu bị lỗi trước khi tới dòng DC = GetDC(0) thì bạn chạy từng dòng sub init xem sao.

Tôi không chắc chắn về Type GDIPlusStartupInput và
Mã:
Sub TimerProc(ByVal hwnd As LongPtr, ByVal uMsg As Long, ByVal idEvent As LongPtr, ByVal dwTime As Long)
 
Bác ơi bạn Vẹt nhỏ trên máy con không bay được , khi con kích vào Vẹt bay thì báo lỗi như ảnh kèm, xong tắt luôn Excel, Bác ạ.
Máy của còn Office 64bit.

View attachment 247252
Bạn thử sửa thành xem sao
Mã:
#If VBA7 Then
    Private Type GDIPlusStartupInput
        GdiPlusVersion As Long
        DebugEventCallback As LongPtr
        SuppressBackgroundThread As Long
        SuppressExternalCodecs As Long
    End Type
#Else
        Private Type GDIPlusStartupInput
        GdiPlusVersion As Long
        DebugEventCallback As Long
        SuppressBackgroundThread As Long
        SuppressExternalCodecs As Long
    End Type
#End If
 
Rất có thể. Do tôi không có office 64 bit để test và tôi cũng không kiểm tra kỹ.

Bạn thử như sau:

1. Trong Sub TimerProc bạn thêm dòng
Mã:
StopTimer
trước dòng
Mã:
DC = GetDC(0)

2. Bạn đặt breakpoint ở dòng DC = GetDC(0) và bạn chạy code từng dòng xem ở dòng nào thì có lỗi. Nếu bị lỗi trước khi tới dòng DC = GetDC(0) thì bạn chạy từng dòng sub init xem sao.

Tôi không chắc chắn về Type GDIPlusStartupInput và
Mã:
Sub TimerProc(ByVal hwnd As LongPtr, ByVal uMsg As Long, ByVal idEvent As LongPtr, ByVal dwTime As Long)
Con thử cách trên chưa đến dòng breakpoint thì Excel đóng xuống và treo rồi không làm gì được Bác ạ.

Bạn thử sửa thành xem sao
Mã:
#If VBA7 Then
    Private Type GDIPlusStartupInput
        GdiPlusVersion As Long
        DebugEventCallback As LongPtr
        SuppressBackgroundThread As Long
        SuppressExternalCodecs As Long
    End Type
#Else
        Private Type GDIPlusStartupInput
        GdiPlusVersion As Long
        DebugEventCallback As Long
        SuppressBackgroundThread As Long
        SuppressExternalCodecs As Long
    End Type
#End If

Con thêm đoạn này vào thì thấy Excel không treo và ẩn xuống thanh công cụ phía dưới, nhưng không thấy bạn Vẹt nào bay qua bay lại như bài trên Bác ạ.
Bài đã được tự động gộp:

Bạn thử sửa thành xem sao
Mã:
#If VBA7 Then
    Private Type GDIPlusStartupInput
        GdiPlusVersion As Long
        DebugEventCallback As LongPtr
        SuppressBackgroundThread As Long
        SuppressExternalCodecs As Long
    End Type
#Else
        Private Type GDIPlusStartupInput
        GdiPlusVersion As Long
        DebugEventCallback As Long
        SuppressBackgroundThread As Long
        SuppressExternalCodecs As Long
    End Type
#End If
Đúng là thay đoạn này Excel không bị treo và đơ nữa Bác, thao tác bình thường nhưng không nhìn thấy Vẹt Bác ạ.
 
Con thêm đoạn này vào thì thấy Excel không treo và ẩn xuống thanh công cụ phía dưới, nhưng không thấy bạn Vẹt nào bay qua bay lại như bài trên Bác ạ.
Bài đã được tự động gộp:


Đúng là thay đoạn này Excel không bị treo và đơ nữa Bác, thao tác bình thường nhưng không nhìn thấy Vẹt Bác ạ.
Thôi thì bạn nghỉ chơi đi. Vì thực ra cũng chỉ để chơi thôi mà.
 
Web KT
Back
Top Bottom