我用VC2005实现鼠标移动到多个不同静态文本框,使相应文本颜色变化,鼠标移开后颜色恢复,调用的是OnMouseMove函数。另外一功能是单击各个静态文本使其响应。现在的问题是,单击静态文本框要把属性Notify事件改为true,但是该了之后,不执行鼠标移动事件。也就是单击成功,但是鼠标移动后文本颜色无变化。反之也行。也就是说两者只能选其一。有没有什么方法,让两者都能自如显示?  另外我要按向下键盘的话,希望获取第一个静态文本框的焦点,使其颜色改变。再次按下,获取下一个静态文本框的焦点,使其颜色改变,前一个文本颜色恢复,依此类推。可是调用SetFocus()函数无法获取静态文本框焦点。        求帮助。谢谢!

解决方案 »

  1.   

    一种方法。将静态文本改变ID变为非静态文本,重写类实现字体。颜色,事件OnMouseMove等功能。将每个ID绑定你的类。做一个集合应用每个实例管理。
    第二种方法。移去所有文本框,在父OnPaint()中画你想要的效果。界面只是一种表现行式。
      

  2.   

    方法是可行,可是复杂了点。以前都是用linux c 编程。vc还不够熟练。难道就没有更简易的方法吗?最好有类似代码可供参考。
      

  3.   

    找个Static扩展类
    #ifndef _STATICEX_H_
    #define _STATICEX_H_#include   "afxwin.h"#define WM_MODIFYFONT WM_USER+200class   CStaticEx : public   CStatic
    {
    public:
    CStaticEx();
    ~CStaticEx();
    COLORREF   m_TextColor;
    COLORREF   m_BackColor;
    CString   m_strCaption;
    CFont* m_pFont;
    BOOL m_bTextLeft; void   SetTextColor(COLORREF   TextColor);
    void   SetCaption(CString   strCaption);
    CString GetCaption();
    void   SetBkColor(COLORREF   BackColor);
    void   Create(CString   strCaption,COLORREF   BackColor);

    void SetTextLeft(BOOL bStatus);
    void SetTextFont(CFont* pFont);
    protected:
    //{{AFX_MSG(CListCtrlEx)
    afx_msg   void   OnPaint();
    afx_msg   int    OnCreate(LPCREATESTRUCT   lpCreateStruct);
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };#endif
      

  4.   

    #include "StdAfx.h"
    #include "staticex.h"CStaticEx::CStaticEx()
    {
    m_pFont = NULL;
    m_bTextLeft = false;
    }CStaticEx::~CStaticEx()
    {
    }BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
    //{{AFX_MSG_MAP(CListCtrlEx)
    ON_WM_PAINT()
    ON_WM_CREATE()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    void   CStaticEx::OnPaint()
    {
    CPaintDC   dc(this);   //   device   context   for   painting
    //   TODO:   在此处添加消息处理程序代码
    //   不为绘图消息调用   CStatic::OnPaint()
    CRect rect;
    GetClientRect(rect);

    CDC MemDC; 
    MemDC.CreateCompatibleDC(NULL); //Create MemDC

    CBitmap MemBitmap;
    MemBitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height()); //Create MemBitmap
    CBitmap* pOldClientBitmap = MemDC.SelectObject(&MemBitmap); //Select MemBitmap into MemDC to Draw//////////////////////////////////////////////////////////////////////////
    MemDC.FillSolidRect(rect,m_BackColor);
    MemDC.SetBkColor(m_BackColor);
    MemDC.SetBkMode(TRANSPARENT);

    CFont   *pOldFont;
    if(m_pFont != NULL)
    pOldFont=MemDC.SelectObject(m_pFont);
    else
    pOldFont = MemDC.SelectObject(GetParent()->GetFont());//选用父窗体的字体

    MemDC.SetTextColor(m_TextColor);//设置文本颜色

    if(m_bTextLeft)
    MemDC.DrawText(m_strCaption,&rect,DT_LEFT);
    else
    MemDC.DrawText(m_strCaption,&rect,DT_CENTER);

    MemDC.SelectObject(pOldFont);
    //////////////////////////////////////////////////////////////////////////
    dc.BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(pOldClientBitmap);
    MemBitmap.DeleteObject();
    MemDC.DeleteDC();
    }void CStaticEx::SetTextLeft(BOOL bStatus)
    {
    m_bTextLeft = bStatus;
    }void CStaticEx::SetTextFont(CFont* pFont)
    {
    m_pFont = pFont;
    }int   CStaticEx::OnCreate(LPCREATESTRUCT   lpCreateStruct)
    {
    if   (CStatic::OnCreate(lpCreateStruct)   ==   -1)
    return   -1;

    //   TODO:     在此添加您专用的创建代码

    return   0;
    }void   CStaticEx::SetTextColor(COLORREF   TextColor)
    {
    m_TextColor=TextColor;
    }
    void   CStaticEx::SetCaption(CString   strCaption)
    {
    m_strCaption=strCaption;
    } CString CStaticEx::GetCaption()
    {
    return m_strCaption;
    }void CStaticEx::SetBkColor(COLORREF BackColor)
    {
    m_BackColor = BackColor;
    }
      

  5.   

    静态控件是不接受焦点的。建议你写一个CWnd的派生类,解决你的问题