Tôi có một hộp thoại MFC trong đó có hai nút radio. Tôi đã đặt chúng vào một nhóm đẹp, IDC của chúng là một sau mỗi khác (RB_LEFT, RB_RIGHT
).Nút radio MFC - Hành vi DDX_Radio và DDX_Control
Tôi muốn sử dụng DDX_Radio
vì vậy tôi có thể truy cập vào các nút sử dụng một giá trị số nguyên như vậy trong chức năng DoDataExchange tôi gọi:
DDX_Radio(pDX, RB_LEFT, mRBLeftRight);
nơi mRBLeftRight là một biến thành viên kiểu integer. Tôi cũng cần phải chỉnh sửa các nút thuộc tính vì vậy tôi muốn sử dụng một DDX_Control
để lập bản đồ chúng trên các biến thành viên mRBLeft và mRBRight (CButton):
DDX_Control(pDX, RB_LEFT, mRBLeft);
DDX_Control(pDX, RB_RIGHT, mRBRight);
bây giờ nếu tôi làm cuộc gọi đến DDX_Control
, bất cứ khi nào DoDataExchange được gọi, ứng dụng gặp sự cố do DDX_Control
buộc RB_LEFT
xử lý thông báo DDX_Radio
không thể xử lý. Phần này tôi hiểu.
Tôi quyết định không sử dụng DDX_Control
(đã xóa cuộc gọi trong DoDataExchange) và chỉ cần giữ con trỏ đến nút radio (CButton *) trong lớp học của tôi. Vì vậy, trong chức năng OnInitDialog của tôi, tôi làm các cuộc gọi sau đây:
mRBLeft= ((CButton*)GetDlgItem(RB_LEFT));
mRBRight = ((CButton*)GetDlgItem(RB_RIGHT));
Bây giờ miễn là tôi không sử dụng mRBLeft nó sẽ là tốt, nhưng nếu tôi làm, bam, vụ tai nạn trên DoDataExchange. Điều thực sự khiến tôi giải đố là nếu tôi thay đổi nút radio bên trái của mình bằng cách sử dụng ((CButton*)GetDlgItem(RB_LEFT)->SetCheck(true)
nó sẽ hoạt động. Sooo khác biệt là gì?
(Tôi biết rất nhiều rắc rối, nhưng tôi chỉ muốn hiểu cơ chế)
Tôi đọc ở đâu đó mà tôi không nên lưu trữ một con trỏ trở về từ GetDlgItem, mà có lẽ là đúng, có lẽ đây là nguyên nhân của vấn đề của tôi? – levesque