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ố 14 kết quả

Đề tài: Xử lý mảng các đối tượng

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

    Mặc định Xử lý mảng các đối tượng

    Bình thường để vẽ hình 1 bàn cờ 8*8 trong 1 cửa sổ thì em có thể vẽ bằng hàm OnDraw như sau:
    Code:
    void CMy6View::OnDraw(CDC* pDC)
    {
    	CMy6Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	// TODO: add draw code for native data here
    	CDC *dc=GetDC();
    	for(int x=0;x<320;x=x+40)
    		for(int y=0;y<320;y=y+40)
    		dc->Rectangle(x,y,x+40,y+40);
    }
    Nhưng em mới bắt đầu học lập trình hướng đối tượng nên ý tưởng của em là khai báo 1 lớp hinh rồi tạo ra 1 mảng gồm 64 đối tượng hình chữ nhật đó và vẽ nó.
    Lớp hinh của em:
    Code:
    class hinh : public CView 
    {
    	int x,y;
    public:
    	paint();
    	hinh(int ox, int oy);
    	virtual ~hinh();
    
    };
    
    hinh::hinh(int ox, int oy)
    {
    	x=ox; y=oy;
    }
    
    hinh::~hinh()
    {
    
    }
    
    hinh::paint()
    {
    	CDC *dc=GetDC();
    	dc->Rectangle(x,y,x+40,y+40);
    }
    Nhưng khi tạo mảng và vẽ ở trong hàm OnDraw thì em gặp lỗi loạn hết cả lên. Kiên thức của em về lập trình hướng đối tượng còn kém, mong các anh giúp đỡ em cách làm thế nào để khai báo mảng các đối tượng hinh đó để vẽ.
    Cám ơn các anh trước nhé!
    Đã được chỉnh sửa lần cuối bởi bboy0303 : 15-10-2008 lúc 07:35 PM.

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

    Bạn nói rõ hơn và up project lên đi, MFC mà nói chay thế này thì thua.
    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.

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

    Đây là cái project của em, hàm OnDraw của lơp CMy6view em vẫn để theo cách vẽ thẳng mà chưa dùng lập trình hướng đối tượng:
    Attached Files Attached Files
    • Kiểu file: rar 6.rar (88.5 KB, 21 views)

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

    Mình đã sửa cho bạn rồi đây.
    Attached Files Attached Files
    • Kiểu file: rar 6.rar (172.9 KB, 16 views)
    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.

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

    Cám ơn anh nhiều nhé, qua ví dụ này em hiểu thêm đc nhiều điều rồi đấy!

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

    Mặc định Xử lý mảng các đối tượng

    Em lại có 1 số vấn đề muốn hỏi anh ở bài vừa rồi:
    - Em muốn chèn các ảnh bitmap vào các ô vuông bất kỳ nên em tạo thêm hàm outbm(int x, int y):
    Code:
    CMy6View::outbm(int x, int y)
    {
    	CBitmap a;
    	a.LoadBitmap(IDB_BITMAP1);
    	CDC d,*c=GetDC();
    	d.CreateCompatibleDC(c);
    	d.SelectObject(&a);
    	c->BitBlt(x,y,40,40,&d,0,0,SRCCOPY);
    }
    Nhưng khi vẽ thì lại gặp vấn đề, ví dụ em muốn chèn bitmap lên ô vuông thứ 15:
    Code:
    void CMy6View::OnDraw(CDC* pDC)
    {
    	CMy6Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	// TODO: add draw code for native data here
    	for (int i=0;i<64;i++)
    	{
    		p_hinh[i].paint(pDC);
    		if(i=15)
    		outbm(p_hinh[i].x,p_hinh[i].y);
    	}
    }
    thì chương trình sẽ bị treo. Nhưng nếu xóa if(i=15) đi thì chương trình sẽ chèn cả 64 bitmap lên 64 ô vuông như bình thường. Anh có thể cho em biết tại lại xảy ra lỗi vậy ko ạ?
    - Lúc trước là anh tạo ra mảng 1 chiều, vậy nếu muốn tạo mảng 2 chiều 8x8 thì phải làm sao ạ (tức là để gọi được p_hinh[x][y] ý ạ)?
    Cám ơn anh nhé!

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

    Đây là projet khi thêm if(i=15) vào hàm OnDraw, xóa đi là sẽ ko bị lỗi nữa ạ:
    Attached Files Attached Files
    • Kiểu file: rar 6.rar (89.4 KB, 1 views)
    Đã được chỉnh sửa lần cuối bởi bboy0303 : 13-10-2008 lúc 04:12 PM.

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

    Đúng yêu cầu của bạn rồi đây.
    Attached Files Attached Files
    • Kiểu file: rar 6.rar (184.8 KB, 9 views)
    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.

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

    Em hiểu cách khai báo mảng đối tượng 2 chiều rồi, còn lý do vì sao mà if (i=15) lại làm lỗi chương trình thì vì em nhầm lỗi sơ đẳng, phải là if (i==15).
    Em có thể hỏi anh tiếp được ko ạ?
    - Em có thêm 1 mảng là int k[8]={0,4,7,5,2,6,1,3}, em muốn chèn các ảnh vào các ô vuông ở cột tương ứng thì em làm như sau:
    Code:
    void CMy6View::OnDraw(CDC* pDC)
    {
    	CMy6Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	// TODO: add draw code for native data here
    	for (int i=0;i<8;i++)
    		for (int j=0;j<8;j++)
    			hcn[i][j].paint(pDC);
    	int k[8]={0,4,7,5,2,6,1,3};
    	for (i=0;i<8;i++)
    		hcn[i][k[i]].outbm(pDC);
    }
    Nhưng nếu em muốn điều khiển vòng lặp
    Code:
    	for (i=0;i<8;i++)
    		hcn[i][k[i]].outbm(pDC);
    bằng chuột (hay là 1 phím bấm hoặc 1 button), tức là sau khi click chuột thì i=0 và in, click tiếp thì i=1 và in,... thì phải làm thế nào ạ? Ý em là dừng vòng lặp bằng chuột chứ ko phải là đưa vào thông điệp xử lý chuột các lệnh tăng i và in (bởi vì sau này còn đệ quy nữa thì có lẽ là sẽ rất khó khăn). Nó như kiểu là ở trong C thì mình thêm vào getchar() ở cuối vòng lặp để mỗi lần ấn enter thì lại tiếp tục ý ạ.
    - Giả sử em đã chèn các ảnh vào các ô vuông rồi, bây h nếu muốn sử dụng 1 sự kiện (ấn phím Shift chẳng hạn) để xóa toàn bộ các ảnh đã chèn đi thì phải làm sao ạ?
    Attached Files Attached Files
    • Kiểu file: rar 6.rar (51.2 KB, 1 views)

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

    BẠn nói rõ hơn đi, nói dài dòng quá mình ko hiểu gì cả.
    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.

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