[急]关于CStatic透明的问题 先上2副图:这是主程序的背景这是在主程序上添加了一个 CStatic 后的效果图为什么我把CStatic设置为透明后,主程序的背景也被擦除掉了?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你把这个STATIC控件的ID改一下试试,不要用默认的IDC_STATIC! 用CButton吧,这可是经验之谈。很多事情要变通一下了:) 我想知道为什么会出现这个问题,而不是刻意去避免这个问题,因为我用DrawText也直接可以画文字上去 当你把CStatic设置为透明后,如果要更新CStatic应该更新其在所在主程序的背景。可以参见如下文章:http://www.joyvc.cn/GuiAndWindows/GuiAndWindowsGroup00141.html .h文件class CTransparentStatic : public CStatic{ DECLARE_DYNAMIC(CTransparentStatic)private: CBrush m_Brush;public: CTransparentStatic(); virtual ~CTransparentStatic();protected: afx_msg LRESULT OnSetText(WPARAM,LPARAM); afx_msg HBRUSH CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP()};.cppIMPLEMENT_DYNAMIC(CTransparentStatic, CStatic)CTransparentStatic::CTransparentStatic(){}CTransparentStatic::~CTransparentStatic(){}BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic) ON_MESSAGE(WM_SETTEXT,OnSetText) ON_WM_CTLCOLOR_REFLECT()END_MESSAGE_MAP()LRESULT CTransparentStatic::OnSetText(WPARAM wParam,LPARAM lParam){ LRESULT Result = Default(); CRect Rect; GetWindowRect(&Rect); GetParent()->ScreenToClient(&Rect); GetParent()->InvalidateRect(&Rect); GetParent()->UpdateWindow(); return Result;}HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/){ pDC->SetBkMode(TRANSPARENT); return (HBRUSH)GetStockObject(NULL_BRUSH);} 窗口的.cpp文件#include "StdAfx.h"#include "Resourceppc.h"#include "RecommendWindow.h"CRecommendWindow::CRecommendWindow(CWnd* pParent,LPCTSTR pTitle, RECT &rect) :CTransWindow(pParent,pTitle,rect){ }CRecommendWindow::~CRecommendWindow(void){ if(m_Tuijian_static) { delete m_Tuijian_static; m_Tuijian_static=NULL; }}BEGIN_MESSAGE_MAP(CRecommendWindow, CWnd) ON_WM_ERASEBKGND() ON_WM_CREATE()END_MESSAGE_MAP()BOOL CRecommendWindow::OnEraseBkgnd(CDC* pDC){ CDC memDC; CBitmap m_bg; CBitmap m_header; m_bg.LoadBitmap(IDB_BG); memDC.CreateCompatibleDC(pDC); CBitmap *pOldBitMap=memDC.SelectObject(&m_bg); pDC->BitBlt(0,0,240,320,&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBitMap); memDC.DeleteDC(); m_header.LoadBitmap(IDB_BAR); memDC.CreateCompatibleDC(pDC); pOldBitMap=memDC.SelectObject(&m_header); pDC->BitBlt(0,0,240,34,&memDC,0,0,SRCCOPY); pDC->BitBlt(0,286,240,34,&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBitMap); memDC.DeleteDC(); return TRUE;}int CRecommendWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CTransWindow::OnCreate(lpCreateStruct) == -1) return -1; //创建窗口 CreateEx(0, //pParent?0:WS_EX_TOPMOST, AfxRegisterWndClass(0), L"", WS_POPUP, // | WS_SYSMENU , CRect(0,0,240,320), NULL,//pParent?pParent:NULL, NULL, NULL); m_Tuijian_static=new CTransparentStatic(); m_Tuijian_static->Create(_T("请输入对方手机号码:"),WS_VISIBLE|WS_CHILD,CRect(5,50,200,80),this,IDC_TUIJIAN); m_Tuijian_static->ShowWindow(SW_SHOW); m_Tuijian_static->GetParent()->RedrawWindow(); return 0;}.h文件#pragma once#include "TransComponent.h"class CRecommendWindow : public CWnd{private: CTransparentStatic *m_Tuijian_static;public: CRecommendWindow(CWnd* pParent,LPCTSTR pTitle, RECT &rect); virtual ~CRecommendWindow(void); DECLARE_MESSAGE_MAP() afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);};调用:recommenddlg=new CRecommendWindow(NULL,L"",rect2);recommenddlg->ShowWindow(SW_SHOW); 这种情况自己输出文字就可以了,SetBkMode、TextOut。 CStatic完全可以用DrawText代替,mobile 建议使用.net compact framework进行开发。 建议桌面是可以定制的包括桌面背景、Item和图标,而不是弄个窗口全屏。 我的桌面背景刷新过了啊 m_Tuijian_static->GetParent()->RedrawWindow(); 刷新的时候系统会剪掉CStatic该区域,是为了避免窗口闪烁。 父窗口不要设置WS_CLIPCHILDREN风格。 mobile 中WS_CLIPCHILDREN是系统默认的,无论你是否设置,系统都有进行裁剪的。 原因可能如zhoujianhei所说的:主界面刷新的时候CSTATIC区域没有刷新可以参考:http://topic.csdn.net/t/20030510/16/1765429.html 父窗口不要设置WS_CLIPCHILDREN风格。 晕倒,这么个简单问题折腾了这么长时间。既然楼主想知道原因,那就给你简单讲讲原因吧。在一个父窗口上存在一个子窗口的情况下,一般来说,在子窗口所占据的屏幕区域,每次绘制都会发生四次:第一次是父窗口绘制背景(处理 WM_ERASEBKGND 消息)、第二次是父窗口绘制前景(处理 WM_PAINT 消息),第三次是子窗口绘制背景,第四次是子窗口绘制前景。但是,你可以看到,在这个区域上,父窗口的两次绘制其实没有意义,因为总会被子窗口自身的绘制所覆盖,为了优化绘制速度,减少数据的传输量(从内存到显示内存),所以,如果父窗口具有 WS_CLIPCHILDREN 风格的话,父窗口对于子窗口所占据位置的绘制会被优化掉(也就是省略掉)。那么可知,在子窗口尚未进行绘制之前,该区域会保留为父窗口之下的屏幕上原来的内容,也就是你所看到的“点击此处...”的桌面窗口的文字那个样子。由于你把子窗口的背景绘制也优化掉了,所以就会显示为你的子窗口的前景直接出现在原来的桌面窗口的内容之上的现象。以上就是这个问题的来龙去脉。至于 Mobile 设备上到底是不是父窗口总会执行 WS_CLIPCHILDREN 对应的行为,我没有验证过。 如果你 28 楼的尝试结果正确,那说明 Mobile 设备上父窗口确实总会执行 WS_CLIPCHILDREN 对应的行为。不过可以有另外的方法解决:你在子窗口的 WM_ERASEBKGND 消息中,创建一个 DC,然后直接向父窗口发送 WM_PAINT 消息,让父窗口的对应的区域的内容给你绘制到你准备的这个 DC 上,然后再输出。应该可以的。 我直接说解决方法了。如果透明风格+子窗体不刷新风格在一起出现这种情况那是必然。GET背景DC bitblt参数设置偏移量输出显示到static背景。使之重合。由于cstatic不存在位置改变 所以保存只需一次即可。 CTL_COLOR?? 事件 有个事件试试 在WINCE5.0里面,WS_CLIPCHILDREN确实不起作用。跟踪显示就可以看得到。 关于Mfc dll 中2次DoModal对话框的问题! 软件设计师通过啦, 散分 ---------->>>>VC++中如何才能正确使用INCLUDE语句? 如何获得服务器HTML中的数据 有偿转让Java即时通信工具源代码及设计文档 肯请有<<VC++网络游戏建模与实现>>(作者:苏羽 王媛媛 北京科海电子出版社)CD的朋友阅览!不是广告!! 来看一下吧,帮帮我! 关于基本控件的使用! 如何用c++保存自己定义后缀的文件 给我介绍两本书 Keep Alive以及一个收数据问题 dll在英文操作系统下无法调用,有这方面经验的请进
我想知道为什么会出现这个问题,而不是刻意去避免这个问题,因为我用DrawText也直接可以画文字上去
http://www.joyvc.cn/GuiAndWindows/GuiAndWindowsGroup00141.html
class CTransparentStatic : public CStatic
{
DECLARE_DYNAMIC(CTransparentStatic)
private:
CBrush m_Brush;
public:
CTransparentStatic();
virtual ~CTransparentStatic();protected:
afx_msg LRESULT OnSetText(WPARAM,LPARAM);
afx_msg HBRUSH CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/);
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};.cppIMPLEMENT_DYNAMIC(CTransparentStatic, CStatic)
CTransparentStatic::CTransparentStatic()
{
}CTransparentStatic::~CTransparentStatic()
{
}
BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic)
ON_MESSAGE(WM_SETTEXT,OnSetText)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()LRESULT CTransparentStatic::OnSetText(WPARAM wParam,LPARAM lParam)
{
LRESULT Result = Default();
CRect Rect;
GetWindowRect(&Rect);
GetParent()->ScreenToClient(&Rect);
GetParent()->InvalidateRect(&Rect);
GetParent()->UpdateWindow();
return Result;
}
HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
窗口的.cpp文件#include "StdAfx.h"
#include "Resourceppc.h"
#include "RecommendWindow.h"CRecommendWindow::CRecommendWindow(CWnd* pParent,LPCTSTR pTitle, RECT &rect)
:CTransWindow(pParent,pTitle,rect)
{
}CRecommendWindow::~CRecommendWindow(void)
{
if(m_Tuijian_static)
{
delete m_Tuijian_static;
m_Tuijian_static=NULL;
}
}
BEGIN_MESSAGE_MAP(CRecommendWindow, CWnd)
ON_WM_ERASEBKGND()
ON_WM_CREATE()
END_MESSAGE_MAP()BOOL CRecommendWindow::OnEraseBkgnd(CDC* pDC)
{
CDC memDC;
CBitmap m_bg;
CBitmap m_header;
m_bg.LoadBitmap(IDB_BG);
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldBitMap=memDC.SelectObject(&m_bg);
pDC->BitBlt(0,0,240,320,&memDC,0,0,SRCCOPY);
memDC.SelectObject(pOldBitMap);
memDC.DeleteDC();
m_header.LoadBitmap(IDB_BAR);
memDC.CreateCompatibleDC(pDC);
pOldBitMap=memDC.SelectObject(&m_header);
pDC->BitBlt(0,0,240,34,&memDC,0,0,SRCCOPY);
pDC->BitBlt(0,286,240,34,&memDC,0,0,SRCCOPY);
memDC.SelectObject(pOldBitMap);
memDC.DeleteDC(); return TRUE;
}
int CRecommendWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTransWindow::OnCreate(lpCreateStruct) == -1)
return -1;
//创建窗口
CreateEx(0, //pParent?0:WS_EX_TOPMOST,
AfxRegisterWndClass(0),
L"",
WS_POPUP, // | WS_SYSMENU ,
CRect(0,0,240,320),
NULL,//pParent?pParent:NULL,
NULL,
NULL); m_Tuijian_static=new CTransparentStatic();
m_Tuijian_static->Create(_T("请输入对方手机号码:"),WS_VISIBLE|WS_CHILD,CRect(5,50,200,80),this,IDC_TUIJIAN);
m_Tuijian_static->ShowWindow(SW_SHOW);
m_Tuijian_static->GetParent()->RedrawWindow(); return 0;
}
.h文件#pragma once
#include "TransComponent.h"class CRecommendWindow :
public CWnd
{
private:
CTransparentStatic *m_Tuijian_static;
public:
CRecommendWindow(CWnd* pParent,LPCTSTR pTitle, RECT &rect);
virtual ~CRecommendWindow(void);
DECLARE_MESSAGE_MAP()
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};
调用:recommenddlg=new CRecommendWindow(NULL,L"",rect2);
recommenddlg->ShowWindow(SW_SHOW);
m_Tuijian_static->GetParent()->RedrawWindow();
http://topic.csdn.net/t/20030510/16/1765429.html