改变Push Button背景色

改变Push Button背景色

  改变Push Button背景色



在Windows中Edit,StaticBox的背景色都可以通过处理WM_CTLCOLOR消息来改变,但Push Button却不行。

唯一的方法是使用OwnerDraw风格的按钮。本文讲述的方法是使用CButton的派生类。

class CCButton : public CButton
{
DECLARE_DYNAMIC(CCButton)
public:
    CCButton(); 
    virtual ~CCButton(); 
    BOOL CCButton::Attach(const UINT nID, CWnd* pParent)

protected:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);//必需重载的函数

public:
    COLORREF m_fg, m_bg, m_disabled_fg, m_disabled_bg;//四种颜色分别为文字,背景,失效时文字,失效时背景
};


实现DrawItem

void CCButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
    CDC* pDC = CDC::FromHandle(lpDIS->hDC);//???????DC

    UINT state = lpDIS->itemState; //得到状态
    CRect focusRect, btnRect;//两个矩形,表示得当输入焦点时的虚线矩形和按钮矩形     
    focusRect.CopyRect(&lpDIS->rcItem); 
    btnRect.CopyRect(&lpDIS->rcItem); 

    //
    //调整虚线矩形
    //
    focusRect.left += 4;
   focusRect.right -= 4;
   focusRect.top += 4;
   focusRect.bottom -= 4;

    //
    // 得当Button上文字
    //
   const int bufSize = 512;
   TCHAR buffer[bufSize];
   GetWindowText(buffer, bufSize);
    
   // 使用m_fg, m_bg颜色利用 Draw3dRect(...)绘制按钮边框

   // FillRect(...)填充按钮内部

   // DrawText(...)绘制文字

    //根据当前状态调整显示
    //
    if (state & ODS_FOCUS) {
        .........//得到输入焦点,通过focusRect画虚线
        if (state & ODS_SELECTED){ 
        .....// 被按下,绘制下陷边框
        }
    }
    else if (state & ODS_DISABLED) {
    //失效,通过m_disabled_fg, m_disabled_bg 重绘按钮内部
    }



CCButton是CButton派生类,具有CButton的全部成员函数,但在创建时需要使用BS_OWNERDRAW风格。

如果按钮不是动态生成,使用Attach函数使CCButton代替原来按钮的窗口过程。

BOOL CCButton::Attach(const UINT nID, CWnd* pParent)
{
    GetDlgItem(nID)->ModifyStyle(0,BS_OWNERDRAW,0);

    if (!SubclassDlgItem(nID, pParent))
        return FALSE;

    return TRUE;


如在一对话框的InitDialog(...)中加入下面几行

{// 假定 m_cbBtn为成员变量 IDC_BUTTON1为一按钮ID值

   m_cbBtn.Attach(IDC_BUTTON1,this);

}

    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要向PySide6界面添加功能,可以通过以下步骤进行操作: 1. 在PySide6中创建一个新的类,这个类将继承QWidget或其子类,例如QMainWindow或QDialog。 2. 在类中定义需要添加的功能,例如按钮、文本框、标签等。 3. 将这些控件添加到界面中,可以使用PySide6中的布局管理器来帮助控制控件的位置和大小。 4. 为每个控件连接相应的信号和槽函数,以便在用户与控件交互时执行所需的操作。 例如,以下是一个简单的PySide6界面类,其中包含一个按钮和一个标签,并且当用户单击按钮时,标签的文本将更改: ```python from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout class MyWidget(QWidget): def __init__(self): super().__init__() # 创建按钮和标签 self.button = QPushButton('Click me!') self.label = QLabel('Hello, world!') # 连接按钮的clicked信号到槽函数 self.button.clicked.connect(self.change_text) # 创建垂直布局管理器并将控件添加到其中 layout = QVBoxLayout() layout.addWidget(self.button) layout.addWidget(self.label) # 将布局设置为窗口的主布局 self.setLayout(layout) def change_text(self): # 按钮单击时更改标签文本 self.label.setText('Button clicked!') if __name__ == '__main__': # 创建应用程序和窗口 app = QApplication([]) widget = MyWidget() widget.show() # 运行应用程序 app.exec_() ``` 在上面的示例中,我们创建了一个名为MyWidget的类,它继承自QWidget,并在其中添加了一个按钮和一个标签。我们还为按钮的clicked信号连接了一个名为change_text的槽函数,该函数将更改标签的文本。最后,我们创建了一个QVBoxLayout布局管理器,并将按钮和标签添加到其中。 当我们运行应用程序时,我们将创建一个新的MyWidget实例,并将其显示在屏幕上。当用户单击按钮时,我们将更改标签的文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值