// 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 {
发布评论
评论(6)
回答如何设置静态文本的底色
常有人问如何改变对话框控件的颜色,字体的颜色,我今天就提供出一种最方便的方法吧.
(当然还有很多其他方法,看个人的程序的要求而定.)
以对话框程序为例:
步骤一:
在XXDlg.h中定义两个私有变量:
COLORREF m_txtBkColor;
COLORREF m_txtForeColor;
在XXDlg.cpp的CXXDlg构造函数中初始化:
m_txtBkColor=RGB(255,0,0);
m_txtForeColor=RGB(0,0,255);
步骤二:
在Windows中最重要的三个关键词的理解:窗口,消息,事件.
MFC窗口的基类是CWnd,用MFC我们很多时候都是在和CWnd打交道.那么我们就的熟悉
CWnd的数据成员,各类函数,事件响应等,这些是基础,不熟的话,找本类库手册查查.
我们这里把静态文本框作为CWnd来处理.
在对话框上加一个静态文本框IDC_STATIC1
在CXXDlg::OnPaint()函数中添加代码如下:
void CDdDlg::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
{
CDialog::OnPaint();
//以下为添加的代码;
CWnd* m_static1=GetDlgItem(IDC_STATIC1);//获取控件窗口指针
CRect rc;
CString str;
CDC* pDC=m_static1->GetDC();//获取子窗口CDC指针
pDC->SetBkColor(m_txtBkColor);//设置子窗口背景色
pDC->SetTextColor(m_txtForeColor);//设置子窗口文字颜色
m_static1->GetWindowText(str);//获取子窗口上的文本
m_static1->GetClientRect(&rc);//获取子窗口矩形
m_static1->ValidateRect(rc); //子窗口客户区有效
pDC->DrawText(str,rc,NULL);//绘制文本
}
}
编译运行看看,是不是按你的愿望改变了呢?而且切换窗口,风格也没有消失.
(问题http://expert.csdn.net/Topic/43922.shtm也请参考,不过有关绘图最好是用个
从CWnd或其派生类继承另编个子类,提供个Public绘图方法比喻Draw();在Draw中使用
Invalidate()就可以了.)
现在我们来检验以下在程序中随时改变其风格.
步骤三:
在对话框上放个Button吧,添加其对BN_CLICKED消息响应函数OnButton1()
实现代码如下:
void CXXDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CWnd* m_static1=GetDlgItem(IDC_STATIC1);//获取CWnd指针
m_txtBkColor=RGB(0,255,0); //改变静态文本框的底色
m_txtForeColor=RGB(192,128,0); //改变静态文本框的文字色
m_static1->SetWindowText("anything");//设置文本
m_static1->UpdateData();//提交
Invalidate();//更新对话框
}
OK,一切都很如愿嘛,起码来说windows面上的东西,都可由你控制.
再深一步,多用类库手册吧.
用完了你再去用API,基本上MFC就可搞定绝大部分问题.
CoolFired老兄好热情,兄弟我感谢你上次的帮助。往往。
处理WM_CTLCOLOR消息,如下:
HBRUSH CCtlColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor==CTLCOLOR_STATIC)
{
pDC->SetTextColor(RGB(255, 0, 0));
pDC->SetBkColor(RGB(245, 245, 245));
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
WM_CTLCOLOR
简单一点就是WM_CTLCOLOR
若要复杂一点就派生CStatic,重载Drawitem
用WM_CTRLCOLOR的同时可能要改变Static的ID号,不能用ID_STATIC