UpdateLayeredWindow 无论如何都失败, 参数错误, 要疯掉了

我喝多了 2020-03-02 06:31:24
OnInitDialog() 函数中设置了对话框透明

//1,设置窗体为LaDyeredWindow
long exStyle = ::GetWindowLongW(GetSafeHwnd(), GWL_EXSTYLE);
exStyle |= WS_EX_LAYERED;
::SetWindowLongW(GetSafeHwnd(), GWL_EXSTYLE, exStyle);

//1,设置窗体透明色
::SetLayeredWindowAttributes(GetSafeHwnd(),
RGB(111,111,111), 111, LWA_COLORKEY | LWA_ALPHA);



然后开启了定时器, 用 UpdateLayeredWindow 更新对话框, 就是不现实数据, 代码如下:

CRect rt;
GetWindowRect(rt);//本窗口大小

Bitmap memBitmap(rt.Width(),rt.Height());//内存画布

Graphics memG(&memBitmap);//2.获取这块内存画布的Graphics引用:

//3.在这块内存画布上绘图
SolidBrush brush(Color(0,0,0,0));//黑色全透明画刷
//填充矩形
memG.FillRectangle(
&brush,rt.left,rt.top,
rt.Width(),rt.Height());

Gdiplus::Font myfont(L"微软雅黑", 13, FontStyleBold, UnitPixel);//字体
RectF rtf((REAL)rt.left,(REAL)rt.top,(REAL)rt.right,(REAL)rt.bottom);//画字范围
StringFormat format;
format.SetAlignment(StringAlignmentCenter);//字体居中显示
//白色画刷, 因为要写白色字
SolidBrush fontBrush(Color(255,255,255,255));

Status staus = memG.DrawString(
L"我哈多了", _countof(L"我哈多了"), &myfont, rtf, &format, &fontBrush);//画字

//下面内存DC的数据更新到窗口上

HWND hwnd = GetSafeHwnd();//窗口
HDC hDC = ::GetDC(hwnd);//窗口DC
HDC hMemDC = memG.GetHDC();//内存DC

//更新窗口
CPoint ptDst(rt.left,rt.top);//窗口左顶点坐标
CPoint ptSrc(0,0);//内存DC起始坐标
CSize sz(rt.Width(),rt.Height());//要更新的窗口大小

BLENDFUNCTION alBlend;
memset(&alBlend,0,sizeof(BLENDFUNCTION));
alBlend.BlendOp = AC_SRC_OVER;
alBlend.AlphaFormat = AC_SRC_ALPHA;
alBlend.SourceConstantAlpha = 0; //255 0和255都失败


//更新透明对话框上的内容, 这里无论怎样都TM返回0, 说参数错误, 要疯了
BOOL bRet = ::UpdateLayeredWindow(
hwnd,
hDC,
&ptDst,
&sz,
hMemDC,
&ptSrc,
0,
&alBlend,
ULW_ALPHA);

memG.ReleaseHDC(hMemDC);
::ReleaseDC(GetSafeHwnd(), hDC);//释放DC


求大神帮我解脱, UpdateLayeredWindow 参数给的也不知道哪里有错误啊, 唉, 崩溃中..
...全文
499 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2020-03-04
  • 打赏
  • 举报
回复
schlafenhamster 2020-03-04
  • 打赏
  • 举报
回复

BOOL CMyImageDlg::UpdateDisplay(CDC *pDC,Image *image, int Transparent)
{
int imageWidth = 240;
int imageHeight = 240;//magic number of my image width and height
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap Bitmap,*oldBitmap;
Bitmap.CreateCompatibleBitmap(pDC,imageWidth,imageHeight);
oldBitmap=memDC.SelectObject(&Bitmap);
if(Transparent < 0 || Transparent > 100) Transparent=100;
//
#define AC_SRC_ALPHA 1
BLENDFUNCTION Blend;
Blend.AlphaFormat = AC_SRC_ALPHA;
Blend.BlendFlags = 0;
Blend.BlendOp = AC_SRC_OVER;
Blend.SourceConstantAlpha=int(Transparent*2.55);//1~255, if you want to change transparent, modify this.

CRect rc;
GetWindowRect(&rc);
POINT ptWinPos={rc.left,rc.top};
Graphics g_mem(memDC);
Point points[] = { Point(0, 0),
Point(imageWidth, 0), //width
Point(0, imageHeight)//height
};
// destPoints.length = 3: rect => parallelogram
g_mem.DrawImage(image,points,3);//Do it!
//
POINT ptSrc={0,0};
// 调用UpdateLayerdWindow之前, 要给窗口加上 0x80000样式. 否则无效.
DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);
if((dwExStyle&0x80000)!=0x80000)
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);
//
SIZE sizeWindow={imageWidth,imageHeight};
BOOL bRet=FALSE;
bRet= UpdateLayeredWindow(m_hWnd,pDC->m_hDC,&ptWinPos,
&sizeWindow,memDC.m_hDC,&ptSrc,0,&Blend,2);
g_mem.ReleaseHDC(memDC);
memDC.SelectObject(oldBitmap);
DeleteObject(&Bitmap);
DeleteDC(memDC);
//
return bRet;
}


void CMyImageDlg::OnButton1()
{
Image imageBk(L"Pannel.png");
CDC *pDC=GetDC();
UpdateDisplay(pDC,&imageBk, 80);
}
我喝多了 2020-03-03
  • 打赏
  • 举报
回复
求高手啊, 大神在哪里

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧