2009-07-22 7 views
8

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ế)

+0

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

Trả lời

7

TBH Bài đăng của JC dễ dàng hơn bài viết của JC dẫn bạn tin.

DDX_Control(pDX, IDC_RADIO3, m_r3); 
DDX_Control(pDX, IDC_RADIO4, m_r4); 

m_Val = 0; 
DDX_Radio(pDX, IDC_RADIO3, m_Val); 

Bạn cần đánh dấu nút radio FIRST trong nhóm có WS_GROUP (Trong trường hợp này IDC_RADIO3). Bây giờ bạn đã sẵn sàng và nó sẽ tự động chọn IDC_RADIO3).

Bây giờ để giữ cho m_Val được cập nhật, có lẽ bạn nên đặt trình xử lý nhấp chuột lên tất cả các nút radio trong nhóm. Bên trong hàm đó, chỉ cần gọi UpdateData (TRUE); m_Val bây giờ sẽ trỏ đến chỉ mục của nút radio trong nhóm.

+0

Tôi đã đánh dấu nút radio đầu tiên với 'WS_GROUP' ... – levesque

+0

Tôi đã làm chính xác điều này .. tin tưởng tôi rằng nó sẽ sụp đổ nếu bạn sử dụng m_r3. – levesque

+2

Lạ ... đồng xu một cụm từ, "Hoạt động trên máy của tôi" ... – Goz

1

Có lỗi trong cơ sở của bạn. Bạn có thể sử dụng DDX_Radio và DDX_Control cho cùng một điều khiển, nó sẽ là khá vô ích nếu không. Bạn có thể xây dựng trên

"bây giờ nếu tôi thực hiện cuộc gọi đến DDX_Control, bất cứ khi nào DoDataExchange được gọi, ứng dụng bị treo 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".

vì tôi nghĩ rằng đây là một triệu chứng của vấn đề cơ bản.

+0

Tôi tìm thấy câu trả lời, nếu bạn quan tâm :) – levesque

3

Tôi tìm thấy câu trả lời ở đây: http://www.flounder.com/getdlgitem.htm

có một vấn đề với việc sử dụng DDX_ControlDDX_Radio cùng lúc :) Đây là một hack nhỏ để có được xung quanh vấn đề này.

Đài phát thanh nút biến

Một vấn đề nội tại, mà đại diện cho một số loại lạ quan điểm triết học của Microsoft, là bạn phải không được phép tạo biến điều khiển cho đài phát thanh nút. Điều này không có ý nghĩa. Họ có một số ý tưởng kỳ lạ rằng cách duy nhất bạn sẽ bao giờ thao tác các nút radio là thông qua một chỉ mục. Đây là vô vọng không đủ.Do đó, bạn phải đi thông qua một số mâu thuẫn nghiêm trọng để nhận các biến kiểm soát cho các nút radio của bạn.

Điều đầu tiên bạn phải làm là đi quay lại và đánh dấu tất cả các nút radio là có kiểu WS_GROUP. Chỉ các nút radio có kiểu WS_GROUP mới có thể có biến điều khiển. Tuy nhiên, nếu bạn đánh dấu tất cả chúng bằng WS_GROUP, hãy tạo điều khiển biến và sau đó xóa thuộc tính WS_GROUP, mọi thứ hoạt động tốt, cảm ơn bạn. Tại sao chúng tôi phải thực hiện các bước bổ sung này khiến không có ý nghĩa nào, nhưng giống như vấn đề bắt nguồn lớp học, tôi đã khiếu nại về vấn đề này trong nhiều năm không có hiệu lực. Vấn đề của tôi là tôi tiếp tục lãng quên để quay trở lại và hủy bỏ tất cả các WS_GROUP thuộc tính, vì vậy lần đầu tiên tôi chạy chương trình sau này tôi thấy rằng tất cả nút radio của tôi là một nút bấm nhóm. Rất tiếc. $ #%! Khắc phục và biên dịch lại/liên kết lại.

+1

Hmm Tôi vẫn không hiểu, điều này luôn làm việc như tôi mong đợi. Như đã đề cập bên dưới, bạn cần đặt kiểu điều khiển đầu tiên thành WS_GROUP và sau đó nó hoạt động. Ah tốt, ít nhất bạn có vấn đề của bạn được giải quyết. – Roel

+1

FYI, tôi vừa vấp phải câu hỏi này và nghĩ rằng tôi sẽ cho bạn biết, tôi không có vấn đề này, và lời khuyên chuẩn từ Goz là những gì tôi sử dụng. Nó có thể cho thấy một vấn đề sâu sắc hơn cho bạn. –

+0

@Mark, bởi một sự trùng hợp kỳ lạ tôi đã chạy qua ngày hôm nay quá. Câu trả lời này là lời khuyên xấu, nó đại diện cho một sự hiểu lầm về các hoạt động của DDX_Radio. Bạn mở cho mình rất nhiều đau buồn khi bạn đi trái với những gì Microsoft mong đợi. Có một vấn đề cơ bản khác trong mã không bao giờ được chẩn đoán, và với một giải pháp thay thế, nó sẽ không bao giờ xảy ra. –