如题:我想自己写一个函数当满足一定条件时显示出的static控件用不同的背景颜色和字体大小和颜色。
比如我写的refresh()函数中:
void CXXXDlg::Refresh()
{
m_Font.CreatePointFont(150,"宋体");//m_Font及m_Font1有定义在类中
m_Font1.CreatePointFont(150,"楷体_GB2312");
if(fonttype==1) GetDlgItem(IDC_STATIC1)->SetFont(&m_Font);
else GetDlgItem(IDC_STATIC1)->SetFont(&m_Font1);
//修改背景色
//修改字体颜色}
在修改背景色和字体颜色在GetDlgItem(ID)得到的控件的指针没有操作背景色和字体颜色的函数,字体的有SetFont()请问一下,要修改这两项要怎么操作?在网上有找到一些是用OnCtlColor(),但这个不方便,不是你想调用的时候就调用。另想的方法是做个Static控件的子类,但我不晓得Static控件是哪个基类的派生类?是不是CButton?
要如何写这个派生类?
比如我写的refresh()函数中:
void CXXXDlg::Refresh()
{
m_Font.CreatePointFont(150,"宋体");//m_Font及m_Font1有定义在类中
m_Font1.CreatePointFont(150,"楷体_GB2312");
if(fonttype==1) GetDlgItem(IDC_STATIC1)->SetFont(&m_Font);
else GetDlgItem(IDC_STATIC1)->SetFont(&m_Font1);
//修改背景色
//修改字体颜色}
在修改背景色和字体颜色在GetDlgItem(ID)得到的控件的指针没有操作背景色和字体颜色的函数,字体的有SetFont()请问一下,要修改这两项要怎么操作?在网上有找到一些是用OnCtlColor(),但这个不方便,不是你想调用的时候就调用。另想的方法是做个Static控件的子类,但我不晓得Static控件是哪个基类的派生类?是不是CButton?
要如何写这个派生类?
解决方案 »
- 这是VC2008的bug么?
- 加静态变量出错error LNK2005: "public: static class CString CBall::m_strStyle" (?m_strStyle@CBall@@2VCString@@A) already defined in Ball
- 求VC(图形化)高手,来看看吧,求求大家了
- 请问怎么在内存中绘制一副图形,然后将其保存为bmp图片
- 关于ActiveX控件的注册出现的怪现象(100分相送)
- activex的入门,很简单的问题请教
- 我在microsoft上找到了键盘的测试程序,但是我找不到鼠标的?
- 问一个很菜的问题,win2000怎么卸掉
- TCP的三次握手协议
- GUI界面调试控制台程序
- 关于csv文件的读取 如何判断其编码
- 高分求助:蓝牙多连接编程?
class CCaption : public CStatic
要如何写这个派生类?
=========
是CStatic类,从它派生就行了.
HBRUSH m_hbrMyBK;
COLORREF m_crlMyText;
然后初始化它们(随便你喜欢的颜色)
m_hbrMyBK = (HBRUSH)GetStockObject(NULL_BRUSH);
m_crlMyText = RGB(0, 0, 0);
void CXXXDlg::OnBnClickedBtnChange()
{
// get window handle of your static control
CStatic* pStatic = (CStatic*)(GetDlgItem(IDC_STATIC_VARIETY));
// init random generator
srand(unsigned(time(NULL)));
// release HBRUSH object last time
::DeleteObject(m_hbrMyBK);
// create new brush and text color
m_hbrMyBK = CreateSolidBrush(RGB(rand() % 256, rand() % 256, rand() % 256));
m_crlMyText = RGB(rand() % 256, rand() % 256, rand() % 256);
// force to repaint your static control
pStatic->Invalidate(TRUE);
}HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // if your static control...
if(pWnd->GetDlgCtrlID() == IDC_STATIC_VARIETY){
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_crlMyText);
hbr = m_hbrMyBK;
}
return hbr;
}
大体就这个样子, 根据你具体需要改改就行了.
首先要从CStatic类派生一个子类
#pragma once// CNameStaticclass CNameStatic : public CStatic
{
DECLARE_DYNAMIC(CNameStatic)public:
CNameStatic();
virtual ~CNameStatic();protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
protected:
CBitmap m_bmp;
public:
// 绘制文本显示
void DrawTxt(CString& strText, COLORREF clrBK, CFont& font);
};
具体实现方法有多种,我只是简单的说明一个方法,定义一个函数DrawTxt,有三个参数,分别是文本内容、背景色和字体,这个类不一定能够使用,但是解决方法应该说清楚了#include "stdafx.h"
#include "NameStatic.h"// CNameStatic
IMPLEMENT_DYNAMIC(CNameStatic, CStatic)CNameStatic::CNameStatic()
{
}CNameStatic::~CNameStatic()
{
if (NULL != m_bmp.m_hObject)
{
m_bmp.DeleteObject();
}
}
BEGIN_MESSAGE_MAP(CNameStatic, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()// CNameStatic 消息处理程序
void CNameStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting // 不写代码了,这里把位图再贴一遍就可以了
}void CNameStatic::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
CStatic::PreSubclassWindow();
// 创建位图
CRect rtClient;
GetClientRect(&rtClient); CDC* pDC = GetDC();
if (NULL == pDC)
{
return;
} bmp.CreateCompatibleBitmap(pDC, rtClient.Width(), rtClient.Height());
ReleaseDC(pDC);
}// 绘制文本显示
VOID CNameStatic::DrawText(CString& strText, COLORREF clrBK, CFont& font)
{
// 位图没有被创建,退出绘制文本
if (NULL == m_bmp.m_hObject)
{
return;
} CDC* pDC = GetDC();
if (NULL == pDC)
{
return;
} CRect rtClient;
GetClientRect(&rtClient); CDC MemDC;
if (!MemDC.CreateCompatibleDC(pDC))
{
ReleaseDC(pDC);
return;
} CBitmap* pOldBmp = MemDC.SelectObject(&m_bmp); MemDC.FillSolidRect(&rtClient, clrBK); CFont* pOldFont = MemDC.SelectObject(&font); MemDC.SetBkMode(TRANSPARENT);
MemDC.SetTextColor(RGB(0, 0, 0)); MemDC.DrawText(strText, &rtClient, DT_VCENTER|DT_RIGHT); pDC->BitBlt(0, 0, rtClient.Width(), rtClient.Height(), &MemDC, 0, 0, SRCCOPY); MemDC.SelectObject(pOldBmp);
MemDC.SelectObject(pOldFont);
MemDC.DeleteDC(); ReleaseDC(pDC);
}