运行时生成控件有两种形式,
第一种是在父类的头文件中定义控件类的对象比如 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形式