【问题标题】:WINAPI Button backgroundWINAPI 按钮背景
【发布时间】:2012-12-27 19:48:11
【问题描述】:

在 WINAPI 中,我创建了一个类似的按钮:

case WM_CREATE:
{
    Start = CreateWindowEx(WS_EX_TRANSPARENT, "Button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 50, 75, 25, window, (HMENU)ID_START, hInstance, NULL);
            break;
}

按钮看起来像:

但我需要它看起来像这样(我在 .Net 中做过):

我怎样才能摆脱黑色边框/背景?

【问题讨论】:

    标签: c++ windows winapi win32gui


    【解决方案1】:
      Start = CreateWindowEx(WS_EX_TRANSPARENT, ...);
    

    你得到黑色轮廓是因为你使用了 WS_EX_TRANSPARENT 样式标志。不清楚你为什么使用它,当你使用 Button 控件时,你无能为力。否则可能是least understood style flag。传递 0 以获得正常外观的按钮。

    否则,获得 .NET 按钮的精确外观是一个失败的原因,Winforms 不使用内置的 Button 控件。它创建自己的,使用自定义渲染器来获得渐变外观。复制本机代码需要大量工作。

    【讨论】:

    • 你能解释一下 WS_EX_TRANSPARENT 如何改变边框的外观吗?我根本不认为它会对外观产生任何影响。必须同意你对它的误解。
    • 不知道,直到半小时前才考虑尝试这个。看起来它跳过了 WM_ERASEBKGND,这对于透明度模拟来说并不罕见。
    • 你是对的。当我删除透明标志时,它会放置一个灰色边框。我让它透明,这样它就不会像这张图片中那样是灰色的:i.imgur.com/sgcE4.png
    • 好吧,你发现 .NET 不使用它。为什么它也没有实现 WM_CTLCOLORBTN 是我很久以前放在忘记它的盒子里的另一个生命之谜。原始 user32 只是没有生产力。如果您不想使用战舰灰色对话框背景,那么您将需要所有者绘制。
    【解决方案2】:

    我认为您看到的边框是因为按钮具有“默认按钮”属性。如果你把它关掉,那么它将有一个正常的边框。 Default 属性只是告诉 Win32 如果用户在对话框/表单上按 ENTER 键激活哪个按钮。如果您只有一个按钮,那么它将始终具有默认属性。如果您添加第二个,则不会。

    该属性是 BS_DEFPUSHBUTTON 属性,因此在您的 CreateWindowEx 调用中,您应该能够执行以下操作:

    Start = CreateWindowEx(WS_EX_TRANSPARENT, "Button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | ~BS_DEFPUSHBUTTON, 20, 50, 75, 25, window, (HMENU)ID_START, hInstance, NULL);
    

    如果没有,您必须使用 ModifyStyleModifyStyleEx 进行设置,并将其传递到“Remove”参数中。我忘记了必须传入哪个特定样式,但如果我没记错的话,这是普通样式参数,而不是 EX 参数。

    【讨论】:

      【解决方案3】:

      我没有对此进行测试,但请尝试像这样创建按钮:

      Start = CreateWindowEx(0, WC_BUTTON, "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_TEXT, 20, 50, 75, 25, window, (HMENU)ID_START, hInstance, NULL);
              break;
      

      这也可能取决于您创建主窗口的方式。您可以发布创建主窗口的代码吗?

      【讨论】:

        【解决方案4】:

        编辑:我错误地将边框识别为默认按钮边框。正如大卫赫弗曼指出的那样,事实并非如此。也就是说,我现在有reproduced that border effect;程序启动时没有边框,但只需将鼠标悬停在左侧按钮上即可创建边框 - 至少在 Windows 7 中是这样。

        原答案如下:


        黑色边框是因为它是默认的。您不应干扰系统对默认按钮等的可视化。用户依赖这些提示。

        要更改字体,也许像 WM_SETFONT?

        免责声明:我没有尝试过。您可能需要处理 WM_CTRLCOLOR 或类似的东西。尝试一下,最后,如果默认按钮不适合您,只需实现您自己的按钮。

        【讨论】:

        • 不,黑色边框是因为非默认扩展窗口样式存在
        • @DavidHeffernan:看来你是对的。但是,作为demonstrated here,直到将鼠标悬停在按钮上或单击另一个按钮(可能还有其他方式)时,才会出现黑色边框。所以这似乎是一个错误。我错误地将其识别为默认按钮边框。
        猜你喜欢
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多