2024年2月19日发(作者:)

MFC实现父窗口不透明,子窗口半透明效果

C++代码

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

32

33

34

35

36

37

38

39

OnEraseBkgnd(CDC* pDC)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

//绘制子窗口的背景,用主窗口的背景填充,实现透明效果

CRect clientRect;

CDC dcEraseBkgnd;

GetClientRect(&clientRect);

int cx = ();

int cy = ();

// First we should save our DC.

CBitmap bitmap;

if(m_eHdc())// Delete our original DC.

m_DC();

m_CompatibleDC(pDC);

CompatibleBitmap(pDC,cx,cy);

m_Object(&bitmap);

m_(0,0,cx,cy,pDC,0,0,SRCCOPY);

//绘制一个半透明的矩形

CDC memdc;

CBitmap bmp,*pOldBitmap;

CompatibleDC(pDC);

CompatibleBitmap(pDC,320,110); //该函数创建与指定的设备环境相关的设的位图。

//nWidth:指定位图的宽度,单位为像素。 nHeight:指定位图的高度,单位为像素。

pOldBitmap = Object(&bmp); //选择一对象到指定的设备上下文环境中

CBrush brush,brushOut;

SolidBrush(RGB(230,230,230));

Object(brush);

lidRect(0,0,320,110,RGB(230,230,230)); //.用指定的固体色填充矩形标。cx,cy宽高

BLENDFUNCTION bf;

p = AC_SRC_OVER;

lags = 0;

ConstantAlpha = 0xAf; //半透明(0-ff,透明度从全透明到不透明)

ormat = 0;

pDC->AlphaBlend(0,0,320,110,&memdc,0,0,320,110,bf); //0,0表示在对话框显示的 Object(pOldBitmap);

}

描述: 根据MSDN所述,子窗口的半透属性是跟随父窗口的。也就是说在子窗口中用SetLayeredWindowAttributes方法完成透明是不可行的。 如果子窗口设置成overlap或者popup格式,虽然可用SetLayeredWindowAttributes实现半透,但是该窗口跟主窗口的关系往往无法或者比较麻烦去实现,比如跟随主窗口移动、显示/隐藏等。因此,本人想到一个比较简单的方法来实现子窗口的半透明效果。

重载子窗口的OnEraseBkgnd消息,在该函数里先实现全透明效果。也就是抓取主窗口在子窗口下的背景图,然后贴到子窗口的背景上。然后在子窗口画一个半透明效果的矩形,即实现了半透明效果的子窗口。