2012-11-25 14 views
8

Trước hết, đây không phải là MFC.
Đây là một phiên bản cắt của GUI Tôi đã được làm việc trên:Làm cách nào để thiết lập nhiều nhóm nút radio cho tương tác theo thứ tự tab và bàn phím (WIN32) thích hợp?

enter image description here

Như bạn có thể thấy tôi đã (cố gắng) để tạo ra hai nhóm khác nhau, Icon và Button, sử dụng mã:

index->hAddT.hwndIndex[2] = CreateWindowEx(NULL,L"BUTTON",L"Icon",WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 
    200,135,120,170,WINDOWHANDLE,(HMENU)IDC_RADIOGROUP,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWL_HINSTANCE),NULL); 

Vấn đề tôi có và những gì bạn có thể thấy, là chỉ có một nút radio cho cửa sổ. Điều này có nghĩa là người dùng không thể chọn một nút radio từ nhóm Icon và một từ nhóm Button. Tôi đã khởi tạo từng nút Radio như vậy:

index->hAddT.hwndIndex[3] = CreateWindowEx(NULL,L"BUTTON",L"Information",WS_CHILD | BS_AUTORADIOBUTTON | WS_VISIBLE, 
    205,155,100,20,WINDOWHANDLE,(HMENU)IDC_RADIO1,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWL_HINSTANCE),NULL);  

Tôi muốn, bằng cách nào đó, có "Biểu tượng" nhóm các nút radio tách từ "Button" nhóm các nút radio, nếu điều đó có ý nghĩa, và do đó sẽ có một nút radio có sẵn cho mỗi nhóm. Làm thế nào điều này sẽ có thể, nó sẽ yêu cầu tôi để làm cho một cửa sổ mới và một thủ tục gọi lại mới chỉ để có thêm một nút radio. Phải có một cách khác để nhóm các mục con như vậy.

2 separate groups of radio buttons in the same form WINAPI (No MFC) Liên kết không được sử dụng cho mục đích của tôi.

Tôi có lập trình cho Windows phiên bản thứ năm, bởi Charles Petzold bên cạnh tôi làm tài liệu tham khảo, và ông nói trong phần Nhóm hộp "Hộp nhóm thường được sử dụng để kèm theo các nút điều khiển khác", nhưng không có ví dụ thực tế về điều này.

Trả lời

12

Trái ngược với ý kiến ​​phổ biến, bạn KHÔNG cần điều khiển hộp nhóm hoặc bất kỳ "vùng chứa" bên ngoài nào khác (dù hộp nhóm không phải là gì, chỉ là một nút tạo tác). Phần sau mô tả cách bạn có thể thực hiện điều này với yêu cầu no của nhóm hộp. Nếu bạn muốn một hộp nhóm có chức năng hỗ trợ trong bố cục được mô tả ở đây, hãy chuyển tiếp xuống phần EDIT của câu trả lời này, nơi tôi giải thích cách có thể đạt được mong muốn cụ thể của OP.

Auto-Radio nút "ngân hàng" làm việc bằng cách sử dụng hai thuộc tính phong cách cửa sổ chính, WS_GROUPWS_TABSTOP. Làm như sau cho hai "ngân hàng" của bạn mà tôi sẽ trìu mến gọi là BANK1 và Bank2:

  1. Ngân hàng 1: nút radio đầu tiên nên có cả WS_GROUP | WS_TABSTOP trong kiểu điều khiển. các nút radio còn lại phải có không phải là trong số đó, và phải theo thứ tự anh chị em (nghĩa là trong kịch bản DIALOG chúng ngay lập tức theo nhau; trong việc tạo năng động chúng được tạo tuần tự).

  2. Điều khiển con đầu tiên sau nút radio cuối cùng của bạn trong Bank1 phải có ít nhất kiểu WS_GROUP và WS_GROUP | WS_TABSTOP nếu nó là một điều khiển dừng tab.

  3. Ngân hàng 2: nút radio đầu tiên phải có cả WS_GROUP | WS_TABSTOP trong kiểu điều khiển.các nút radio còn lại phải có không phải là trong số đó, và phải theo thứ tự anh chị em (nghĩa là trong kịch bản DIALOG chúng ngay lập tức theo nhau; trong việc tạo năng động chúng được tạo tuần tự).

  4. Điều khiển con đầu tiên sau nút radio cuối cùng của bạn trong Bank2 phải có ít nhất kiểu WS_GROUP và WS_GROUP | WS_TABSTOP nếu nó là một điều khiển dừng tab.

Bố cục như trên cho phép bạn "tab" vào ngân hàng nút radio và sử dụng các phím mũi tên để chuyển đổi lựa chọn. Sau đó, bạn "tab" một lần nữa để rời khỏi ngân hàng đó và đi đến tab dừng tiếp theo. Hãy nhớ rằng, trình quản lý hộp thoại sẽ luôn chuyển sang điều khiển con WS_TABTOP tiếp theo khi bạn nhấn Tab (hoặc trước đó bằng Shift-Tab). Nếu điều khiển được nhảy vào là một kiểu tự động, điều khiển được chọn sẽ là điều khiển 'được chọn' trong WS_GROUP gần đây nhất.

Nếu có ích, hãy lấy một miếng phác thảo, vẽ nó lên giấy và dán chữ "T" vào các điểm dừng tab và "G" trên các thuộc tính nhóm như được mô tả ở trên. Nó có thể sẽ rõ ràng hơn nhiều khi được hình dung. Xem kịch bản tài nguyên hộp thoại để xem cách chúng hoạt động cùng nhau để hiểu rõ hơn.

Lưu ý: Nếu bạn muốn sử dụng các hộp nhóm xung quanh những thứ này bạn có thể. Trình quản lý hộp thoại hoạt động bằng cách kết hợp các điều khiển với các nhóm dựa trên điều khiển cuối cùng đã được gắn cờ với WS_GROUP và điều khiển đầu tiên sau đó có WS_TABSTOP được coi là điểm nhảy tab cho nhóm đó. Chèn một Groupbox đầu tiên (không thể là tabstop), sau đó là nút radio điều khiển với WS_TABSTOP trên nút radio đầu tiên (không có WS_GROUP lần này), cũng sẽ hoạt động. Tôi thường thấy dễ dàng hơn khi sắp xếp các nút radio mà không phụ thuộc vào hộp nhóm.

EDIT hoạ bức tranh nói một ngàn chữ

Đối với hình ảnh của bạn tôi có lẽ sẽ tạo ra những đứa trẻ sau theo thứ tự sau đây:

  1. "Biểu tượng" GroupBox, bao gồm phong cách WS_GROUP.
  2. Nút tự động "Thông tin", bao gồm WS_TABSTOP
  3. Tất cả các nút radio nhóm "Biểu tượng" khác. KHÔNG bao gồm WS_TABSTOP hoặc WS_GROUP.
  4. hộp nhóm "Nút", bao gồm kiểu WS_GROUP. Điều này đóng nhóm kiểm soát hiện tại và bắt đầu nhóm tiếp theo.
  5. Nút "tự động tắt", bao gồm WS_TABSTOP
  6. Tất cả các nút radio nhóm "Nút" khác. KHÔNG bao gồm WS_TABSTOP hoặc WS_GROUP.
  7. Điều khiển tiếp theo sau khi nút radio "Nút" phải bao gồm WS_GROUP. Điều này đóng nhóm kiểm soát hiện tại và bắt đầu nhóm tiếp theo.

Rõ ràng tất cả các kiểu điều khiển con khác, khả năng hiển thị, v.v ... đều cần được sử dụng chính xác, và tất nhiên trẻ em đều phải có id duy nhất. Tôi giả sử bạn đã có phần còn lại được bảo hiểm.

+0

Điểm thưởng nếu bạn có thể trỏ đến tài liệu MSDN mô tả điều này. – Thomas

+0

@Thomas Văn bản theo nghĩa đen mô tả cách thức hoạt động của WS_GROUP có thể được tìm thấy trong thời gian ngắn [ở đây] (http://msdn.microsoft.com/en-us/library/aa920781.aspx), nhưng "tốt hơn" (và tôi sử dụng thuật ngữ đó lỏng lẻo) mô tả từ MS là [ở đây] (http://msdn.microsoft.com/en-us/library/czada357 (v = vs.110) .aspx). Ít nhất là sau này trình bày khái niệm "phím mũi tên" với một số rõ ràng hợp lý. – WhozCraig

+0

Duh.xin lỗi tôi đã bỏ lỡ [this this] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644995 (v = vs.85) .aspx # ws_group) là tốt, mà có lẽ là tốt nhất của Tất cả bọn họ. Các tài liệu tổng thể có một * tấn * thông tin về lập trình hộp thoại efffective. – WhozCraig

Các vấn đề liên quan