none
自定义按钮(PushButton)如何使用系统风格且改变文字颜色? RRS feed

  • 问题

  • 我发现在MFC工程内自己新建的按钮全部都是没有可视化风格的按钮(像Win2K)的那一种

    但是由工程自己新建的按钮却是系统按钮风格的(OK和Cancel按钮)

    那么假如我自己绘制了一个按钮(使用了BS_OWNERDRAW样式,只是为了改变文字颜色),那么这个按钮怎样可以使用到系统风格


    主要是我想改pushbutton的文字颜色,但是不自绘又不能改,自绘了之后又没有系统风格
    2009年6月18日 9:46

答案

  • 刚才帮你查了下MSDN,上面是这样写的

    WM_CTLCOLORBTN

    Remarks

    By default, the DefWindowProc function selects the default system colors for the button. Buttons with the BS_PUSHBUTTON, BS_DEFPUSHBUTTON, or BS_PUSHLIKE styles do not use the returned brush. Buttons with these styles are always drawn with the default system colors. Drawing push buttons requires several different brushes-face, highlight and shadow-but the WM_CTLCOLORBTN message allows only one brush to be returned. To provide a custom appearance for push buttons, use an owner-drawn button.

    按钮默认用的是System Color. 你可以用SetSysColors来改变它的颜色,但是所有的系统按钮颜色都会被改变.
    看来必须用OWNERDRAW按钮了,你可以到CodeProject上去搜一下.那里有很多自绘按钮的例子.
    0xBAADF00D
    • 已标记为答案 JasonMing 2009年6月20日 13:05
    2009年6月20日 10:55
    版主

全部回复

  • 你的第一个问题可能是没有调用::InitCommonControls();或者是没有在.manifast文件中添加Common Control的调用

    第二个问题BS_OWNERDRAW使用了自绘,系统就不会帮你重绘按钮了.你只能自己截图下来自己往Button的DC上贴了.
    0xBAADF00D
    2009年6月18日 11:03
    版主
  • 设置按钮为DrawItem
    然后自己实现OwnerDraw


    麻烦把正确答案设为解答。
    2009年6月19日 3:22
    版主
  • 如果我只是想实现按钮的文字改色不想重绘按钮,但是又想使用系统风格,这可不可行的?
    2009年6月19日 6:11
  • 从你的控件中GetDC
    然后设置通过DC调用SetTextColor即可。无需自定义按钮。
    麻烦把正确答案设为解答。
    2009年6月19日 7:37
    版主
  • 从你的控件中GetDC
    然后设置通过DC调用SetTextColor即可。无需自定义按钮。
    麻烦把正确答案设为解答。

    呃,这个好像对PushButton无效啊……
    2009年6月19日 17:54
  • 对,是无效的,你需要在Button的父窗口中响应消息WM_CTLCOLOR,当nCtlColor == CTLCOLOR_BTN时在其传入的DC中用SetTextColor就可以了
    0xBAADF00D
    2009年6月20日 3:11
    版主
  • 对,是无效的,你需要在Button的父窗口中响应消息WM_CTLCOLOR,当nCtlColor == CTLCOLOR_BTN时在其传入的DC中用SetTextColor就可以了
    0xBAADF00D

    谢谢你的解答,但是这个还是对PushButton无效
    2009年6月20日 5:06
  • 刚才帮你查了下MSDN,上面是这样写的

    WM_CTLCOLORBTN

    Remarks

    By default, the DefWindowProc function selects the default system colors for the button. Buttons with the BS_PUSHBUTTON, BS_DEFPUSHBUTTON, or BS_PUSHLIKE styles do not use the returned brush. Buttons with these styles are always drawn with the default system colors. Drawing push buttons requires several different brushes-face, highlight and shadow-but the WM_CTLCOLORBTN message allows only one brush to be returned. To provide a custom appearance for push buttons, use an owner-drawn button.

    按钮默认用的是System Color. 你可以用SetSysColors来改变它的颜色,但是所有的系统按钮颜色都会被改变.
    看来必须用OWNERDRAW按钮了,你可以到CodeProject上去搜一下.那里有很多自绘按钮的例子.
    0xBAADF00D
    • 已标记为答案 JasonMing 2009年6月20日 13:05
    2009年6月20日 10:55
    版主
  • 刚才帮你查了下MSDN,上面是这样写的

    WM_CTLCOLORBTN

    Remarks

    By default, the DefWindowProc function selects the default system colors for the button. Buttons with the BS_PUSHBUTTON, BS_DEFPUSHBUTTON, or BS_PUSHLIKE styles do not use the returned brush. Buttons with these styles are always drawn with the default system colors. Drawing push buttons requires several different brushes-face, highlight and shadow-but the WM_CTLCOLORBTN message allows only one brush to be returned. To provide a custom appearance for push buttons, use an owner-drawn button.

    按钮默认用的是System Color. 你可以用SetSysColors来改变它的颜色,但是所有的系统按钮颜色都会被改变.
    看来必须用OWNERDRAW按钮了,你可以到CodeProject上去搜一下.那里有很多自绘按钮的例子.
    0xBAADF00D

    好的,非常谢谢你的回答~~~

    现在我纳闷的是Windows的那个计算器是怎么做到的呢……

    按钮做到了无焦点和不同颜色的文字
    2009年6月20日 13:05