4497|8

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC4.0实现不规则窗口 [复制链接]

各位英雄:
我把VC下实现不规则窗口的代码移植到EVC4.0下,可是确看不到效果,对话框显示不出来!主要的函数如下:

void CBitmapDialog :: MakeWindowRgn ()
{
        if (!m_bTransparent)            //窗口不透明
        {
                // Set the window region to the full window
                CRect rc;
                GetWindowRect (rc);
                CRgn rgn;
                rgn.CreateRectRgn (0, 0, rc.Width(), rc.Height());
                SetWindowRgn (rgn, TRUE);
        }
        else                             //根据位图定制窗口形状
        {
                // Set the region to the window rect minus the client rect
                CRect rcWnd;
                GetWindowRect (rcWnd);

                CRgn rgn;
                rgn.CreateRectRgn (rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom);

                CRect rcClient;
                GetClientRect (rcClient);
                ClientToScreen (rcClient);

                CRgn rgnClient;
                rgnClient.CreateRectRgn (rcClient.left, rcClient.top, rcClient.right,
                        rcClient.bottom);

                // Subtract rgnClient from rgn
                rgn.CombineRgn (&rgn, &rgnClient, RGN_XOR);

                // Get a DC for the bitmap
                CDC dcImage;
                dcImage.CreateCompatibleDC (NULL);
                CBitmap *pOldBitmap = dcImage.SelectObject (m_bmBitmap);          //根据位图形状来定制对话框形状

                // Get the bitmap for width and height information
                BITMAP bm;
                m_bmBitmap->GetBitmap (&bm);

                // Get window width and height
                CRect rc;
                GetClientRect (rc);

                // Use the minimum width and height
                int width = min (bm.bmWidth, rc.Width());
                int height = min (bm.bmHeight, rc.Height());

                // Use RLE (run-length) style because it goes faster.
                // Row start is where the first opaque pixel is found.  Once
                // a transparent pixel is found, a line region is created.
                // Then row_start becomes the next opaque pixel.
                int row_start;

                // Go through all rows
                for (int y=0; y                 {
                        // Start looking at the beginning
                        row_start = 0;

                        // Go through all columns
                        for (int x=0; x                         {
                                // If this pixel is transparent
                                if (dcImage.GetPixel(x, y) == m_colTrans)                  //透明底色
                                {
                                        // If we haven't found an opaque pixel yet, keep searching
                                        if (row_start == x) row_start ++;
                                        else
                                        {
                                                // We have found the start (row_start) and end (x) of
                                                // an opaque line.  Add it to the region.
                                                CRgn rgnAdd;
                                                rgnAdd.CreateRectRgn (rcClient.left+row_start,
                                                        rcClient.top+y, rcClient.left+x, rcClient.top+y+1);
                                                rgn.CombineRgn (&rgn, &rgnAdd, RGN_OR);
                                                row_start = x+1;
                                        }
                                }
                        }

                        // If the last pixel is still opaque, make a region.
                        if (row_start != x)
                        {
                                CRgn rgnAdd;
                                rgnAdd.CreateRectRgn (rcClient.left+row_start, rcClient.top+y,
                                        rcClient.left+x, rcClient.top+y+1);
                                rgn.CombineRgn (&rgn, &rgnAdd, RGN_OR);
                        }
                }

                SetWindowRgn (rgn, TRUE);
        }
}

可调用SetWindowRgn (rgn, TRUE);函数后就是无法显示对话框,即使我执行上述函数的if分支也无法显示。
恳请各位英雄指点迷津!

最新回复

呵?自己画?可以自己画不规则的窗体吗? 我其实是想在EVC下制作一个类似google map上的比例尺控件,就是可以缩放、上下左右移动的那种控件。可是它是个不规则的形状,不知道该如何实现?于是我想到用对话框和位图来实现,也即根据位图的形状来定制对话框,这样就形成了类似google map的控件了! 奈何EVC却做不到根据位图定制不规则对话框!同样的代码我在VC下是完全可以实现的!郁闷啊!  详情 回复 发表于 2009-1-4 17:21
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
哪位英雄指点啊,小弟任务紧迫,期待中...
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
引用 1 楼 daigua04 的回复:
哪位英雄指点啊,小弟任务紧迫,期待中...


你真是什么都做啊?
你的什么内存扩大问题解决了?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个试试 GetWindowRect (&rc);    后面的也是  GetWindowRect()里面的参数改为指针  
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
呵,内存问题还没有解决,不过老板有新的要求,只能先放一边了!

对了,把GetWindowRect (&rc); 改成指针还是同样的结果,看不见对话框!我单步调试,在调用SetWindowRgn之前没有发现有任何异常,调用之后,对话框就看不见了!唉!
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

6
 
CE下不支持的,LZ放弃吧!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
啊!!!!!!
痛苦.......我恨微软....
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
呵呵,恨它也没用啊,你可以自己画啊.
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
呵?自己画?可以自己画不规则的窗体吗?

我其实是想在EVC下制作一个类似google map上的比例尺控件,就是可以缩放、上下左右移动的那种控件。可是它是个不规则的形状,不知道该如何实现?于是我想到用对话框和位图来实现,也即根据位图的形状来定制对话框,这样就形成了类似google map的控件了!

奈何EVC却做不到根据位图定制不规则对话框!同样的代码我在VC下是完全可以实现的!郁闷啊!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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