Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Di chuyển đối tượng bitmap với VC++ MFC

  1. #1
    Ngày gia nhập
    11 2008
    Bài viết
    10

    Red face Di chuyển đối tượng bitmap với VC++ MFC

    Xin chào các anh chị !

    Em muốn hỏi là làm thế nào hay hàm gì để lấy tọa độ hiện tại của một đối tượng bitmap đã được nạp ra cửa sổ. Ý tưởng của em là nạp 1 ảnh bitmap ra cửa sổ rồi cho nó di chuyển theo một thuật toán vẽ đường (tròn) khác.

    Em đã search và ko tìm được kết quả , mất hơn 1 ngày, tuy đã có chủ đề tương tự nhưng mọi người bàn về 3D . Em mới học môn visual c++ mong anh chị giúp em.

    Em viết trên nền W32 Applications.

    Dưới là ảnh demo và source
    Link esnip
    http://www.esnips.com/doc/ad4de8e6-1...3d6b6fb/bitmap
    http://www.esnips.com/web/helpsme/

    Link savefile
    http://www.savefile.com/files/2101742

    Link zshare
    http://www.zshare.net/download/599568119270e4d3/

    Link megashare
    http://d01.megashares.com/dl/e51aa71/bitmap.rar

    Link uploading
    http://uploading.com/files/HR7UM18R/bitmap.rar.html







    Code:
    C++ Code:
    1. #include<windows.h>
    2. #include<stdio.h>
    3. //
    4. char szAppName[50]="BIT MAP PROGRAM";
    5. HINSTANCE hInst;
    6. HBITMAP bitmap1,bitmap2;
    7.  
    8. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    9.  
    10. //
    11. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,PSTR szCmdLine,int iCmdShow)
    12. {
    13. MSG msg;
    14. HWND hwnd;
    15. WNDCLASS wc;
    16. hInst=hInstance;
    17.  
    18. wc.cbClsExtra=0;
    19. wc.cbWndExtra=0;
    20. wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    21. wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    22. wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    23. wc.hInstance = hInstance;
    24. wc.lpfnWndProc = WndProc;
    25. wc.lpszClassName = szAppName;
    26. wc.lpszMenuName = NULL;
    27. wc.style = CS_VREDRAW|CS_HREDRAW;
    28.  
    29. if(!RegisterClass(&wc))
    30. {
    31.     MessageBox(NULL,"Loi dang ky cua so","Thong bao",MB_ICONERROR);
    32.     return 0;
    33. }
    34.  
    35. hwnd=CreateWindow(
    36.                   szAppName,
    37.                   "BITMAP PROGRAM",
    38.                   WS_OVERLAPPEDWINDOW,
    39.                   CW_USEDEFAULT,
    40.                   CW_USEDEFAULT,
    41.                   CW_USEDEFAULT,
    42.                   CW_USEDEFAULT,
    43.                   NULL,
    44.                   NULL,
    45.                   hInst,
    46.                   NULL,);
    47.  
    48. ShowWindow(hwnd,iCmdShow);
    49. UpdateWindow(hwnd);
    50.  
    51. while(GetMessage(&msg,NULL,0,0))
    52. {
    53.     TranslateMessage(&msg);
    54.     DispatchMessage(&msg);
    55. }
    56. return msg.wParam;
    57. }
    58.  
    59. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    60. {
    61.  
    62.     HDC hdc1,hdc2;
    63.     static BITMAP bm;
    64.     PAINTSTRUCT ps;
    65.  
    66. switch(msg)
    67. {
    68.     case WM_CREATE:
    69.         bitmap1=LoadBitmap(hInst,"anh1");
    70.         bitmap2=LoadBitmap(hInst,"anh2");
    71.         GetObject(bitmap1,sizeof(BITMAP),(PSTR)&bm);
    72.         GetObject(bitmap2,sizeof(BITMAP),(PSTR)&bm);
    73.  
    74.         return 0;
    75.     case WM_PAINT:
    76.         hdc1=BeginPaint(hwnd,&ps);
    77.  
    78.         MoveToEx(hdc1,100,100,NULL);
    79.        
    80.         hdc1=GetDC(hwnd);
    81.         hdc2=CreateCompatibleDC(hdc1);
    82.         SelectObject(hdc2,bitmap1);
    83.         BitBlt(hdc1,LOWORD(lParam),HIWORD(lParam),bm.bmWidth,bm.bmHeight,hdc2,0,0,SRCCOPY);
    84.        
    85.         ReleaseDC(hwnd,hdc1);
    86.         DeleteDC(hdc2);
    87.  
    88.         EndPaint(hwnd,&ps);
    89.  
    90.         break;
    91.  
    92.     case WM_DESTROY:
    93.         DeleteObject(bitmap1);
    94.         DeleteObject(bitmap2);
    95.         PostQuitMessage(0);
    96.        
    97.         return 0;
    98.  
    99. }
    100. return DefWindowProc(hwnd,msg,wParam,lParam);
    101. }
    Đã được chỉnh sửa lần cuối bởi mercury86 : 13-05-2009 lúc 06:26 PM.

  2. #2
    Ngày gia nhập
    11 2008
    Bài viết
    10

    Hok có ai à.
    các cô các chú bác giúp cháu với, cháu đang cần gấp

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn kiếm host khác up đi, host này bắt đăng ký phiền phức quá.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #4
    Ngày gia nhập
    04 2009
    Nơi ở
    một căn hộ nhỏ trên trái đất
    Bài viết
    372

    BITMAP là đối tượng mà bạn chỉ có thể chỉ ra tọa độ để in nó ra trên màn hình, vào bộ nhớ hay vào máy in, không có thuộc tính nào của BITMAP có thể giúp bạn biết đối tượng đang ở đâu trên màn hình. Bạn hãy để ý hàm BitBlt (bit block transfer), nó sẽ copy từ một DC nguồn sang DC đích (DC nghĩa là device context) với tọa độ được chỉ ra. Tham khảo MSDN để biết thêm thông tin về hàm này, và hãy chú ý tham số cuối cùng, chỉ ra cách thức copy (raster operation). Rất tiếc mình hiện không có thời gian để nói cụ thể về hàm này. Mình dùng copy để cho bạn dễ hiểu, thực ra không hẳn là copy, mà đúng như tên gọi của nó (bit block transfer- dịch chuyển từng khối bit)

  5. #5
    Ngày gia nhập
    11 2008
    Bài viết
    10

    Ra là vậy, em up lên mấy host mới rồi, mong anh giúp cho

    Link savefile
    http://www.savefile.com/files/2101742

    Link zshare
    http://www.zshare.net/download/599568119270e4d3/

    Link megashare
    http://d01.megashares.com/dl/e51aa71/bitmap.rar

    Link uploading
    http://uploading.com/files/HR7UM18R/bitmap.rar.html

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định Di chuyển đối tượng bitmap với VC++ MFC

    Mình không hiểu ý bạn lắm. Mình làm một ví dụ để di chuyển bitmap theo hình chữ nhật, hy vọng gần giống ý của bạn.

    C++ Code:
    1. // test.cpp : Defines the entry point for the application.
    2. //
    3.  
    4. #include "stdafx.h"
    5. #include "resource.h"
    6. #include<windows.h>
    7. #include<stdio.h>
    8. //
    9. char szAppName[50]="BIT MAP PROGRAM";
    10. HINSTANCE hInst;
    11. HBITMAP bitmap1,bitmap2;
    12.  
    13. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    14.  
    15. int x = 0, y = 0, direction = 0;
    16.  
    17. //
    18. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,PSTR szCmdLine,int iCmdShow)
    19. {
    20.     MSG msg;
    21.     HWND hwnd;
    22.     WNDCLASS wc;
    23.     hInst=hInstance;
    24.  
    25.     wc.cbClsExtra=0;
    26.     wc.cbWndExtra=0;
    27.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    28.     wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    29.     wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    30.     wc.hInstance = hInstance;
    31.     wc.lpfnWndProc = WndProc;
    32.     wc.lpszClassName = szAppName;
    33.     wc.lpszMenuName = NULL;
    34.     wc.style = CS_VREDRAW|CS_HREDRAW;
    35.  
    36.     if(!RegisterClass(&wc))
    37.     {
    38.         MessageBox(NULL,"Loi dang ky cua so","Thong bao",MB_ICONERROR);
    39.         return 0;
    40.     }
    41.  
    42.     hwnd=CreateWindow(
    43.                       szAppName,
    44.                       "BITMAP PROGRAM",
    45.                       WS_OVERLAPPEDWINDOW,
    46.                       CW_USEDEFAULT,
    47.                       CW_USEDEFAULT,
    48.                       CW_USEDEFAULT,
    49.                       CW_USEDEFAULT,
    50.                       NULL,
    51.                       NULL,
    52.                       hInst,
    53.                       NULL,);
    54.  
    55.     ShowWindow(hwnd,iCmdShow);
    56.     UpdateWindow(hwnd);
    57.  
    58.     while(GetMessage(&msg,NULL,0,0))
    59.     {
    60.         TranslateMessage(&msg);
    61.         DispatchMessage(&msg);
    62.     }
    63.     return msg.wParam;
    64. }
    65.  
    66. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    67. {
    68.     RECT rect;
    69.     HDC hdc1,hdc2;
    70.     static BITMAP bm;
    71.     PAINTSTRUCT ps;
    72.  
    73.     GetClientRect(hwnd,&rect);
    74.  
    75.     switch(msg)
    76.     {
    77.         case WM_CREATE:
    78.             bitmap1=LoadBitmap(hInst,"anh1");
    79.             bitmap2=LoadBitmap(hInst,"anh2");
    80.             //bitmap1=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
    81.             //bitmap2=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP2));
    82.             GetObject(bitmap1,sizeof(BITMAP),(PSTR)&bm);
    83.             GetObject(bitmap2,sizeof(BITMAP),(PSTR)&bm);
    84.             SetTimer(hwnd,0,100,NULL);
    85.  
    86.             return 0;
    87.  
    88.         case WM_PAINT:
    89.             hdc1=BeginPaint(hwnd,&ps);
    90.  
    91.             MoveToEx(hdc1,100,100,NULL);
    92.        
    93.             hdc1=GetDC(hwnd);
    94.             hdc2=CreateCompatibleDC(hdc1);
    95.             SelectObject(hdc2,bitmap1);
    96.             BitBlt(hdc1,x,y,bm.bmWidth,bm.bmHeight,hdc2,0,0,SRCCOPY);
    97.        
    98.             ReleaseDC(hwnd,hdc1);
    99.             DeleteDC(hdc2);
    100.  
    101.             EndPaint(hwnd,&ps);
    102.  
    103.             break;
    104.  
    105.         case WM_TIMER:
    106.             switch (direction)
    107.             {
    108.                 case 0:
    109.                     x += 20;
    110.                     if (x >= (rect.right - 100))
    111.                     {
    112.                         x = rect.right - 100;
    113.                         direction++;
    114.                     }
    115.                     break;
    116.  
    117.                 case 1:
    118.                     y += 20;
    119.                     if (y >= (rect.bottom - 100))
    120.                     {
    121.                         y = rect.bottom - 100;
    122.                         direction++;
    123.                     }
    124.                     break;
    125.  
    126.                 case 2:
    127.                     x -= 20;
    128.                     if (x <= 0)
    129.                     {
    130.                         x = 0;
    131.                         direction++;
    132.                     }
    133.                     break;
    134.                
    135.                 default:
    136.                     y -= 20;
    137.                     if (y <= 0)
    138.                     {
    139.                         y = 0;
    140.                         direction = 0;
    141.                     }
    142.                     break;
    143.             }
    144.  
    145.             RedrawWindow(hwnd,&rect,NULL,RDW_ERASE | RDW_INVALIDATE);
    146.             break;
    147.  
    148.         case WM_DESTROY:
    149.             DeleteObject(bitmap1);
    150.             DeleteObject(bitmap2);
    151.             PostQuitMessage(0);
    152.        
    153.             return 0;
    154.  
    155.     }
    156.  
    157.     return DefWindowProc(hwnd,msg,wParam,lParam);
    158. }
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  7. #7
    Ngày gia nhập
    04 2009
    Nơi ở
    một căn hộ nhỏ trên trái đất
    Bài viết
    372

    Di chuyển của bạn không được tối ưu, nhìn không được mượt và tốn tài nguyên máy tính. Nguyên nhân không mượt là vì là vì phần tọa độ, bạn dịch chuyển 20 bước, còn về phần lãng phí tài nguyên, nguyên nhân là do bạn dùng hàm RedrawWindow, vẽ lại vùng trong cửa sổ, mà ở đây là vẽ lại toàn bộ cửa sổ, sơn lại màu nền (màu trắng) trước khi in ra bitmap với vị trí mới trên màn hình.
    Mình nghĩ đến khả năng dùng raster operation (tham số cuối cùng của Bitblt) hoặc chí ít cũng hạn chế vùng vẽ.

  8. #8
    Ngày gia nhập
    11 2008
    Bài viết
    10

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Mình không hiểu ý bạn lắm. Mình làm một ví dụ để di chuyển bitmap theo hình chữ nhật, hy vọng gần giống ý của bạn.
    đoạn code tuyệt vời !, em đang ngâm cứu , nếu rảnh anh có thế trình bày ý tưởng đc hok ?
    Liệu có thế áp dụng cho nhiều đối tượng bitmap ko nhỉ ?

    ps: em định làm bài tập lớn thiết kế game chống cửa giống như thế này http://socvui.com/Game_Play/Game_Tri...thap_canh.html

  9. #9
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    @mercury86 :
    Tham số thứ 2 và 3 của hàm BitBlt là tọa độ x, y để vẽ bitmap. Bạn thay đổi nó thì bitmap sẽ di chuyển. Còn thay đổi thế nào thì tùy vào thuật toán di chuyển của bạn.

    Chỗ hàm SelectObject ( trên hàm BitBlt ) bạn đổi bitmap1 thành bitmap2 thì nó sẽ vẽ ảnh thứ 2.

    @icttrack : thanks. Tại cái này mình code nhanh để minh họa mà, mấy cái kia từ từ tác giả sẽ mở rộng sau.
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 13-05-2009 lúc 07:25 PM.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  10. #10
    Ngày gia nhập
    11 2008
    Bài viết
    10

    Trích dẫn Nguyên bản được gửi bởi icttrack Xem bài viết
    Di chuyển của bạn không được tối ưu, nhìn không được mượt và tốn tài nguyên máy tính. Nguyên nhân không mượt là vì là vì phần tọa độ, bạn dịch chuyển 20 bước, còn về phần lãng phí tài nguyên, nguyên nhân là do bạn dùng hàm RedrawWindow, vẽ lại vùng trong cửa sổ, mà ở đây là vẽ lại toàn bộ cửa sổ, sơn lại màu nền (màu trắng) trước khi in ra bitmap với vị trí mới trên màn hình.
    Mình nghĩ đến khả năng dùng raster operation (tham số cuối cùng của Bitblt) hoặc chí ít cũng hạn chế vùng vẽ.
    để nuột hơn em thêm hàm SetTimer(hwnd,1,1,NULL);
    vào đoạn
    C++ Code:
    1.     ShowWindow(hwnd,iCmdShow);
    2.     SetTimer(hwnd,1,1,NULL);//<<<<<<=========
    3.     UpdateWindow(hwnd);
    và chỉnh lại bước nhảy của ảnh nhỏ hơn thì kết quả trông rất nuột.

    Còn về vdd tài nguyên, em thay RedrawWindow(hwnd,&rect,NULL,RDW_ERASE | RDW_INVALIDATE);

    bằng hàm InvalidateRect(hwnd,&rect,1);
    như vầy:
    C++ Code:
    1.         case WM_TIMER:
    2.             switch (direction)
    3.             {
    4.                 case 0:
    5.                     x += 10;
    6.                     if (x >= (rect.right - 100))
    7.                     {
    8.                         x = rect.right - 100;
    9.                         direction++;
    10.                     }
    11.                     break;
    12.  
    13.                 case 1:
    14.                     y += 10;
    15.                     if (y >= (rect.bottom - 100))
    16.                     {
    17.                         y = rect.bottom - 100;
    18.                         direction++;
    19.                     }
    20.                     break;
    21.  
    22.                 case 2:
    23.                     x -= 10;
    24.                     if (x <= 0)
    25.                     {
    26.                         x = 0;
    27.                         direction++;
    28.                     }
    29.                     break;
    30.                
    31.                 default:
    32.                     y -= 10;
    33.                     if (y <= 0)
    34.                     {
    35.                         y = 0;
    36.                         direction = 0;
    37.                     }
    38.                    
    39.                     break;
    40.                
    41.             }
    42.  
    43. //            RedrawWindow(hwnd,&rect,NULL,RDW_ERASE | RDW_INVALIDATE);
    44.             InvalidateRect(hwnd,&rect,1); //<<<<<<<<=========
    45.  
    46.             break;

    không biết có tối ưu hơn không ?

Các đề tài tương tự

  1. Thuật toán C# Thuật toán chuyển ảnh bitmap 24bit về 8bit như thế nào?
    Gửi bởi thuccoi trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 3
    Bài viết cuối: 09-01-2013, 09:14 PM
  2. Graphic Chuyển Icon sang Bitmap bị nền đen thì xử lý thế nào?
    Gửi bởi XbikeNR125 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 11-01-2012, 01:13 PM
  3. Cách lưu lại ảnh Bitmap trong mỗi lần di chuyển?
    Gửi bởi hoangha90 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 25-04-2011, 09:26 PM
  4. Vẽ bitmap chuyển động, hình bị giật
    Gửi bởi khanhnghia trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 16-05-2010, 07:51 PM
  5. Convert BMP to RBG | Chuyển ảnh từ Bitmap sang Vector. Giúp mình sửa lỗi???
    Gửi bởi hoangsonk49 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 28-05-2009, 01:02 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn