禁用/启用特定的静态文本控件?

Posted

技术标签:

【中文标题】禁用/启用特定的静态文本控件?【英文标题】:Disable/Enable specific static text control? 【发布时间】:2016-04-26 10:48:27 【问题描述】:

我的对话框上有这个STATIC文本控件:

现在,我知道我可以将控件重命名为 IDC_STATIC_STYLE 之类的名称,然后我可以将其映射到 CStatic 对象并以这种方式禁用/启用,或者我可以将 CWnd::GetDlgCtrlID 与它进行比较走那条路。

我的问题是我正在查看是否可以避免重命名控件(因此不会影响我的资源 DLL 文件中的现有翻译)。有没有其他方法可以找到这个特定的控件?我注意到在 IDE 中有一个灰色的 (Name) 条目,上面写着 IDC_STATIC51

如果必须的话,我会重命名它,但如果我按原样使用它,我都很感兴趣!

谢谢!

【问题讨论】:

在资源文件中识别该控件的唯一方法是在声明它的对话框资源中。默认情况下,所有静态控件的 ID 为 IDC_STATIC,#defined 为 -1。它不是唯一的,因此您无法为该控件提供其原始定义之外的唯一标题。因此,您可以为控件提供一个新的自定义 ID,而不会影响您的翻译。正如 xMRi 所建议的,Z 顺序会起作用,但它有点脆弱。 (另请注意,如果设置了“简单”样式,则静态控件在禁用时不会有任何不同的绘制。) 使用 appTranslator 您不需要将任何 IDC_STATIC 对象具体命名为特定名称。感谢您的意见。 【参考方案1】:
    UI 中的名称只是一个内部 ID,与资源无关。 只需使用 Z 顺序(如果定义正确)。在某些情况下,这就是这样做的方法。只需通过输入确定控件(在您的情况下为组合框),然后使用GetWindowGW_HWNDPREV。并且您拥有组合框前面的窗口句柄。

【讨论】:

【参考方案2】:

我相信在给定文本的情况下获取静态控件句柄的更好方法是:

HWND hStyle = ::FindWindowEx(m_hWnd, 0, 0, L"Style");
::SetWindowText(hStyle, L"This is a test");

【讨论】:

我明白了。但是,当您使用本地化资源 DLL 时,这无济于事,因此注释在运行时会根据所使用的语言而有所不同。【参考方案3】:

参考this

BOOL CALLBACK CTab_indexDlg::DisableControl(HWND hwnd, LPARAM lParam)

    BOOL disableAllControls = (BOOL)lParam;
    char className[256];
    ::GetClassName(hwnd, className, 256);
    TRACE("%s\n", className);

    if ((FALSE == disableAllControls)
        && ((_stricmp(className, "Edit") == 0) || (_stricmp(className, "Button") == 0))) 
        return TRUE;
    

    ::EnableWindow(hwnd, FALSE);
    return TRUE;


void CTab_indexDlg::DisableAllControls()

    ::EnumChildWindows(m_hWnd, &CTab_indexDlg::DisableControl, (LPARAM)m_bDisableAllControls);

    GetDlgItem(IDCANCEL)->EnableWindow(TRUE);
    GetDlgItem(IDOK)->EnableWindow(TRUE);

【讨论】:

谢谢,但我认为这不能回答问题。使用上面的代码,您不能禁用窗口上的特定IDSTATIC 控件。

以上是关于禁用/启用特定的静态文本控件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 启用/禁用特定“验证组”中的 asp.net 验证控件?

启用/禁用 UIButton 取决于 UITextField 中的文本长度

是否可以为特定记录禁用/启用访问子表单中的控件?访问 2000 - VBA

仅在特定表单控件 (TextBox) 上启用快捷菜单

根据文本控件值标记和启用/禁用连续表单上的按钮

如何防止静态控件中的文本被剪切?