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);
}