2012-12-27 169 views
0

在WINAPI,我喜欢创建一个按钮: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; 
} 

按钮看起来像: enter image description here

但我需要它看起来像这样的(我在.net一样) :

enter image description here

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

回答

3
Start = CreateWindowEx(WS_EX_TRANSPARENT, ...); 

因为您使用了WS_EX_TRANSPARENT样式标志,所以您得到了黑色轮廓。目前还不清楚你为什么使用它,当你使用Button控件时,你可以用它做很多事情。否则可能是least understood style flag。通过0来获得正常的外观按钮。

这是一个失败的原因得到一个.NET按钮的外观精确,Winforms不使用内置的按钮控件。它创建自己的,使用自定义渲染器来获得渐变效果。重现该本地代码是很多工作。

+0

你能解释一下WS_EX_TRANSPARENT如何改变边界的外观吗?我不认为这会对外观产生任何影响。必须同意你对它的误解。 –

+0

不知道,直到半小时前才考虑过尝试。它看起来像跳过WM_ERASEBKGND,对于透明度模拟来说并不罕见。 –

+0

你说得对。当我删除透明的标志,它会把一个灰色的边框,而不是..我让它透明,以便它不会像这个图像灰色:http://i.imgur.com/sgcE4.png – Brandon

0

编辑:我错误地将边框标识为默认按钮边框。正如David Hefferman所指出的那样,事实并非如此。也就是说,我现在有reproduced that border effect;在程序启动时没有边界,但刚过左键一点防脱至少在Windows 7

原来的答复如下创建边界–:


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

要更改字体,也许就像WM_SETFONT?

声明:我还没有尝试过。这可能是你需要处理WM_CTRLCOLOR或类似的东西。试试看,最后,如果默认按钮不能为你剪切,只需实现你自己的按钮。

+0

不,由于非默认的扩展窗口样式,黑色边框存在 –

+0

@DavidHeffernan:看起来你是正确的。然而,如[在此演示](https://gist.github.com/4396146),只有将鼠标悬停在按钮上方,或者单击其他按钮(可能还有其他方式),才会显示黑色边框。所以它似乎是一个错误。我误认为它是默认的按钮边框。 –

0

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

的财产为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); 

如果不是这样,你必须与ModifyStyle或将其设置ModifyStyleEx,并在“Remove”参数中传递它。我忘记了哪一种风格必须通过,但如果我记得正确的话,这是正常的风格参数,而不是EX参数。

0

我没有测试过这一点,但尝试创建按钮这样的:

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; 

它可能还取决于您是如何创建的主窗口。你能发布主窗口创建的代码吗?