首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

Opengl 自定义控件解决方案

2013-06-26 
Opengl 自定义控件用MFC、opengl开发的一个绘图控件,拖放到Form中,获取该控件hdc,绘制一根线,此时会产生一

Opengl 自定义控件
用MFC、opengl开发的一个绘图控件,拖放到Form中,获取该控件hdc,绘制一根线,此时会产生一个矩形的背景,即线所在的外接矩形不透明(遮挡住控件中的图像)。有没有人碰到过,该如何解决?

另:使用的Win7,Aero主题,若不适用Aero主题则背景透明。
[解决办法]
在Aero窗口中使用GDI绘制会产生穿透的问题。
解决方法:
1,使用gdi+,参考资料http://blog.csdn.net/ntwilford/article/details/5656633
2,仍旧使用gdi,不过,还需要如此做,使用Aero双缓存
WTL代码:


template <class T,class TBase = CWindow>
class Ctrl : public CWindowImpl<T,TBase>,public CBufferedPaint,public CThemeImpl<T>
{
public:
BEGIN_MSG_MAP(Ctrl)
CHAIN_MSG_MAP(CThemeImpl<T>)
MSG_WM_ERASEBKGND(OnEraseBkgnd)
MSG_WM_PAINT(OnPaint)
END_MSG_MAP()
public:
Ctrl()
{
SetThemeClassList(L"globals");
}
void DrawText(HDC dc,CString str,CRect rc,COLORREF cr = RGB(51,51,51),
DWORD style = CENTER)
{
DTTOPTS dttopts = { sizeof(DTTOPTS) };
dttopts.dwFlags = DTT_COMPOSITED 
[解决办法]
 DTT_TEXTCOLOR;
dttopts.crText = cr;
DrawThemeTextEx(dc,TEXT_LABEL,0,str,-1,style,&rc,&dttopts);
}
BOOL OnEraseBkgnd(CDCHandle){return TRUE;}
void OnPaint(CDCHandle)
{
CPaintDC dc(this->m_hWnd);//此句不能删除
//原来windows底层在调用了Invaildate后会发送一个WM_PAINT的消息给DC,如果没有调用BeginPaint的话,
//这个WM_PAINT消息会一直触发。
CDCHandle buff_dc;
CRect rc_client;
this->GetClientRect(&rc_client);
Begin(dc,rc_client,BPBF_TOPDOWNDIB,NULL,buff_dc);

int alpha = 255;  // 指定控件透明度
if(alpha > 0)
SetAlpha(NULL, alpha);
End(TRUE);
}
};

热点排行