zoukankan      html  css  js  c++  java
  • WINDOWS MOIBLE 透明控件思路

    首先有关UI的东西有几点建议,

    一尽量不要使用D3D,因为D3D基本上不被很多的机型甚至是许多主流的SP机型所支持,所以这很有可能让您的UI不能在很多机型上被支持.

    二在.NET平台上实现透明的效果很有难度,原因有以下几方面

    由于.NET的GDI+的速度本身就不快,而且还要P/INVOKE一系列的API.按照我的反复实验.在实现透明有可能,但是防卡闪烁与拖动效果基本上是不可监得.如果还要一个比较快的刷新速度的话,SP的平台上基本上是别想了.

    下面说一下,实现透明控件的基本思路,由于具体的代码由于涉密的关系实在是不方便贴出来说一下大体的思路.

    下面进入正文.

    1.不管您是用WTL框架(不推荐MFC由于不通用,很多厂商都不把MFC做为组件定制到WM当中去),还是其它什么框架,(纯WIN32肯定能实现但是很挑战).首先用观察者模式来进行事件监听.

    2.用组合封装LAYOUT,一定要做这一步,如果不把LAYOUT组合的方式实现的话,代码修改是相当相当复杂的事情.让LAYOUT类去根据屏幕大小计算机控件的位置和大小,并把需要更新的区别INVALID掉.

    3.新建一个ITEM类,注意这些ITEM一般来说不要做成WINDOW否则速度和刷新都有问题,只需要存TEXT,和ICON,和RECT的以及FOCUSED就OK了.一般来讲在初始化的时候把ITEM传给LAYOUT去计算位置,在RESIZE的时候重新计算位置.另外根据触笔点击的位置去和各个ITEM的位置去计算到底是应该触发什么事件.

    4.利用API APLABLEND(@混合函数)把那些ITEM的画到屏幕上.

    三.关于去闪的方法

    一使用双缓存就是先往BITMAP上画,再画到屏幕上.这个比较常规.

    二建议在支持拖动的时候不要整体刷新屏幕,通过LAYOUT把需要更新的rect INVALID掉就OK了.

    恩,具体的代码并不方向贴出.但是如果大家有自己的观点欢迎多多交流.另外这里需要您对设计模式比较有了解.如果您不太了解建议您至少先看看组合模式,工厂模式,和观察者模式:)

  • 相关阅读:
    [PHP] 适配器模式的日常使用
    [MySQL] timestamp和datetime的区别和大坑
    [PHP] foreach循环的引用赋值可能导致的问题
    [PHP] 邮件发送mail()函数失败问题 sendmail命令与postfix
    [日常] 腾讯云发送邮件失败问题
    [日常] 正则表达式 小括号() 中括号[] 大括号{}
    [Linux] awk与posix字符集
    [PHP] 工厂模式的日常使用
    [PHP] 抽象类abstract的回顾
    [日常]灵活的频率限制实现
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458398.html
Copyright © 2011-2022 走看看