biến x1,x2, mình đã khởi tạo từ trước!
Mình không hiểu nỗi nữa, mình thấy code của mình vẫn ổn, nhưng khi chạy, nó hình tròn duy chuyển được 7-10s là bị treo rồi, à mà trong lúc hình tròn duy chuyển nút start của mình cũng biến mất, mình thử thêm nhiều nút vô, thì trong quá trình nó duy chuyển các nút button đều biến mất, mấy bạn cố gắng giúp minhg giải quết hai vấn đề trên, chân thành cảm ơn!
Code:void CVe_O_Vuong_Duy_ChuyenDlg::OnButtonStart() { CPaintDC dc(this); RECT rect; GetClientRect(&rect); mbool=1; int i=0; while(mbool==1) { while(x1+40<rect.right) { Sleep(10); x1=x1+2; HinhTron(); i++; } while(x1-40>rect.left) { Sleep(10); x1=x1-2; HinhTron(); i++; } } } void CVe_O_Vuong_Duy_ChuyenDlg::HinhTron() { CPaintDC dc(this); Invalidate(TRUE); dc.Ellipse(x1-40,y1-40,x1+40,y1+40); }
biến x1,x2, mình đã khởi tạo từ trước!
Bạn dùng while(mbool==1) như vậy là tiêu rồi dù rằng bạn nghĩ có thể sửa mbool=0 ở 1 method bên ngoài để kết thúc vòng lặp.
Có 2 hướng giải quyết.
1. Nếu bạn vẫn muốn while(mbool) như vầy thì bắc buộc bạn phải sử dụng Thread, vì Thread là 1 tiểu trình nhỏ chạy cùng với App. Nó không gây kẹt cứng sự kiện như bạn đang làm. Bạn tham khảo thêm multithread nhé.
2. Bạn dùng 1 cái Timer. Mỗi lần WM_TIMER thì cập nhật tọa độ và vẽ lại.
Chúc thành công.
Về multithread thì mình biết, nhưng ý thứ hai thì mình chưa hiểu rõ ý bạn, trong thread vẽ hình tròn mình có thể vẽ bằng việc tăng biến tọa độ, chứ bạn nói là sử dụng message VM_TIMER để cập nhập tọa độ, liệu có cần thiết, bạn có thể giái đáp thắc mắc giúp mình không?
Dễ mà.
C++ Code:
#define ID_TIMER1 100 .. .. void YourApp::OnCreate(){ ... ... SetTimer(ID_TIMER1, 100, NULL); // Thiet lap Timer } void YourApp::OnStartButton(){ m_bAnimal = true; } void YourApp::OnStopButton(){ m_bAnimal = false; } // WM_TIMER void YourApp:OnTimer(UINT nID){ if (m_bAnimal && nID==ID_TIMER1){ static int x = 0; // Cap nhat toa do if (...){ x+=2; ... } if (...){ x-=2; ... } // Ve hinh tron DrawCircle(x, y); } }