怎样运行时生成控件及改变控件样式与颜色

运行时生成控件有两种形式,

第一种是在父类的头文件中定义控件类的对象比如 CButton m_btnOK;然后在父类的实现(OnCreate/OnInitialDlg)中创建 m_btnOK.Create("确定", WS_CHILD|WS_VISIBLE|BS_按钮的特性, CRect(0,0,0,0), this, IDC_OK)

说明:Create函数第一个参数是指定控件的Caption/Text,

第二个参数是指定控件的形式,WS_CHILD必须指定,WS_VISIBLE如果不指定则默认不可见,当然还有一些其他的CWnd继承来的形式(WS_DISABLED,WS_BORDER,WS_TABSTOP)根据需要指定,这些都是控件的公共形式,|后面还可以跟控件的私有形式

按钮的私有形式BS_,静态控件的私有形式SS_,EDIT控件的私有形式ES_这些都在WinUser.h中定义

#define ES_LEFT             0x0000L
#define ES_CENTER           0x0001L
#define ES_RIGHT            0x0002L
#define ES_MULTILINE        0x0004L

第三个参数指定控件的坐标与大小,可以在创建是用CRect(0,0,0,0),在父类的OnDraw函数中进行移动和调整如:

m_btnOK.MoveWindow(rcBounds.left, rcBounds.top, rcBounds.right, 20);

第四个参数指定控件的父类

第五个参数指定控件的资源ID,此资源ID可以手工在resource.h添加,也可以直接给定一个数值

 

第二种创建控件的形式是在父类的头文件中定义控件类的指针比如 CButton *m_pbtnOK; 在Create之前使用new操作符创建对象(m_pbtnOK = new CButton()).最后在Create.

 

改变控件的颜色有两种方法

第一种是重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

第一个参数是控件对应的CDC指针

第二个参数是控件对应的CWnd指针,从中可得到控件窗口句柄pWnd->m_hWnd,也可以得到控件的资源ID号pWnd->GetDlgCtrlID();

第三个参数是控件类型,支持

CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT
编辑框
CTLCOLOR_LISTBOX
列表框
CTLCOLOR_MSGBOX
消息框
CTLCOLOR_SCROLLBAR
滑动条
CTLCOLOR_STATIC
静态文本框、矩形

例子如下:

HBRUSH 父类::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr = COleControl::OnCtlColor(pDC, pWnd, nCtlColor);

 

if (nCtlColor==CTLCOLOR_STATIC)//针对所有的静态控件,如果要针对某个静态控件可用下面的形式

//if (pWnd->GetDlgCtrlID() == IDC_OK)
{
  pDC->SetBkMode(TRANSPARENT);
  return (HBRUSH)::GetStockObject(WHITE_BRUSH);  // 设置背景色,从对象库中取出来

  //也可以新创建一个

  //return (HBRUSH)CreateSolidBrush(RGB(255,255,255));
}
 
 return hbr;

}

 

但是OnCtlColor方法不能用于按钮控件,要改变控件的颜色只有定制新的按钮类(从CButton派生)

class CMyColorButton : public CButton
{
 DECLARE_DYNAMIC(CMyColorButton)

public:
 CMyColorButton();
 virtual ~CMyColorButton();

 BOOL Attach(const UINT nID, CWnd* pParent,
  const COLORREF BGColor = RGB(192, 123, 192),
  const COLORREF FGColor = RGB(1, 1, 1));

protected:
 virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); //重定义虚拟函数DrawItem 
 void DrawFilledRect(CDC *DC, CRect R, COLORREF color); //填充按纽框 
 void DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor);

 COLORREF GetFGColor() { return m_fg; }
 COLORREF GetBGColor() { return m_bg; }

private:
 COLORREF m_fg, m_bg;

protected:
 DECLARE_MESSAGE_MAP()
};

 

实现函数

BOOL CMyColorButton::Attach(const UINT nID, CWnd* pParent, const COLORREF BGColor, const COLORREF FGColor)
{
 if (!SubclassDlgItem(nID, pParent)) return FALSE;
 m_fg = FGColor;
 m_bg = BGColor;

 return TRUE;
}

//重载DrawItem()
void CMyColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
 CDC* pDC = CDC::FromHandle(lpDIS->hDC);
 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;

 // 按纽标题
 const int bufSize = 512;
 TCHAR buffer[bufSize];

 GetWindowText(buffer, bufSize);
 DrawFilledRect(pDC, btnRect, GetBGColor());
 DrawButtonText(pDC, btnRect, (char *)buffer, GetFGColor());

 if (state & ODS_FOCUS)
 {
  DrawFocusRect(lpDIS->hDC, (LPRECT)&focusRect);
 }
}

//用色彩填充按纽框
void CMyColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color)
{
 CBrush B;

 B.CreateSolidBrush(color);
 DC->FillRect(R, &B);
}

//绘制按纽文本
void CMyColorButton::DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor)

{
 COLORREF prevColor = DC->SetTextColor(TextColor);
 DC->SetBkMode(TRANSPARENT);
 DC->DrawText((LPCTSTR)Buf, strlen(Buf), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
 DC->SetTextColor(prevColor);
}

引用定制类

在父类的头文件中加入 CMyColorButton m_btnOK;

在OnInitialDlg加入m_btnOK.Attach(IDC_OK, this);,注意按钮控件必须是OWNER DRAW形式

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值