Anh có thể viết em xem file mẫu được không? Cái phần API em còn gà quá.
Nhưng bạn muốn biết cái gì? Cái con cá?
Nếu là hoạt hình ở mức ABC như tôi nói thì tôi không có đủ kiên nhẫn để soạn 2 tập tin với con cá nhưng nếu coi 1 hình tròn đỏ là con cá thì như tập tin đính kèm.
Nếu là dịch chuyển con cá - hình tròn đỏ thì các bước như sau:
Ảnh là hình tròn nhưng ảnh bao giờ cũng là hình vuông., giả sử có cạnh = a. Mỗi lần dịch là deltaX, deltaY (pixels)
1. Xác định xStart, yStart
2. Đọc device context của màn hình (GetDC). Tạo memory device context source srcDC (CreateCompatibleDC). Tạo bitmap srcBmp(CreateCompatibleBitmap) có dài và cao = a. Chọn srcBmp vào srcDC -> dùng BitBlt copy màn hình có tọa độ từ xStart, yStart và width = a, height = a vào srcDC. Mục đích để cất giữ ảnh nguồn.
3. Copy liên tiếp 2 ảnh con cá vào xStart, yStart như tôi làm trong tập tin đính kèm trong Sub animation (thay cho 200, 200 thì là xStart, yStart). Con cá đã được copy lên màn hình.
4. Sleep một tí.
5. dùng BitBlt copy từ srcDC vào device context của màn hình (GetDC) vào xStart, yStart để trả lại ảnh của màn hình trước khi copy con cá vào.
6. xStart = xStart + deltaX, yStart = yStart + deltaY
7. Trở lại điểm 2.
Tóm lại chẳng qua là copy liên tiếp con cá lên màn hình ở những điểm khác nhau nhưng giữa 2 lần copy phải trả lại vùng màn hình cũ mà con cá trước đã xóa mất. Để có thể trả lại vùng mà con cá sẽ xóa thì trước khi copy vào đâu thì sao chép nó ra srcDC -> copy con cá -> trả lại vùng đã sao chép -> tăng xStart, yStart -> sao chép vùng ở vị trí mới ra srcDC -> copy con cá vào vị trí mới -> trả lại vùng đã sao chép -> tăng xStart, yStart -> ...
Nôm na là thế. Tất nhiên sau mỗi lần thao tác cần giải phóng resource. Nếu trước đó là GetDC (Get - đọc ra, lấy ra, mượn syatem) thì sau đó ReleaseDC (release - giải phóng, trả lại). Nếu là CreateCompatibleDC, CreateCompatibleBitmap (Create - tạo ra) thì sau đó là DeleteDC, DeleteObject (Delete - hủy) v...v
Get - đọc ra, mượn những cái CÓ trong system ->
Release - TRẢ LẠI
Create - tự TẠO RA cái mới ->
Delete - HỦY cái đã tạo.
Có mượn có trả, có "thêm rác" (chỉ dùng cho mình) vào system thì có "dọn rác" để system trở về trạng thái như cũ.
Cũng có thể thử tạo srcDC và srcBmp một lần thôi.
-------------
Cách vẽ thứ 2 là chỉ copy 1 hình con cá trên nền bất kỳ lên màn hình nhưng giới hạn vùng copy bằng Region. Trong tập tin tôi tạo region bằng CreateEllipticRgn vì con cá hình tròn. Trong thực tế thì từ đường viền con cá phải tạo region bằng CreatePolygonRgn. Nếu hình phức tạp thì tạo các region rồi dùng CombineRgn để tạo region tổng.
Trong ví dụ nhìn thấy chút viền mầu đen do tôi tạo ảnh trong Paint nhưng đường tròn và hình vuông không 100% đồng tâm.