高分请教各位界面编程高手:异型窗口的实现

abcdhy 2001-10-22 01:18:30
我要在我的程序中实现一个以图片的轮廓作为窗口的外形。

我查了很多的资料,他们都是采用的一个相同的方法:

调入位图后,逐点的取得颜色值,然后再于你要镂空的颜色值进行比较,如果相同就镂空窗口区域的该点。最后得到一个图片轮廓的窗口,再把图片铺到窗口上来完成这个效果。

可是这个方法有一个比较致命的缺陷:速度太慢!!!

举一个例子,我在我机器上 C466+128M ,显示一个 600X400 的真彩色位图窗口,大约需要 7-10 秒钟的时间。这样的速度根本就没有什么实用的价值。

有没有高手给提出一个速度更快的方法?

谢谢!

如果哪位高手的算法能在 1 秒钟左右搞定这个问题,我可以另给 1000 分!!!

...全文
373 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
abcdhy 2001-10-26
  • 打赏
  • 举报
回复
OK
现在结帐!

欢迎继续讨论!
chief 2001-10-25
  • 打赏
  • 举报
回复
O, 是的,因為我看是你用的自已的類,所以沒注意
Roxxette 2001-10-25
  • 打赏
  • 举报
回复
gz
rockswang 2001-10-25
  • 打赏
  • 举报
回复
to abcdhy(程旭) 
不要用OptiRegion了吧,那个类有点bug……
用WannaPlayDIB里的DIB_CreateRgn就好了。
在MFC程序里的问题主要是预编译头文件带来的,在每个cpp的第一行加上#include "stdafx.h"即可。
ycb_wizard 2001-10-25
  • 打赏
  • 举报
回复
up
rockswang 2001-10-25
  • 打赏
  • 举报
回复
to chief(大副) 
呵呵,算法是类似的,
但我发现的最大的不同是我直接从内存取值而不用GetPixel,要知道这个API的效率可是出名的差呀,呵呵。
abcdhy 2001-10-25
  • 打赏
  • 举报
回复
rocks_lee(石子儿) 

怎么 class OptiRegion 在MFC 程序中无法编译通过?
abcdhy 2001-10-25
  • 打赏
  • 举报
回复
呵呵,看来方法越来越好了嘛
chief 2001-10-24
  • 打赏
  • 举报
回复
rocks_lee(石子儿)的算法我看過了,跟我的唯一區別在于他在rect超出2000時就做一次ExtCreateRgn并CombineRgn,這是顧及到98的做法。
ray2_ls 2001-10-24
  • 打赏
  • 举报
回复
up
lanzhengpeng2 2001-10-24
  • 打赏
  • 举报
回复
呵呵。
abcdhy 2001-10-24
  • 打赏
  • 举报
回复
rocks_lee(石子儿) 

你好,我正在研究你写的 WannaPlayDIB
rockswang 2001-10-24
  • 打赏
  • 举报
回复
http://wannaplay.51.net/snap5.jpg
看这个异型窗口是不是很复杂?640*480,保守估计有10000个rects
用WannaPlayDIB不到0.5秒。


rockswang 2001-10-24
  • 打赏
  • 举报
回复
在win2k上可以用LayeredWindow来做
abcdhy 2001-10-24
  • 打赏
  • 举报
回复
大家继续讨论!

帖子再加分 100
abcdhy 2001-10-24
  • 打赏
  • 举报
回复
API 函数我仔细的查过了,只有创建透明位图的函数。
那要怎么才能从一个透明位图来创建一个透明区域呢?
chief 2001-10-24
  • 打赏
  • 举报
回复
to PP_Sky(浩):

請問你做出來的是異形窗口嗎? 其實只是一個部分透明的矩形窗口罷了,你的那部分透明的地方仍屬于該窗口所有,它仍然會遮住其它的窗口。請你把題目看清楚先。
PP_Sky 2001-10-24
  • 打赏
  • 举报
回复
我个人也想过用CreateRgn做,不过不要忘记他是从位图建立的,如果用位图形状建立HRGN的话就太慢,事实上用windows 自已的api 就可以了,忘记了,以上中的CR就是透明色,在我的机上和正常窗体的速度没什么分别。
rockswang 2001-10-23
  • 打赏
  • 举报
回复
在WannaPlayDIB里已经写好很高效的代码了。

http://wannaplay.51.net/products.html
chief 2001-10-23
  • 打赏
  • 举报
回复
速度太慢的原因在于你的算法需要優化

1、不是每找一個點就做一個rect,而是找到一行上的連續點之后才做。

2、不可把CreateRectRgn和CombineRgn放在循環中,而是用RGNDATA結構先保存所取得的所有RECT,再一次性建立RGN。

以下是我的代碼,給你做參考

HRGN CWindowSpyDlg::BmpToRgn(HBITMAP hBitmap, COLORREF cTransparentColor)
{

BITMAP bm;
int i,j;
LPRECT pRect;
HANDLE hHeap=::GetProcessHeap();
if(!hHeap) return NULL;

if(!hBitmap) return NULL;
::GetObject(hBitmap,sizeof(BITMAP),&bm);

HDC memdc=::CreateCompatibleDC(NULL);
if(!memdc) return NULL;
::SelectObject(memdc,hBitmap);

#define MaxNum 100
DWORD iMax=MaxNum;
PRGNDATA pRgnData=(PRGNDATA)::HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(RGNDATAHEADER)+sizeof(RECT)*iMax);
if(!pRgnData) return NULL;
pRgnData->rdh.dwSize=sizeof(RGNDATAHEADER);
pRgnData->rdh.iType=RDH_RECTANGLES;
pRgnData->rdh.nCount=pRgnData->rdh.nRgnSize=0;

bool bIsMask=false;
int iFirst=0;
for(i=0;i<bm.bmHeight;i++)
for(j=0;j<bm.bmWidth;j++)
{
bIsMask=(::GetPixel(memdc,j,i)==cTransparentColor);
if(iFirst && (bIsMask || (!bIsMask && (j==(bm.bmWidth-1)))))
{
//找出一個矩形,加入它
if(pRgnData->rdh.nCount>=iMax)
{
iMax+=MaxNum;
pRgnData=(PRGNDATA)::HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,pRgnData,sizeof(RGNDATAHEADER)+sizeof(RECT)*iMax);
ASSERT(pRgnData);
}
pRect=(LPRECT)pRgnData->Buffer;
pRect[pRgnData->rdh.nCount].left=iFirst;
pRect[pRgnData->rdh.nCount].top=i-1;
pRect[pRgnData->rdh.nCount].right=j;
pRect[pRgnData->rdh.nCount].bottom=i;
pRgnData->rdh.nCount++;

iFirst=0;
}
else
if(!bIsMask && iFirst==0)iFirst=j;
}
//TRACE("Region is : %d",sizeof(RGNDATAHEADER)+sizeof(RECT)*pRgnData->rdh.nCount);
HRGN hRgn=::ExtCreateRegion(NULL,sizeof(RGNDATAHEADER)+sizeof(RECT)*pRgnData->rdh.nCount,pRgnData);
if(!hRgn)
{
HRGN h;
int idx=pRgnData->rdh.nCount;
pRect=(LPRECT)pRgnData->Buffer;
hRgn=::CreateRectRgn(0,0,0,0);
do
{
h=::CreateRectRgn(pRect[idx].left,
pRect[idx].top,
pRect[idx].right,
pRect[idx].bottom);
::CombineRgn(hRgn,hRgn,h,RGN_OR);
idx--;
}while(idx>0);
}
::HeapFree(hHeap,NULL,pRgnData);
return hRgn;
}
加载更多回复(17)

604

社区成员

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

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