31749|12

86

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

BUTTON 透明 [复制链接]


我想使我的按钮控件透明,不知道怎么弄?我从网上找到了CeBtnST.cpp 这个类,它不支持透明,我想从它的基础上改动

最新回复

用AlphaBlend  API函数很方便 图片做成通道  这个要在内核编要支持AlphaBlend    详情 回复 发表于 2008-4-21 16:26
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
最好的透明方法是不用button, 直接在背景图上画上button。然后根据点击的位置来判断是点了哪个button.
就是模拟button.

CeBtnST是支持透明的,你得到当前button在背景图上对应的图,然后传给button处理就行了。

CeBtnST好像传入的是icon,要是没记错的话,你改成传入bmp就行。
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼上说的是对的,大概的思路就是:Button获得背景上对应区域背景图-> 自己画自己想要的 Button即可。 有以下问题需要注意:
1、获得背景的Hwnd和hdc ,注意这个Hdc对应的背景图的获取,一定是数据,指针有一些情况会有问题。注意。
2、获得了背景图的数据,然后就是自己拼合自己的背景图像,实现透明的效果。
3、圆形 图像在实现背景融合的时候会有一些边缘 色  很难处理掉,包括Photoshop等处理软件中都会看到,这个需要注意。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 

  "lenux"所说的“最好的透明方法是不用button, 直接在背景图上画上button。然后根据点击的位置来判断是点了哪个button. ”

  能不能说具体点?

  
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
就是在背景图上直接加上button的背景,看上去就像背景图上放了button一样,其实没有button,
这个时候要模拟出button的被点击效果,就必须知道当前点击的位置,通过位置来判断点的是哪个button
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
//从背景图上得到控件的在背景图的位置的brush,然后用这些brush来刷控件的背景
//OnCtlColorStatic是关于设static       control的背景色或文本色的,也可以做,但比较//复杂一些,涉及至CDC的问题.      
        

//.h
MESSAGE_HANDLER(WM_CTLCOLORSTATIC,   OnCtlColorStatic   )
HBRUSH   GetBkBrush(   HWND   hWnd,   UINT   nID,   HBITMAP   hBmBk   );
HBRUSH     m_hBrCtl[10];//刷子数组
//.cpp
//界面美化
m_hBmBkgnd   =   ::LoadBitmap(_Module.GetResourceInstance(),   MAKEINTRESOURCE(IDB_BT_S_SS_MAIN)   );
if(   m_hBmBkgnd   )
{
m_hBrCtl[0]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_1,   m_hBmBkgnd   );
m_hBrCtl[1]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_2,   m_hBmBkgnd   );
m_hBrCtl[2]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_3,   m_hBmBkgnd   );
m_hBrCtl[3]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_4,   m_hBmBkgnd   );
m_hBrCtl[4]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_5,   m_hBmBkgnd   );
m_hBrCtl[5]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_6,   m_hBmBkgnd   );
m_hBrCtl[6]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_7,   m_hBmBkgnd   );
m_hBrCtl[7]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_8,   m_hBmBkgnd   );
m_hBrCtl[8]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_9,   m_hBmBkgnd   );
m_hBrCtl[9]   =   GetBkBrush(   m_hWnd,   IDC_SENDSMS_10,   m_hBmBkgnd   );
}
else
{
m_hBrCtl[0]   =   NULL;
m_hBrCtl[1]   =   NULL;
m_hBrCtl[2]   =   NULL;
m_hBrCtl[3]   =   NULL;
m_hBrCtl[4]   =   NULL;
m_hBrCtl[5]   =   NULL;
m_hBrCtl[6]   =   NULL;
m_hBrCtl[7]   =   NULL;
m_hBrCtl[8]   =   NULL;
m_hBrCtl[9]   =   NULL;
}

if(m_hBmBkgnd)
{
::DeleteObject(   m_hBmBkgnd   );
m_hBmBkgnd   =   NULL;
}


LRESULT   CSendSmsDlg::OnCtlColorStatic(UINT   /*uMsg*/,   WPARAM   wParam,   LPARAM   lParam,   BOOL&   /*bHandled*/)
{
HDC   hDCBtn   =   (HDC)   wParam;
HWND   hWndCtrl   =   (HWND)   lParam;

UINT   nID   =   ::GetDlgCtrlID(   hWndCtrl   );

::SetBkMode(   hDCBtn,   TRANSPARENT   );
::SetTextColor(hDCBtn,   RGB(255,255,255));
switch(   nID   )
{
case   IDC_SENDSMS_1:
return   (LRESULT)m_hBrCtl[0];
case   IDC_SENDSMS_2:
return   (LRESULT)m_hBrCtl[1];
case   IDC_SENDSMS_3:
return   (LRESULT)m_hBrCtl[2];
case   IDC_SENDSMS_4:
return   (LRESULT)m_hBrCtl[3];
case   IDC_SENDSMS_5:
return   (LRESULT)m_hBrCtl[4];
case   IDC_SENDSMS_6:
return   (LRESULT)m_hBrCtl[5];
case   IDC_SENDSMS_7:
return   (LRESULT)m_hBrCtl[6];
case   IDC_SENDSMS_8:
return   (LRESULT)m_hBrCtl[7];
case   IDC_SENDSMS_9:
return   (LRESULT)m_hBrCtl[8];
case   IDC_SENDSMS_10:
return   (LRESULT)m_hBrCtl[9];
default:
break;
}

return   0;
}


#define   _X(x) (x.left)
#define   _Y(x) (x.top)
#define   _W(x) (x.right   -   x.left)
#define   _H(x) (x.bottom   -   x.top)

//**************************************************************************************
//
// GetBkBrush(   HWND   hWnd,   UINT   nID,   HBITMAP   hBmBk   )
//     
// Creates   Background   brush   for   the   control   specified   by   nID
// according   to   its   position   in   the   parent   dialog   window.
//
// hWnd   [in]:   Handle   to   the   parent   window
//     nID   [in]:   Control   ID
//     hBmBk   [in]:   Bitmap   handle   of   the   parent   dialog 's   background   image
//
//
//**************************************************************************************

HBRUSH   CSendSmsDlg::GetBkBrush(   HWND   hWnd,   UINT   nID,   HBITMAP   hBmBk   )
{
HWND   hWndCtrl;

hWndCtrl   =   ::GetDlgItem(   hWnd,   nID   );

HBRUSH hBrushCtrl   =   NULL;

if(   NULL   !=   hWndCtrl   )
{
RECT   rcCtrl;

::GetWindowRect(   hWndCtrl,   &rcCtrl   );
::ScreenToClient(hWnd,   (LPPOINT)&rcCtrl);
::ScreenToClient(hWnd,   ((LPPOINT)&rcCtrl)+1);

HDC   hDC   =   ::GetDC(hWnd);

HDC   hMemDCBk   =   CreateCompatibleDC(   hDC   );
HDC   hMemDCCtrl   =   CreateCompatibleDC(   hDC   );

HBITMAP   hBmCtrl   =   CreateCompatibleBitmap(   hDC,   _W(rcCtrl),   _H(rcCtrl)   );

HBITMAP   hBmOldBk;
HBITMAP   hBmOldCtrl;

hBmOldBk   =   (HBITMAP)   ::SelectObject(   hMemDCBk,   hBmBk   );
hBmOldCtrl   =   (HBITMAP)   ::SelectObject(   hMemDCCtrl,   hBmCtrl   );

::BitBlt(   hMemDCCtrl,   0,   0,   _W(rcCtrl),   _H(rcCtrl),   hMemDCBk,   _X(rcCtrl),   _Y(rcCtrl),   SRCCOPY   );

::SelectObject(hMemDCCtrl,   hBmOldCtrl   );
::SelectObject(hMemDCBk,   hBmOldBk   );

hBrushCtrl   =   ::CreatePatternBrush(   hBmCtrl   );

DeleteObject(   hBmCtrl   );

::DeleteDC(   hMemDCBk   );
::DeleteDC(   hMemDCCtrl   );
::ReleaseDC(   hWnd,   hDC   );
}

return   hBrushCtrl;
}

 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
为什么你会看到透明的效果你知道吗
1 比如你在一表单上画字,因为只是画字,而不对其它区域画,所以只有字的那部分颜色变,你可以看到好像是透明的背景,其实不是,只是他所画的地方只在要显示的地方,而不是对矩形的整个区域进行重绘,这样就可以做个透明的Label,
2 图片也是同样道理,图片是分层的,分前景和背景,如果你的背景色和你要放的父窗口的背景色一样就达到你说的透明效果,但如果你的背景是渐变的,那就只能需要只画前景了
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
用AlphaBlend  API函数很方便 图片做成通道
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

9
 
用Transbitblt函数吧,就是用来画透明的东西的,,,,
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
有点看晕了,你们的方法在WinCE下可行吗,不过在PC下肯定可以。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

11
 
if(PtInRect)判断区域操作!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
单独一个控件透明是可能做到的,网上有代码,现在我身边没有,但要想实现Base窗口和按钮同时透明,效果就像CCTV-10那个LOGO样,到现在我都还没找到方法,不知道怎么实现。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

13
 
用AlphaBlend  API函数很方便 图片做成通道  这个要在内核编要支持AlphaBlend  
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表