关于异形窗口,在PC上正常到WINCE上就不行了。

xiaoxiaobai xiaoxiaobai 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我在网上找到的一段代码,使窗口基于BMP变成异形,在VC6 + XP上编译运行正常,但是转到 EVC4.0 sp3 + PPC2003SE 系统上编译可以完成,但是在机器上运行窗口却不见了,超级郁闷。
我找了一整晚没有找出原因,各位XD帮我看看哪里出问题了。

void CoolWindowC(HWND hWnd,HBITMAP hBmp,COLORREF BackColor)
{//要改变外形的窗口的句柄,用来设置外形的位图句柄,位图透明色
HDC hDC,hPaper; //窗口设备上下文和窗口内存设备上下文
BITMAP BmpInfo; //位图信息结构
RECT Rect; //窗口矩形
HRGN hRgn,hTempRgn; //窗口区域和临时区域
TCHAR buf[100];
int i,j; //循环变量
int StartX=-1; //不透明行的起始位置,-1表示尚未找到不透明行的起始点
long Style; //窗口风格
//==========重新设置窗口风格========================================
Style=GetWindowLong(hWnd,GWL_STYLE); //得到窗口风格
Style=Style&(!WS_CAPTION); //去掉标题栏
SetWindowLong(hWnd,GWL_STYLE,Style); //为窗口设置新的风格
//------------------------------------------------------------------
Style=GetWindowLong(hWnd,GWL_EXSTYLE); //得到窗口扩展风格
Style=Style&(!WS_EX_WINDOWEDGE); //去掉边框风格
SetWindowLong(hWnd,GWL_EXSTYLE,Style); //为窗口设置新的扩展风格
//------------------------------------------------------------------
Style=GetWindowLong(hWnd,GWL_STYLE); //得到窗口风格
Style=Style|WS_SYSMENU; //加上系统菜单和窗口图标
SetWindowLong(hWnd,GWL_STYLE,Style); //为窗口设置新的风格
//==========核心部分开始============================================
GetObject(hBmp, sizeof(BITMAP), &BmpInfo); //取得位图信息
GetWindowRect(hWnd,&Rect); //得到窗口矩形
//使窗口与位图大小相同
MoveWindow(hWnd, Rect.left, Rect.top, BmpInfo.bmWidth, BmpInfo.bmHeight, false);

hDC = GetDC(hWnd); //得到窗口设备上下文
hPaper = CreateCompatibleDC(hDC); //为窗口设备上下文创建内存设备上下文
SelectObject(hPaper, hBmp); //将位图选进内存设备上下文
hRgn = CreateRectRgn(0, 0, 0, 0); //初始化窗口区域

for(j=0;j<BmpInfo.bmHeight;j++)
for(i=0;i<BmpInfo.bmWidth;i++)
{
if(GetPixel(hPaper,i,j)!=BackColor) //此点是不透明点
{
if(StartX==-1) //是一个不透明行(点)的开始
StartX=i; //标记不透明行(点)的开始位置
//如所有行的最后一点一定是透明的,则去掉下面这个if更快
if(i+1==BmpInfo.bmWidth) //本行的最后一个点是不透明的才需要合并
{
hTempRgn=CreateRectRgn(StartX,j,i+1,j+1); //为不是透明色的点创建临时区域
CombineRgn(hRgn,hRgn,hTempRgn, RGN_OR); //将临时区域合并到窗口区域中
DeleteObject(hTempRgn); //删除每次创建的临时区域以防资源不足
StartX=-1; //重新初始化StartX
}
}else //若此点透明
if(StartX!=-1) //这一点的前一点是不透明行的最后一点
{
hTempRgn=CreateRectRgn(StartX,j,i,j+1); //为不是透明色的点创建临时区域
CombineRgn(hRgn,hRgn,hTempRgn, RGN_OR); //将临时区域合并到窗口区域中
DeleteObject(hTempRgn); //删除每次创建的临时区域以防资源不足
StartX=-1; //重新初始化StartX
}
}

if (SetWindowRgn(hWnd,hRgn,true) == 0) //用作好的区域作为窗口的外形
{
wsprintf(buf, TEXT("SetWindowRgn Error %d !"), GetLastError());
MessageBox(hWnd, buf, TEXT("错误"), MB_ICONERROR);
}

//将位图画到窗口上
if (!BitBlt(hDC,0,0,BmpInfo.bmWidth,BmpInfo.bmHeight,hPaper,0,0,SRCCOPY))
{
wsprintf(buf, TEXT("BitBlt Error %d !"), GetLastError());
MessageBox(hWnd, buf, TEXT("错误"), MB_ICONERROR);
}
//==========善后工作================================================
DeleteObject(hRgn); //删除窗口区域
DeleteObject(hTempRgn); //删除临时区域
DeleteDC(hPaper); //删除位图的内存设备上下文
ReleaseDC(hWnd,hDC); //删除窗口设备上下文
}


void CoolWindow(HWND hWnd,HBITMAP hBmp,int x,int y)
{//以指定点的颜色作为透明色产生异形窗口
HDC hDC,hPaper; //窗口和内存设备上下文句柄
COLORREF BackColor; //透明色
hDC=GetDC(hWnd); //得到窗口设备上下文
hPaper=CreateCompatibleDC(hDC); //为窗口设备上下文创建内存设备上下文
SelectObject(hPaper,hBmp); //将位图选进内存设备上下文
BackColor=GetPixel(hPaper,x,y); //在指定位置取得透明色
DeleteDC(hPaper); //删除内存设备上下文句柄
ReleaseDC(hWnd,hDC); //删除窗口设备上下文句柄
CoolWindowC(hWnd,hBmp,BackColor); //使用指定透明色产生异形窗口
}
...全文

相关推荐

easy-query-Kotlin资源

javaorm(kotlin)sql

lsx202406

电子纸价签实战:基于SSD1680的墨水屏驱动开发与优化

本文详细介绍了基于SSD1680驱动芯片的电子纸价签开发实战,涵盖硬件连接、驱动框架搭建、核心流程解析及性能优化。重点剖析了初始化配置、波形文件加载、图像数据写入与刷新触发等关键步骤,并提供了功耗优化、显示效果提升及代码健壮性等实用避坑指南,帮助开发者高效实现稳定低功耗的墨水屏驱动。

郑自春

Boost变换电路在新能源车充电系统中的创新应用与挑战

本文探讨了Boost变换电路在新能源车充电系统中的创新应用与挑战,重点分析了其在高压快充、能量回收等场景中的技术突破。通过电力电子仿真和新型器件应用,如SiC MOSFET,显著提升了功率密度和转换效率。同时,文章还深入讨论了电磁兼容性(EMC)挑战及智能控制算法的实际应用,为新能源车充电系统的优化提供了实用解决方案。

AI 寿司师傅

40-Type-C电路设计

Type-C电路设计

叶倾城-硬件原创

别再乱选WiFi信道了!手把手教你用WiFi Analyzer优化2.4G/5G家庭网络(附避坑指南)

本文详细介绍了如何使用WiFi Analyzer工具优化家庭WiFi网络,解决2.4GHz和5GHz信道的冲突问题。通过分析信道拥堵原因、提供安装使用指南及优化策略,帮助用户显著提升网络速度与稳定性,特别适合密集住宅区和多设备家庭。

余淏
评论 13
收藏 已收藏
分享
返回顶部
xiaoxiaobai
嵌入开发(WinCE) 19,524 成员 41,565 内容