精华内容
下载资源
问答
  • 这是一个在操作系统里比较常见的功能,但在web实现,有哪些需要注意的呢?  1、如何真正的实现锁屏?  2、如何避免通过技术手段绕过锁屏?  我个人总结出2点需要特别注意的地方,下面就分别进行分析。  第一点...

     这是一个在操作系统里比较常见的功能,但在web里实现,有哪些需要注意的呢?

      1、如何真正的实现锁屏?

      2、如何避免通过技术手段绕过锁屏?

      我个人总结出2点需要特别注意的地方,下面就分别进行分析。

      第一点,“如何真正的实现锁屏”,浏览器有个特性,就是可以多开窗口(或tab标签页),这就意味着单纯的靠js和css进行html对象的操作,实现隐藏是不够的,因为如果用户依旧处于登入状态,其他人只需重新开个页面,或者刷新一下,就又变回未锁屏状态了。所以,第一点的解决办法就是,前端通过js和css进行html对象操作的同时,后端需要将当前用户登出,这样用户就处于登出状态了,并且通过锁屏界面解锁登录后,是可以继续之前的操作的。

      第二点,“如何避免通过技术手段绕过锁屏”,如果上一点已经解决,那他人已经无法通过刷新或重新打开窗口绕过锁屏,但还有一种方法,就是通过浏览器自带的一些调试工具,比如chrome的“开发者工具”,firefox的“firebug”,这些可以动态的修改对象元素,做前端开发的一定不陌生。要避免这一问题,解决办法就是在锁屏的时候,创建一个函数实时进行指定对象的检测,检测的指标有,对象是否存在,是否处于隐藏状态,位置是否有变动等。

      针对第二点,我做了一个简单的demo,大家可以玩玩,当点击“开启锁屏”后,在不点击“退出锁屏”按钮,尝试使用浏览器的开发者工具,让“开启锁屏”界面重现出来。


        本文转自胡尐睿丶博客园博客,原文链接:http://www.cnblogs.com/hooray/p/3489057.html,如需转载请自行联系原作者


    展开全文
  • 当前存储库包含使用Xomega技术和框架构建.Net Web桌面应用程序的示例。 这些示例基于以下技术演示了基于示例AdventureWorks数据库的多层应用程序: Blazor服务器应用程序; Blazor WebAssembly应用程序; 具有...
  • web项目转为桌面应用程序

    千次阅读 2018-07-30 19:10:15
    本教程是利用npm和nativefier实现把任意web项目转换成一个桌面应用软件。 2. 环境及软件 操作系统:Windows10 64位 软件:node.js (node-v8.11.3-x64版本) 下载地址:...

    1. 简介

    本教程是利用npm和nativefier实现把任意web项目转换成一个桌面应用软件。

    2. 环境及软件

    • 操作系统:Windows10 64位
    • 软件:node.js (node-v8.11.3-x64版本)

    下载地址:https://nodejs.org/dist/v8.11.3/node-v8.11.3-x64.msi

    3. 安装工具

    • 安装npm

    将下载的node.js安装,这里安装路径默认选到C盘,C:\Program Files\nodejs

    安装完毕在命令行输入(npm –v)测试是否安装成功,正确安装会出现版本号。

    • 安装nativefier

    命令行输入 npm install nativefier –g,即可安装成功。

    • 制作应用

    命令行输入 nativefier [options] <targetUrl> [dest]

    其中options 是选项,targetUrl是目标链接,dest是生成位置,默认当前位置。更多选项及介绍请参考官方文档:https://github.com/jiahaog/nativefier/blob/HEAD/docs/api.md

    • 简单应用

    以百度为例,最简单的命令为:

    nativefier "https://baidu.com/"

    到目前,一个桌面应用已经打造完成。

    应用目录:

    点击.exe文件,启动应用。

    4. 附加内容(选项介绍)

    • 设置名字

    nativefier在制作应用的时候,可以自动识别网站的名字,您也可以自己设置名字。

    nativefier --name "AppName"  <your-website>

    • 设置图标

    nativefier --icon <path>,icon参数应该是图标文件的路径,每个系统文件格式不同具体如下:

    1. .ico - For Windows
    2. .icns - For OSX
    3. .png - For Linux

    nativefier http://172.18.20.47/index --name "CRDC" --icon logo.ico --file-download-options "{\"saveAs\": true}"

    • 设置下载目录

    nativefier <your-website> --file-download-options "{\"saveAs\": true}"

    • 指定输出不同系统的应用

    默认情况下,会根据当前操作系统,输出对应系统的应用。如果您需要特殊指定转换成不同系统的应用,可以使用一下命令。

    nativefier --p <value>

    可选参数linux、windows、osx。

    替代值win32(用于Windows)或darwin,mac(对于OSX)也可以使用。

    • 显示菜单栏

    -m, --show-menu-bar

    指定是否应该显示菜单栏

    • 禁用上下文菜单

    --disable-context-menu

    禁用上下文菜单

    • 单实例

    --single-instance

    阻止应用程序多次运行。如果发生这种尝试,那么已经运行的实例就会出现在前面。

    • 托盘

    --tray

    应用程序将保留为系统托盘中的图标。通过点击窗口关闭按钮来防止关闭应用程序。

    • 设置应用版权

    nativefier --app-copyright <value>

    应用的版权信息会映射到Windows系统的LegalCopyright和OS X系统的NSHumanReadableCopyright的元数据属性。

    • 设置显示

    宽度

    --width <value>

    打包应用程序的宽度,默认为1280px。

    高度

    --height <value>

    打包应用程序的高度,默认为800px。

    最小宽度

    --min-width <value>

    打包应用程序的最小宽度,默认为0。

    最小高度

    --min-height <value>

    打包应用程序的最小高度,默认为0。

    最大宽度

    --max-width <value>

    打包应用程序的最大宽度,默认为无限制。

    最大高度

    --max-height <value>

    打包应用程序的最大高度,默认为无限制。

    X

    --x <value>

    打包的应用程序窗口的X位置。

    Y

    --y <value>

    打包的应用程序窗口的Y位置。

    更多选项请参考第四

    展开全文
  • 背景:公司有个老项目,web项目,但是使用者都想要一个桌面应用程序。实际上,是web程序的启动较为麻烦。这里每次都需要启动Tomcat和浏览器。 想法:重写一个项目太麻烦,想想成本,人间不值得。于是我想着简化一下...

    背景:公司有个老项目,web项目,但是使用者都想要一个桌面应用程序。实际上,是web程序的启动较为麻烦。这里每次都需要启动Tomcat和浏览器。

    想法:重写一个项目太麻烦,想想成本,人间不值得。于是我想着简化一下整个流程。

    要求:界面要美,主要是流畅,看不出来是网页的效果。加载完美。

    过程:启动程序时自动打开tomcat+内嵌浏览器自动全屏并加载页面+关闭时自动关闭tomcat(需要手动修改配置把tomcat后台隐藏)

    完善:

    1.启动和关闭tomcat通过管理员命令来实现

    2.通过对tomcat配置隐藏掉tomcat的后台

    3.为了更为便捷,增加了设置文件;分别是启动bat脚本、关闭bat脚本、内嵌浏览器启动时加载的主页+程序的标题名称

    页面效果大概如下:

    首先是后台加载页面(其实就是在等待系统执行打开web服务器的脚本)

    贴一下代码:

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    public class DoRun extends JPanel {
    	private static final long serialVersionUID = 1L;
    	
    	private final int DELAY = 50;// 转动快慢设置
    //	private final static Long time = (long) 5000;	//窗体关闭事件
    	private static Timer timer;	//动画计时器
    	private int x = 0;
    	/**
    	 * 调用
    	 */
    
    	public void start(boolean flag) {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//本类为Panel
    		frame.add(new DoRun());
    		frame.setSize(300, 300);
    		frame.setLocation(400, 400);
    	
    		// 设置窗体居中显示
    		frame.setLocationRelativeTo(frame.getOwner());
    		
    		//窗体定时关闭
    		/*try {
    			Thread.sleep(time);
    		} catch (InterruptedException e) {
    		}
    		// 停止 Timer,使它停止向其侦听器发送动作事件。
    		timer.stop();
    		frame.setVisible(false);
    		frame.dispose();*/
    		
    	}
    	
    	/**
    	 * 面板构造函数,初始化面板。包括Timer 的场景。
    	 */
    	public DoRun() {
    		timer = new Timer(DELAY, new ReboundListener());
    		timer.start();
    	}
    
    	/**
    	 * 动画效果:不断的更新图像的位置,以达到动画的效果。
    	 */
    	private class ReboundListener implements ActionListener {
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			if (x < 360) {
    				//控制每个DELAY周期旋转的角度,+ 为逆时针  - 为顺时针
    				x = x - 5;
    			} else {
    				x = 0;
    			}
    			repaint();
    		}
    	}
    
    	/**
    	 * 绘出图像在面板中的位置
    	 */
    	public void paintComponent(Graphics page) {
    		super.paintComponent(page);
    		drawArc(page);
    	}
    	
    	/**
    	 * 画图形
    	 */
    	private void drawArc(Graphics g) {
    		Graphics2D g2d = (Graphics2D) g.create();
    		//抗锯齿 
    		//JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/awt/RenderingHints.html
    		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    		int width = getWidth();
    		int height = getHeight();
    		//设置画笔颜色
    		g2d.setColor(Color.BLACK);
    		g2d.drawArc(width / 2 - 110, height / 2 - 110, 10 + 200, 10 + 200, 0, 360);
    		g2d.setColor(Color.GREEN);
    		g2d.fillArc(width / 2 - 110, height / 2 - 110, 10 + 200, 10 + 200, x, 240);
    		g2d.setColor(Color.BLACK);
    		g2d.fillArc(width / 2 - 90, height / 2 - 90, 10 + 160, 10 + 160, 0, 360);
    		g2d.dispose();
    	}
    }
    
    package ceims;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    
    public class FileRead {
        /**
         * 读取txt文件的内容
         * @param file 想要读取的文件对象
         * @return 返回文件内容
         */
        public String txt2String(File file){
            StringBuilder result = new StringBuilder();
            try{
                BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
                String s = null;
                while((s = br.readLine())!=null){//使用readLine方法,一次读一行
                    result.append(System.lineSeparator()+s);
                }
                br.close();    
            }catch(Exception e){
                e.printStackTrace();
            }
            return result.toString();
        }
        
    //    public static void main(String[] args){
    //        File file = new File("C:/3.txt");
    //        System.out.println(txt2String(file));
    //    }
    }
    package ceims;
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Rectangle;
    import java.awt.Toolkit;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.geom.RoundRectangle2D;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    import javax.swing.*;
    
    
    import com.sun.awt.AWTUtilities;
    
    import chrriis.common.UIUtils;
    import chrriis.dj.nativeswing.swtimpl.NativeInterface;
    import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
    
    /**
     * swing实现简单的浏览器窗口
     * 
     * @author WangSong
     *
     */
    public class SimpleBrowser extends JPanel {
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	// 引入窗口、jweb
    	private JPanel webBrowserPanel;
    	private JWebBrowser webBrowser;
    
    	// 构造器传入参数
    	public SimpleBrowser(String url) {
    		super(new BorderLayout());
    		webBrowserPanel = new JPanel(new BorderLayout());
    		webBrowser = new JWebBrowser();
    		webBrowser.navigate(url);// 默认打开的网址
    		webBrowser.setButtonBarVisible(true);// 按钮组
    		webBrowser.setMenuBarVisible(true);// 菜单
    		webBrowser.setBarsVisible(true);// 组件可见
    		webBrowser.setStatusBarVisible(true);// 组件可用
    		webBrowserPanel.add(webBrowser, BorderLayout.CENTER);// 添加浏览器、居中显示
    		add(webBrowserPanel, BorderLayout.CENTER);// Container中添加Panel、居中显示
    		// 执行Js代码
    //        webBrowser.executeJavascript("alert('浏览器打开了....')");
    
    	}
    
    	/**
    	 * 在swing里内嵌浏览器
    	 * 
    	 * @param url   要访问的url
    	 * @param title 窗体的标题
    	 */
    	public static void openForm(String url, String title) {
    		UIUtils.setPreferredLookAndFeel();
    		NativeInterface.open();
    		// 新的线程运行浏览器效果
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				JFrame frame = new JFrame(title);
    				// 设置窗体关闭的时候不关闭应用程序
    				frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    				frame.getContentPane().add(new SimpleBrowser(url), BorderLayout.CENTER);
    				frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    				frame.setLocationByPlatform(true);
    
    				// 重置窗体大小
    				frame.setResizable(true);
    				Toolkit kit = Toolkit.getDefaultToolkit();
    		        Dimension dimension = kit.getScreenSize();
    		        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    		        frame.setBounds(0, 0, dimension.width, dimension.height);
    		        frame.setUndecorated(true);
    				// 让窗体可见
    				frame.setVisible(true);
    				// 设置窗体的宽度、高度
    				//frame.setSize(1400, 700);
    				// 设置窗体居中显示
    				frame.setLocationRelativeTo(frame.getOwner());
    				frame.getGraphicsConfiguration().getDevice() 
                    .setFullScreenWindow(frame);
    				frame.addWindowListener(new WindowAdapter() {
    
    					public void windowClosing(WindowEvent e) {
    						try {
    							Runtime.getRuntime().exec("c:\\close.bat");
    						} catch (IOException e1) {
    							// TODO Auto-generated catch block
    							e1.printStackTrace();
    						}
    						System.exit(0);
    					}
    
    				});
    			}
    		});
    		NativeInterface.runEventPump();
    	}
    
    	// 主程序入口
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		//本类为Panel
    		frame.add(new DoRun());
    
    		frame.setSize(300, 300);
    		frame.setLocation(400, 400);
    		frame.setUndecorated(true);
    		/** 设置圆角 */  
            AWTUtilities.setWindowShape(frame, new RoundRectangle2D.Double(  
                0.0D, 0.0D, frame.getWidth(), frame.getHeight(), 40.0D,  
                40.0D));
    		frame.setVisible(true);
    		frame.setOpacity(0.7f);
    		// 设置窗体居中显示
    		frame.setLocationRelativeTo(frame.getOwner());
    		try {				
    			// 运行bat文件
    			Process process = Runtime.getRuntime().exec("c:\\start.bat");
    			InputStream in = process.getInputStream();
    			String line;
    			BufferedReader br = new BufferedReader(new InputStreamReader(in));
    			if ((line = br.readLine()) != null) {
    				System.out.println(line);
    				frame.setVisible(false);
    				frame.dispose();
    				FileRead fr =new FileRead();
    				String url = fr.txt2String(new File("C:\\url.txt"));
    				String title = fr.txt2String(new File("C:\\title.txt"));
    				openForm(url,title);
    			}
    			in.close();
    			// process.waitFor();
    			System.out.println("执行成功");
    		} catch (Exception e) {
    			System.out.println("执行失败");
    			frame.setVisible(false);
    			frame.dispose();
    			
    			JOptionPane.showMessageDialog(null, "初始化失败!", "", JOptionPane.ERROR_MESSAGE);
    			System.exit(0);
    		}
    
    	}
    }

    有问题的或者相关思路可以交流一下

    展开全文
  • 换肤功能——WPF实现的CS结构桌面程序的换肤功能,大家都用过Web上的换肤功能,这个例子就是用WPF实现的为桌面程序实现换肤的功能。
  • 使用Go&Web Technologies构建桌面应用程序的框架。 向Go程序提供Web界面的传统方法是通过内置的Web服务器。 Wails提供了一种不同的方法:它提供了将Go代码和Web前端包装到单个二进制文件中的能力。 提供的工具可...
  • C# 实现真正的透明控件(Windows桌面程序)

    万次阅读 热门讨论 2017-02-07 14:41:56
    由于上位机程序的需要,需要大量的异性控件,开始不以为然,心想随着GDI到GDI+的升级,微软应该会给NET打造了一套高效绚丽的绘图方案,使用后才知道完全不是我以为的那么回事.于是开始各种寻找资源,发现网上方法无非使用...

    由于上位机程序的需要,需要大量的异性控件,开始不以为然,心想随着GDI到GDI+的升级,微软应该会给NET打造了一套高效绚丽的绘图方案,使用后才知道完全不是我以为的那么回事.于是开始各种寻找资源,发现网上方法无非使用Web.Transparent作为背景,要么就完全使用控件背后作为控件本身背景,然而这些无非都是掩耳盗铃,真正意义上的透明完全没有做到。

    1.其中使用Web.Transparent的透明方案:

    Label使用的的透明方案

    如图,这种透明系统参考的是控件所属控件背景色,并不是透明,注意左边的两个红色框,其实是两个实现真正透明的控件

     

    2.而通过背景截图来作为自己背景图的方案:

    由于需要编写太多代码,就不举例了,看起来挺不错,但也经不起推敲,毕竟很多时候,透明者需要盖住一些与用户交互的控件,可想而知,这种设计将是致命的。

     

    3.因为Form有TransparencyKey属性,很容易实现真正的透明,就想干脆继承Form来做控件,使用的时候,直接SetParent岂不美好,先不说资源耗费,用户体验.单单位置控制都够呛,其消息队列性质的不同,带来的问题,完全不可取,而且在窗体在被指定到窗体后,其透明属性竟然失效了,大写的囧

    难道就没办法了吗??由于透明控件的实现尚未有好的方法,该想法被搁置了半年.

    某个偶尔的机会,接触到了Region对象,关于该对象详细信息请参阅微软的官方文档,但是官方文档也只是机械的介绍了该对象成员而已,看不出什么蹊跷的。

    我是这么理解这个对象的,该对象告诉了系统这个控件需要占用的界面UI信息,而且这个信息是可以随意编辑的,,,,好知道这么多就够了,如果我把这个对象编辑成我要的形状呢?是不是其他不需要的就消失了?怀着这样疑问写下代码:

     

    Region rion = new Region(new Rectangle(0, 0, 20, 20));
    Region = rion;

    乖乖,控件竟然无论我怎么绘制,在窗口上都只有 20×20 大了,尽管我拖得了很大

     

    内心一阵狂喜,,似乎找到了希望

    而情况也恰是如此,通过控制Region的信息,完全可以控制控件需要现实和不现实(透明)的部分,

    那么问题来了,一些规则的透明还好办,但是如果需要按某种特定无规则来异形呢..难道要一点点去算吗?那也太不科学了,想到这里,自然想到通过 Image(Bitemap)转换成Region

    首先看Region的构造函数

    使用一个GraphicsPath 对象来构造,通过搜索图像的每个像素,来将需要显示的区域添加的路径画布里,是否可行呢!

    由于主题关系,这里延伸对GraphicsPath对象讲解,不熟悉的朋友参考相关资料,谢谢。

    根据这一想法,编写转换代码

     

    /// <summary>
            /// 根据图片计算GraphicsPath路径(低效率)
            /// </summary>
            /// <param name="img">图像资源</param>
            /// <param name="TranColor">欲透明掉的颜色</param>
            /// <returns>路径画布,已过滤掉了透明颜色</returns>
            public static GraphicsPath ImageToGraphicsPath(Image imgx,Color TranColor)
            {
                if (imgx == null) return null;
                GraphicsPath g = new GraphicsPath(FillMode.Alternate);
                Bitmap bitmap = null;
                if (typeof(Bitmap) == imgx.GetType())
                    bitmap = (Bitmap)imgx;
                else
                    bitmap = new Bitmap(imgx);
    
                int ImWidth = bitmap.Width;
                int ImHeight = bitmap.Height;
                Color curColor;
                Rectangle curRect = new Rectangle();
                curRect.Height = 1;
                bool isTransRgn;
    
                for (int y = 0; y < ImHeight; y++)
                {
                    isTransRgn = true;
                    for (int x = 0; x < ImWidth; x++)
                    {
                        curColor = bitmap.GetPixel(x, y);
                        if (curColor == TranColor || x == ImWidth - 1)//如果遇到透明色或行尾
                        {
                            if (isTransRgn == false)//退出有效区
                            {
                                curRect.Width = x - curRect.X;
                                g.AddRectangle(curRect);
                            }
                        }
                        else//非透明色
                        {
                            if (isTransRgn == true)//进入有效区
                            {
                                curRect.X = x;
                                curRect.Y = y;
                            }
                        }//if curColor
                        isTransRgn = curColor == TranColor;     
                    }
                }
                return g;
            }

    结果如图:

     

    达到目的...似乎任务完成了,,但是回头想想不对呀!为什么要通过GraphicsPath来中间转换呢?为什么不直接把坐标填充到Region 里呢,

    因为Region 有一个方法是:

    通过GraphicsPath来转换,可能带来其他资源类问题,直接使用这方法估计是不错的选择,于是增加函数:

     

    /// <summary>
            /// 根据图片计算Region路径(低效率)
            /// </summary>
            /// <param name="img">图像资源</param>
            /// <param name="TranColor">欲透明掉的颜色</param>
            /// <returns>一个离散的路径信息</returns>
            public static Region ImageToRegion(Image imgx, Color TranColor)
            {
                if (imgx == null) return null;
                Region rRegion = new Region();
                rRegion.MakeEmpty();
    
                Bitmap bitmap = null;
                if (typeof(Bitmap) == imgx.GetType())
                    bitmap = (Bitmap)imgx;
                else
                    bitmap = new Bitmap(imgx);
    
                int ImWidth = bitmap.Width;
                int ImHeight = bitmap.Height;
                Color curColor;
                Rectangle curRect = new Rectangle();
                curRect.Height = 1;
                bool isTransRgn;
    
                for (int y = 0; y < ImHeight; y++)
                {
                    isTransRgn = true;
                    for (int x = 0; x < ImWidth; x++)
                    {
                        curColor = bitmap.GetPixel(x, y);
                        if (curColor == TranColor || x == ImWidth - 1)//如果遇到透明色或行尾
                        {
                            if (isTransRgn == false)//退出有效区
                            {
                                curRect.Width = x - curRect.X;
                                rRegion.Union(curRect);
                            }
                        }
                        else//非透明色
                        {
                            if (isTransRgn == true)//进入有效区
                            {
                                curRect.X = x;
                                curRect.Y = y;
                            }
                        }//if curColor
                        isTransRgn = curColor == TranColor;
                    }
                }
                return rRegion;
            }

    结果同样成功,就不在上图..

     

    然而似乎没什么问题了,但是细心的朋友可能感觉到了,这种方法读取图像资源是一种极度效率低下的方法,这种直接

    GetPixel怎么都不像用在如此大量图像处理上的,,,如果用来展示动画类,岂不够呛!

    这里不对C#指针,不安全代码,图像处理等知识进行扩展。尽管我们在接下来的函数中使用到相关手段,如果有兴趣的请自行查阅相关文档

    修改相关函数提升效率,减少资源耗费

    /*
             * 为了鼓励学习研究精神,该函数,仅能用于本示例
             * 如果使用到其他项目,可能会存在错误
             * 如果您确实需要正确代码,请学习位图相关信息
            */
            /// <summary>
            /// 取得一个图片中非透明色部分的区域。
            /// </summary>
            /// <param name="Picture">取其区域的图片。</param>
            /// <param name="TransparentColor">透明色。</param>
            /// <returns>图片中非透明色部分的区域</returns>
            public unsafe static Region ImageToRegionPx(Image Picture, Color TransparentColor)
            {
                if (Picture == null) return null;
                Region rgn = new Region();
                rgn.MakeEmpty();
    
                Bitmap bitmap = null;
                if (Picture.GetType() != typeof(Bitmap))
                    bitmap = new Bitmap(Picture);
                else
                    bitmap = (Bitmap)Picture;
    
                int width = bitmap.Width;
                int height = bitmap.Height;
                BitmapData bmData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                byte* p = (byte*)bmData.Scan0;
                int offset = bmData.Stride - width * 3;
    
                int p0, p1, p2;         // 记录透明色
                p0 = TransparentColor.R;
                p1 = TransparentColor.G;
                p2 = TransparentColor.B;
    
                Rectangle curRect = new Rectangle();
                curRect.Height = 1;
    
                int start = -1;
                // 行座标 ( Y col ) 
                for (int Y = 0; Y < height; Y++)
                {
                    // 列座标 ( X row ) 
                    for (int X = 0; X < width; X++)
                    {
                        if (start == -1 && (p[0] != p0 || p[1] != p1 || p[2] != p2))     //如果 之前的点没有不透明 且 不透明 
                        {
                            start = X;                            //记录这个点
                            curRect.X = X;
                            curRect.Y = Y;
                        }
                        else if (start > -1 && (p[0] == p0 && p[1] == p1 && p[2] == p2))      //如果 之前的点是不透明 且 透明
                        {
                            curRect.Width = X - curRect.X;
                            rgn.Union(curRect);
                            start = -1;
                        }
    
                        if (X == width - 1 && start > -1)        //如果 之前的点是不透明 且 是最后一个点
                        {
                            curRect.Width = X - curRect.X;
                            rgn.Union(curRect);
                            start = -1;
                        }
                        p += 3;//下一个内存地址
                    }
                    p += offset;
                }
                bitmap.UnlockBits(bmData);
                bitmap.Dispose();
                return rgn;
            }


    到此,真正的C#桌面程序透明控件设计完成...

    关于其他双缓存,半透明,请参考其他相关知识

    相关源代码(VS2008)开发

    https://download.csdn.net/download/yangshengchuan/12880592

    展开全文
  • web远程桌面

    千次阅读 2013-11-28 20:02:11
    此版本的目的在于扩展客户端的“终端服务”功能,以便系统管理员、网页设计人员和 Web 管理员能够在网页或 Visual Basic® 应用程序实现终端服务客户端会话,而无需用户下载或安装整个“远程桌面连接”
  • 传统桌面程序不能完全被web和移动端替代,但是需要改造。这里要说的是巧用webapi把以前用dll和com组件,ocx等方式做接口,做分布式开发的方式,改成restful 风格api的方式实现跨平台,多客户端(类型).并分享几则案例....
  • 使用系统自己的Web浏览器引擎,针对基于Web技术构建的应用程序的实验性桌面运行时。 该项目还很年轻,正在接受捐助。 Electrino的目标是成为重量轻,功能强大的替代。 它实现了Electron中可用的API的很小一部分,...
  • Hadouken是一个用于构建具有桌面体验的Web应用程序的开源运行时。 OpenFin Core是Hadouken运行时的引用实现Javascript API。
  • iOS,Android,桌面Web上的Flutter应用程序。 描述 该应用程序在线可用,请单击此处-> 体重指数计算器。 UI受的设计启发。 这是一个具有简单功能但具有完整自定义样式的多屏幕应用程序。 您可以在这里找到: ...
  • MVC模式在Java Web应用程序中的实现 一、前言 MVC 作为一种框架模式已经有很久的历史了,这么多年来经受住了工程实践的考验,获得了巨大的成功,... MVC原本存在于桌面程序中的,M是指数据模型,V是指用户界面,C...
  • 修改Web Interface来实现在单应用程序的情况下自动启动应用程序,免去用户点击启动的过程。 原理比较清楚,Web Interface同时支持XenDesktop虚拟桌面的接入,而XenDesktop有这样一个默认的策略,如果用户只有一个...
  • 基于官方JioSaavn Web应用程序的JioSaavn桌面客户端。 内置。 这不是官方产品。 该项目不会尝试对JioSaavn API进行反向工程,也不会尝试重新实现JioSaavn客户端的任何部分。 用户与JioSaavn服务器之间的任何通信均...
  • IrisSkin4.dll这一款.NET桌面程序皮肤插件你用过吗?就是那一款包含了73皮肤并且和vs2012兼容的那款,IrisSkin4官方下载安装包不要错过。 但是今天我们要分享的是同一作者开发的IncUpdate软件工具。IncUpdate 是...
  • 在WPF应用程序中,需要使用到WEB项目的资源,第一时间想到的就是在WPF窗口中,展现WEB项目中的页面,这样子有两点好处:一是,实现简单,不需要在WPF应用程序实现UI布局和数据绑定;二是,灵活适应变化,需求有...
  • web3d技术实现虚拟购物程序

    千次阅读 2018-03-06 10:29:09
    程序演示见文末。1、这是什么?这是个产品展示类应用,名字叫《宅男房间》,利用webGL技术在网页上呈现三维交互内容,展示了一个迷恋二次元的宅男的房间,你可以旋转视角观看房间里的任何角落。2、有哪些功能?最...
  • 这种方式的就是直接实现一个Web程序,再封装一个浏览器展示,相当粗暴和有效。著名的框架就是Electron和NW.js了。 代表应用程序是atom。 一般是基于node.js。也有其它语言的。 各种前端框架的拥趸是这种Style的...
  • 要把数据组合成为一个URL,然后去...如果在桌面程序里,HttpUtility.UrlEncode的调用不是很方便,要在reference里加入一个System.Web才能正常使用。但是我的程序是升级版,这样做怕对程序发布有影响,所以要找另外的方
  • 在linux下实现web qq的桌面

    千次阅读 2010-04-18 14:03:00
    创建桌面图标目前将网络应用扩展到桌面是一个趋势,存在着很多解决方案,本文以 Mozilla Prism 为例,类似的方法同样适用于 Google Chrome 。1. 到 Mozilla Prism 的网站上下载 Prism,点击 Download Now 之后会...
  • 通过这个例子想说明,问题处理的方法是多种多样的,一种组件的应用场合也是多样的,平时slf4j日志系统多用于Web程序,其实桌面程序等一样可以使用。在真实开发自己的一个Java桌面应用的时候,这还是必须的,否则运行...
  • 把Unity3D嵌入winform或者wpf程序,过去大部分使用UnityWebPlayer插件来实现,这个插件其实就是网页上播放unity页游的插件。 但是使用UnityWebPlayer嵌入桌面开发有各种问题,我认为最大的问题是效率问题(加载缓慢...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,324
精华内容 529
关键字:

web实现桌面程序