五一在家,闲来无事,搬弄起vc,记得vc里的对UI的设计很麻烦,就算是设置个字体和颜色也要一串代码, 怪不得大家都喜欢用.net啊.不过个人感觉vc更接近windows本质.
好了,废话少说,花了将近一下午时间,终于将vc里的字体和颜色设置基本搞定(我这里只谈static,至于button,呵呵,还比较麻烦啊).我先说下思路,因为窗口总要被重绘的,所以我们对字体的设置就放在onpaint里了,而窗口也是在不断接受wm_ctlcolor消息的,所以我们对颜色的设置就放在OnCtlColor函数里了.还有一个问题,我想动态设置static的字体和颜色怎么办呢.这个问题我思考了很九,也上网查了不少资料,我决定自己在头文件里添加关于颜色和变量的成员.
class CSxDlg : public CDialog
{
// Construction
public:
CSxDlg(CWnd* pParent = NULL); // standard constructor
DWORD color;
DWORD font;
..............................
..............
这里我定义了color和font两个变量.在再OnInitDialog()里添加下面代码:
this->color=0;
this->font=0;
好了,完成了初始化设置.
接下来我们添加onpaint里的代码:
void CSxDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}else
{
if(this->font){
CStatic* b=(CStatic*)this->GetDlgItem(IDC_STATIC);
CFont c;
c.CreatePointFont(300,"黑体");
b->SetFont(&c);
c.DeleteObject();
}
this->color=0x666666;
CDialog::OnPaint();
}
}
大家看到了吧,我在else里做了个判断,看this->font是否为0,这样就完成了设置,再看ctlcolor()里的代码:
HBRUSH CSxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID()==IDC_STATIC){
if(this->color) pDC->SetBkColor(this->color);
pDC->SetTextColor(0x333333);
}
return hbr;
}
这里主要是要判断pwnd是否是我们要设置的static.
最后我们在button里添加代码,完成点击按钮就对static进行改变.
void CSxDlg::OnButton1()
{
this->font=1;
this->color=0x666666;
Invalidate();
}
这里 Invalidate()强制窗体重绘,是设置立刻生效.
好了,文章就到这里,有什么不妥之处,还望各位多多指教啊.