CStatic响应消息

来源:互联网 发布:淘宝店名大全 创意 编辑:程序博客网 时间:2024/05/21 14:44
1.修改控件ID
2.勾上Notify

重载了CStatic类 CMyStatic,并在视图类里定义了一个CMyStatic对象;
但是我重载的
 ON_WM_RBUTTONDBLCLK()
 ON_WM_RBUTTONDOWN()
 ON_WM_LBUTTONDOWN()
 ON_WM_NCMBUTTONDOWN()

BOOL CMyStatic::PreSubclassWindow()
{
    ModifyStyle(0, SS_NOTIFY);
}

使用时

对话框静态模板上的控件创建的过程稍有不同,它的OnCreate消息将由对话框处理。动态创建的话,就可以响应

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{// TODO: Add your specialized code here and/or call the base class
    if (pMsg->message == WM_CREATE )
    {
if ( pMsg->hwnd == m_MyStatic.GetSafeHwnd() )
{
m_MyStatic.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
return TRUE;
}
    }
return CDialog::PreTranslateMessage(pMsg);
}

 Transparent 属性不是指绘制文字时候透明,而是对鼠标点击时间的透明,也就是说,
鼠标点在一个具有透明属性的窗口上,鼠标消息将传递给其下面不具有透明属性的窗口。
要想让 STATIC 控件绘制透明,需要自己进行绘制工作,处理WM_CTLCOLORSTATIC消息,将DC的bkcolor设置成transparent

自己处理OnCtlColor,就是这个ON_WM_CTLCOLOR()
消息
HBRUSH CFvMain::OnCtlColor(CDC * pDC,CWnd * pWnd,UINT nCtlColor)
{
HBRUSH hbr=CFormView::OnCtlColor(pDC,pWnd,nCtlColor);
if (nCtlColor==CTLCOLOR_STATIC || nCtlColor==CTLCOLOR_EDIT)
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
return hbr;
}

if (nCtlColor == CTLCOLOR_STATIC)
 {
  pDC->SetTextColor(RGB(255, 0, 0));//设置成你背景的颜色
  pDC->SetBkMode(TRANSPARENT); 
  
  hbr = m_brush;//HBRUSH hbr 一个公共变量。。你设置的颜色
 }

一个透明的CStatic的类
/*===========================================================================
====                                                                     ====
====    File name           :  StaticTrans.h                             ====
====    Creation date       :  7/10/2001                                 ====
====    Author(s)           :  Dany Cantin                               ====
====                                                                     ====
===========================================================================*/

#ifndef STATICTRANS_H
#define STATICTRANS_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


/////////////////////////////////////////////////////////////////////////////
// CStaticTrans window

#define TRANS_BACK -1

class CStaticTrans : public CStatic
{
    // Construction
public:
    CStaticTrans();
   
private:
    COLORREF m_TextColor;
    COLORREF m_BackColor;
    CBrush   m_Brush;
   
// Operations
public:
    void SetTextColor(COLORREF col) { m_TextColor = col;
                                      UpdateCtrl();      }
    void SetBackColor(COLORREF col) { m_BackColor = col;
                                      UpdateCtrl();      }

private:
    void UpdateCtrl();
   
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CStaticTrans)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CStaticTrans();

// Generated message map functions
protected:
//{{AFX_MSG(CStaticTrans)
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};


#endif // STATICTRANS_H

/*===========================================================================
====                                                                     ====
====    File name           :  StaticTrans.cpp                           ====
====    Creation date       :  7/10/2001                                 ====
====    Author(s)           :  Dany Cantin                               ====
====                                                                     ====
===========================================================================*/

#include "stdafx.h"
#include "StaticTrans.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CStaticTrans

CStaticTrans::CStaticTrans()
{
    m_TextColor = RGB(0, 0, 0);
    m_BackColor = TRANS_BACK;   
}

CStaticTrans::~CStaticTrans()
{
}


BEGIN_MESSAGE_MAP(CStaticTrans, CStatic)
//{{AFX_MSG_MAP(CStaticTrans)
ON_WM_CTLCOLOR_REFLECT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStaticTrans message handlers

HBRUSH CStaticTrans::CtlColor(CDC* pDC, UINT nCtlColor)
{
    m_Brush.DeleteObject();
   
    if (m_BackColor == TRANS_BACK) {
        m_Brush.CreateStockObject(HOLLOW_BRUSH);
        pDC->SetBkMode(TRANSPARENT);
    }
    else {
        m_Brush.CreateSolidBrush(m_BackColor);
        pDC->SetBkColor(m_BackColor);
    }
   
    pDC->SetTextColor(m_TextColor);
   
    return (HBRUSH)m_Brush;
}

void CStaticTrans::UpdateCtrl()
{
    CWnd* pParent = GetParent();
    CRect rect;
   
    GetWindowRect(rect);
    pParent->ScreenToClient(rect);
    rect.DeflateRect(2, 2);
   
    pParent->InvalidateRect(rect, FALSE);   
}

 
原创粉丝点击