首先,这不是MFC。
以下是我一直在使用的GUI的裁剪版本:

正如您所看到的,我已经(尝试)使用以下代码创建了两个不同的组,Icon和Button:
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);我的问题是,这个窗口只有一个单选按钮,你可能会看到。这意味着用户不可能从图标组中选择一个单选按钮,而从按钮组中选择一个。我已经将每个单选按钮初始化为:
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); 我希望以某种方式将单选按钮的“图标”组从单选按钮的“按钮”组中分离出来,如果这样做有意义的话,因此每个组都有一个单选按钮可用。这是怎么可能的,它是否需要我创建一个新的窗口和一个新的回调过程,仅仅是为了有一个额外的单选按钮。肯定有另一种方法可以像这样对子项进行分组。
2 separate groups of radio buttons in the same form WINAPI (No MFC)这个链接对我的目的没有任何用处。
我有一个Windows第五版的编程,作者Charles Petzold在我旁边作为参考,他在分组框部分指出“分组框通常用于封装其他按钮控件”,但没有真正的例子。
发布于 2012-11-25 18:33:31
与流行的观点相反,您不需要groupbox控件或任何其他类似的外部“容器”( groupbox无论如何都不是,它只是一个按钮工件)。下面描述了如何使用分组框的no requirement来实现这一点。如果您想要一个在功能上有助于这里描述的布局的组框,请转到此答案的EDIT部分,在那里我将解释如何实现OP的特定需求。
自动单选按钮"banks“通过使用两个关键的窗口样式属性WS_GROUP和WS_TABSTOP来工作。为您的两个“银行”(我将它们亲切地称为Bank1和Bank2)执行以下操作:
像上面这样的布局允许你“Tab键”到一个单选按钮库,并使用箭头键来切换选择。然后,您再次"tab“离开该银行,并前往下一个tab-stop。请记住,当您按Tab键(或之前使用Shift- WS_TABTOP组合键)时,对话框管理器将始终移动到下一个Tab子控件。如果要跳转到的控件是自动类型的,则选定的控件将是最新WS_GROUP中的“选定”控件。
如果有帮助,抓起一个素描本,把它画在纸上,然后在制表位上贴上"T“,在组属性上贴上"G”,如上所述。一旦可视化,它可能会变得更加清晰。查看对话资源脚本,了解它们是如何协同工作的,从而获得更深入的见解。
注意:如果你想在它们周围使用组框,你可以。对话管理器的工作方式是基于标记为WS_GROUP的最后一个控件将控件关联到组,此后具有WS_TABSTOP的第一个控件被视为该组的跳转点。首先插入一个Groupbox (不能是can停止),然后在第一个单选按钮上插入带有WS_TABSTOP的单选按钮控件(这次没有WS_GROUP ),这也是可行的。我通常发现,不依赖于分组框而只是排列我的单选按钮会更容易。
EDIT一张图片能说出千言万语
对于您的图片,我可能会按以下顺序创建以下子项:
图标分组框,包括图标style.
显然,所有其他的子控件样式、可见性等也需要正确使用,当然,子控件都应该有唯一的ids。我猜你已经把剩下的部分都介绍好了。
发布于 2020-04-15 19:13:10
注这也适用于一组复选框,这是一个有效的用例。
注意:如果第一个单选按钮可能被禁用(例如,由于运行时条件),您必须使第一个启用的单选按钮具有WS_TABSTOP样式。以下几行代码确保了这一点:
// Set WS_TABSTOP to the group's first enabled item
for (HWND hwnd = GetDlgItem(IDC_FIRSTITEM) /*the first*/; hwnd != NULL && !::IsWindowEnabled(hwnd); hwnd = ::GetWindow(hwnd, GW_HWNDNEXT))
{
if ((GetWindowLong(hwnd, GWL_STYLE) & WS_GROUP) != 0)
hwnd = NULL;
}
if (hwnd != NULL)
ModifyStyle(hwnd, 0, WS_TABSTOP, 0);https://stackoverflow.com/questions/13550087
复制相似问题