« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
Blog信息 |
blog名称:邢红瑞的blog 日志总数:523 评论数量:1142 留言数量:0 访问次数:9685097 建立时间:2004年12月20日 |

| |
[c++]CStatic响应消息 原创空间
邢红瑞 发表于 2004/12/28 17:14:30 |
怕自己忘了1.修改控件ID2.勾上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{ // Constructionpublic: CStaticTrans(); private: COLORREF m_TextColor; COLORREF m_BackColor; CBrush m_Brush; // Operationspublic: 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
// Implementationpublic:virtual ~CStaticTrans();
// Generated message map functionsprotected://{{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_FILEstatic 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_MAPEND_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); } |
|
回复:CStatic响应消息 原创空间
yolanda_yl(游客)发表评论于2006/7/21 9:40:19 |
能不能讲讲HBRUSH CFvMain::OnCtlColor(CDC * pDC,CWnd * pWnd,UINT nCtlColor)和HBRUSH CStaticTrans::CtlColor(CDC* pDC, UINT nCtlColor) 使STATIC控件变得透明的工作流程呢?这两个的关系我有点弄得不太清楚.
另外,void CStaticTrans::UpdateCtrl()这个函数是来做什么的?我隐约觉得这个只是调整大小,跟透明没有什么关系呀.
有点急等,如果可以,能给我回复邮件吗?yl1272003@163.com |
|
回复:CStatic响应消息 原创空间
邢红瑞发表评论于2005/8/15 19:09:08 |
|
回复:CStatic响应消息 原创空间
海丰(游客)发表评论于2005/8/15 16:10:05 |
扩展一个static的类,需要重写哪些函数呢?怎样才能让它显示出来呢? |
|
» 1 »
|