如题:我想自己写一个函数当满足一定条件时显示出的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?
要如何写这个派生类?

解决方案 »

  1.   

    搜索“CCaption”
    class CCaption : public CStatic
      

  2.   

    另想的方法是做个Static控件的子类,但我不晓得Static控件是哪个基类的派生类?是不是CButton?
    要如何写这个派生类?
    =========
    是CStatic类,从它派生就行了.
      

  3.   

    先定义俩成员变量用作背景色和文本色
    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;
    }
    大体就这个样子, 根据你具体需要改改就行了.
      

  4.   

    程序我已用OnCtlColor消息处理函数实现。但还是期待有 写它的子类的实现方法。
      

  5.   

    单独写个Static类,用OnCtlColor挺方便的
      

  6.   

    举一个简单的例子
    首先要从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);
    }