本站首页    管理页面    写新日志    退出


«July 2025»
12345
6789101112
13141516171819
20212223242526
2728293031


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

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


阅读全文(11384) | 回复(3) | 编辑 | 精华
 


回复: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

onDraw

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:CStatic响应消息
原创空间

海丰(游客)发表评论于2005/8/15 16:10:05

扩展一个static的类,需要重写哪些函数呢?怎样才能让它显示出来呢?

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.434 second(s), page refreshed 144771076 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号