名人名言:人们说生命是很短促的,我认为是他们自己使生命那样短促的。由于他们不善于利用生命,所以他们反过来抱怨说时间过得太快;可是我认为,就他们那种生活来说,时间倒是过得太慢了。——卢梭

.NetCF 绘制半透明效果

前言

  关键字:.NetCF 半透明、AlphaBlend

  用C#开放Windows Mobile刚好满一个月,一直是边看文章边写点小例子,而这些例子里面半透明效果是最让人心动的,本文主要收集和实践了关于.Net CF半透明效果例子,以及自己一点点经验和需要注意的问题。

正文

  一、绘制透明标签控件(Label)

    1.1  效果图

    

    1.2  代码

      1.2.1  实现代码

        /// <summary>
        /// 透明Label控件
        ///     注意,将Label的Visible设置为false;适合背景为图片(PictureBox)
        /// </summary>
        /// <param name="label"></param>
        /// <param name="g"></param>
        public static void TransparentLabel(Label label, Graphics g)
        {
            Rectangle rect = label.Bounds;
            SolidBrush sb = new SolidBrush(label.ForeColor);
            SizeF size;
            //计算字符串的位置
            switch (label.TextAlign)
            {
                case ContentAlignment.TopLeft:
                    break;
                case ContentAlignment.TopCenter:
                    //计算字符串长度
                    size = g.MeasureString(label.Text, label.Font);
                    rect.X += (int)((rect.Width - size.Width) / 2);
                    rect.Y += (int)((rect.Height - size.Height) / 2);
                    break;
                case ContentAlignment.TopRight:
                    size = g.MeasureString(label.Text, label.Font);
                    rect.X += rect.Width - (int)size.Width;
                    rect.Y += rect.Height - (int)size.Height;
                    break;
            }
            g.DrawString(label.Text, label.Font, sb, rect);
            sb.Dispose();
        }

      1.2.2  调用代码

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            TransparentLabel(this.label1, e.Graphics);
        }

      1.2.3  代码说明

        虽然本节说的是Label透明化,实际上可以看得出并没有将字透明化,只是"去掉"了Label的背景。这里Label控件充当了保存字符串信息的作用,实际调用DrawString直接画在屏幕上去的。

        a).  因为是Label是在PictureBox上,所以在其Paint事件中绘制Label中的字符串;如果没有PictureBox作为背景,而是直接在Form窗体上,那么把这段代码写到窗体的OnPain中即可。

    1.3  注意问题

       1.3.1  需要将Label的Visiable设置为false!

  二、绘制透明图片(PictureBox)

    2.1  效果图

    

    2.2  代码

      2.2.1  实现代码

        /// <summary>
        /// 绘制透明图片
        /// </summary>
        /// <param name="gxBuffer"></param>
        /// <param name="barImage"></param>
        /// <param name="barRect"></param>
        /// <param name="transp"></param>
        public static void DrawAlpha(Graphics gxBuffer, Image barImage, Rectangle barRect, byte transp)
        {
            using (Graphics gxSrc = Graphics.FromImage(barImage))
            {
                IntPtr hdcDst = gxBuffer.GetHdc();
                IntPtr hdcSrc = gxSrc.GetHdc();
                BlendFunction blendFunction = new BlendFunction();
                blendFunction.BlendOp = (byte)BlendOperation.AC_SRC_OVER;
                blendFunction.BlendFlags = (byte)BlendFlags.Zero;
                blendFunction.SourceConstantAlpha = transp;
                blendFunction.AlphaFormat = (byte)0;
                AlphaBlend(hdcDst, barRect.Left, barRect.Top, barRect.Size.Width, barRect.Size.Height, hdcSrc, 0, 0, barImage.Width, barImage.Height, blendFunction);
                gxBuffer.ReleaseHdc(hdcDst);
                gxSrc.ReleaseHdc(hdcSrc);
            }
        }

/// <summary>
        /// 绘制透明图象
        /// </summary>
        /// <param name="hdcDest">生成画面的Handle</param>
        /// <param name="xDest">生成画面的x</param>
        /// <param name="yDest">生成画面的y</param>
        /// <param name="cxDest">生成画面的width</param>
        /// <param name="cyDest">生成画面的height</param>
        /// <param name="hdcSrc">原图的Handle</param>
        /// <param name="xSrc">原图的x</param>
        /// <param name="ySrc">原图的y</param>
        /// <param name="cxSrc">原图的width</param>
        /// <param name="cySrc">原图的height</param>
        /// <param name="blendFunction">控制 Alpha 混合的结构</param>
        /// <returns></returns>
        [DllImport("coredll.dll")]
        extern public static Int32 AlphaBlend(IntPtr hdcDest, Int32 xDest, Int32 yDest, Int32 cxDest, Int32 cyDest, IntPtr hdcSrc, Int32 xSrc, Int32 ySrc, Int32 cxSrc, Int32 cySrc, BlendFunction blendFunction);

      2.2.2  调用代码

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            CFControlUtility.DrawAlpha(e.Graphics, pbBar.Image, pbBar.Bounds, 170);
        }

      2.2.3  代码说明

        a).  transp值为0-255,0为完全透明,255为无透明效果。

    2.3  注意问题

      将需要透明效果图片的Visiable设置为false!

  三、绘制透明表格

    3.1  效果图

    

    3.2  实现代码

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Bitmap offBitmap = new Bitmap(100, 100);
            Graphics gxBuffer = Graphics.FromImage(offBitmap);
            //清空底色
            gxBuffer.Clear(this.BackColor);

Pen pen = new Pen(Color.DodgerBlue);
            Font font = new Font("Arial", 10, FontStyle.Regular);
            SolidBrush brush = new SolidBrush(Color.Black);

int width, height = 0;
            //绘制2列4行数据
            for (int i = 0; i < 4; i++)
            {
                width = 0;
                for (int j = 0; j < 2; j++)
                {
                    //绘制数据
                    gxBuffer.DrawString("测试数据", font, brush, width, height);

width += 50;
                    //绘制竖线
                    if (i == 0)
                        gxBuffer.DrawLine(pen, width, 0, width, offBitmap.Height);
                    
                }
                height += 25;
                //绘制横线
                gxBuffer.DrawLine(pen, 0, height, offBitmap.Width, height);
            }

brush.Dispose();
            font.Dispose();
            pen.Dispose();
            gxBuffer.Dispose();

//将内存中的图片绘制到界面上来
            DrawAlpha(e.Graphics, offBitmap, new Rectangle(50, 100, offBitmap.Width, offBitmap.Height), 170);
            //e.Graphics.DrawImage(offBitmap, 50, 100);
        }

    3.3  代码说明

      a).  这里在内存中绘制了临时图片offBitmap,然后再将临时图片绘制显示到设备上面来的,这样可以极大提高性能,大家可以直接用e.Graphics一笔笔绘制比较看下性能。

      b).  用完绘图对象相关对象之后记得Dispose掉,或者用using代码块。

  四、 其他

    4.1  屏幕闪烁问题

        protected override void OnPaintBackground(PaintEventArgs e)
        {
            //base.OnPaintBackground(e);        
        }

    4.2  直接用e.Graphics绘制文字+图片的时候可能出现闪烁的问题

      在绘制完文字后再覆盖一张透明度为0的空图片即可,用内存临时图片不会有这问题的。

    4.3  绘制控件透明时,千万记得把控件的Visible设置为false。该控件只是充当绘制信息存储作用,其鼠标事件(Mouse)全部会没有(这不废话- - #,控件都隐藏了),所以要做判断得再PictureBox或窗体的相关事件里面做判断,然后再判断点击的位置来识别到底是否点击的透明控件。

    4.4  Graphics相关方法需要都弄清楚用熟练了,非常有用,比如MeasureString可以计算字符串的长度,可以控制绘制字符串的位置;FillRectangle可以填充矩阵,画行的背景色的时候可以用。

    4.5  如果大规模的绘制透明效果,需要特别注意性能问题,可以采取措施如临时图片、内存缓存数据等。

    4.6  通过取消单色显示来达到透明效果,但是效果不太理想,相关的对象:ImageAttributes。

结束语

   如果被这种透明效果吸引甚至打算在项目中使用,那么要做好吃苦耐劳的准备,大部分控件都要重绘,处理非常多的逻辑判断,比较麻烦- - #。

转载于:https://www.cnblogs.com/jiangj/archive/2010/12/03/1895685.html

.NetCF 绘制半透明效果相关推荐

  1. OpenGL 半透明效果的实现(混合)、雾效果 和 圆滑(抗锯齿)

    在前面的glColor总是忽略最后一个参数alpha,今天就来学习下这个参数的使用 在早上的光照球体的例子基础上进行演示,早上的例子是在白色的地面上有几个彩色的球体和一个类似于玉镯子的模型,利用半透明 ...

  2. [MFC] 几种子控件半透明效果的实现办法

    什么是"控件半透明效果" ? 如下图所示,美图秀秀中间的四个按钮,边缘四个角都是透明的,呈现出椭圆效果: 熟悉MFC开发的都知道 虽然四个按钮的边缘是椭圆的 实际上椭圆之外的角落 ...

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

    [cpp] view plaincopy OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //绘制子窗口的背景,用主窗口的背景填充,实现透 ...

  4. Layered Windows窗口的半透明效果

    介绍: Layered Windows是windows窗口中的一类,提供类似半透明的效果(阿尔法混合).半透明效果是字面上有能看出来的,但实际上根据MSND,该类型的窗口还能更好的支持非矩形的窗口,使 ...

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

    参考 https://blog.csdn.net/u011430225/article/details/48470373 描述: 根据MSDN所述,子窗口的半透属性是跟随父窗口的.也就是说在子窗口中用 ...

  6. 一些常规形几何形状的绘制和效果填充(三)

    源程序下载 (续)               visualsan@yahoo.cn 下面以实现钟和旋转文字为例具体讲解CShape的使用方法:     钟由表盘,指针和刻度组成.具体绘图函数在OnP ...

  7. 一些常规形几何形状的绘制和效果填充(一)

    源程序下载 一些常规形几何形状的绘制和效果填充                       visualsan@yahoo.cn      常规几何形状是指三角形,多边形,圆,圆弧,直线,点,文字等的 ...

  8. Eeic Meyer on CSS 之 背景半透明效果

    CSS 并不支持任何形式上的半透明的效果. 书上介绍了两种方法来达到半透明的效果. 第一种是利用"半屏(halfscreen)",是由Todd Fahrner 提出的. 原理上就是 ...

  9. unity shader 入门 全透明与半透明效果实现

    片元函数的fixed4类型的返回值的第4位即为阿尔法值,0代表完全不显示(透明),1代表完全显示.中间的数值代表半透明.但只修改这个值是不能直接修改透明度的,因为还要对队列等进行修改. 本文介绍透明度 ...

  10. Visual C++游戏编程基础之透明半透明效果

    一.基本思路 1.半透明的原理 一张位图由许多像素组成,而每一像素包含R.G.B三原色,三原色的值决定了像素的色彩,要实现半透明效果,需要把前景图    和背景图彼此对应的像素颜色按某一比例进行调配, ...

最新文章

  1. 一般来说,神经网络的架构可以分为哪三类?
  2. 《麻省理工科技评论》发布“21世纪迄今十大最糟科技”
  3. 一文读懂深响年度大会,增长密码藏在这些关键词里
  4. 超级干货:关于数据中台的深度思考与总结
  5. 按照一定策略把网页抓回到搜索引擎服务器的,SEO新手学习:搜索引擎的基本步骤...
  6. go语言高并发与微服务实战_go-micro+gin+etcd微服务实战之服务注册与发现
  7. 收集程序员的几幅对联
  8. AntDesign组件库的使用
  9. 我用大屏模板做年中可视化报告,惊艳了在场的同事和领导
  10. android 透明度_Android智能视图翻转器
  11. 如何编写内联if语句用于打印?
  12. 2020年最新世界地图_2020世界地图下载
  13. python同步油管用户信息
  14. b站python弹幕签到_一个python脚本就可以B站查找弹幕发送者!
  15. win7计算机评分,终于全7.9!编辑冲击Win7系统分级满分
  16. python毕业设计题目推荐汽车销售系统
  17. win10无法连接到这个网络_网络打印机连接正常但无法打印
  18. 建立桌面文件管理格子_win10如何创建桌面格子_win10怎么建立桌面文件管理格子...
  19. CF498D Traffic Jams in the Land
  20. 防火墙服务器搭建与应用(1.0)

热门文章

  1. AeroSpike踩坑手记1:Architecture of a Real Time Operational DBMS论文导读
  2. 【本周上榜!】看雪论坛精华优秀文章分享与点评
  3. 考拉Android全局滑动返回及联动效果的实现
  4. Check Point截获JavaScript文件隐形攻击
  5. MySQL中char、varchar和text的区别
  6. centos+darwin搭建简单的视频流服务器
  7. PC远程调试设备(转)
  8. onItemLongClick+onCreateContextMenu实现长按ListItem弹出不同菜单
  9. 鸿蒙来了!能否与安卓、iOS三足鼎立?
  10. 厉害,Spring Boot 2.3.0 刚刚发布了!