Go语言使用go-sciter创建桌面应用(七) view 对象常用方法,文件选择,窗口弹出,请求

view对象的详细文档请看:

https://sciter.com/docs/content/sciter/View.htm

demo9.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>view对象学习</title>
    <style>
        .br {
            width: 100%;
            border: 1px solid #ccc;
            margin: 10px auto;
        }
    </style>
</head>
<body>
 
<div class="br">
    <button id="selFile">选择文件</button>
    <span id="filePath"></span>
    <br>
    <button id="selFolder">选择目录</button>
    <span id="folderPath"></span>
    <br>
    <button id="moveFile">移动</button>
    <span id="moveRet"></span>
</div>
<div class="br">
    <button id="msgbox1">消息框</button>
    <br>
    <button id="msgbox2">信息框</button>
    <br>
    <button id="msgbox3">问题框</button>
    <br>
    <button id="msgbox4">警告框</button>
    <br>
    <button id="msgbox5">错误框</button>
</div>
 
<div class="br">
    <button id="dlg1">对话框</button>
</div>
 
<div class="br">
    <button id="win1">窗口</button>
    <br>
</div>
 
<div class="br">
    <button id="state1">全屏</button>
    <button id="state2">默认</button>
    <button id="state3">关闭</button>
</div>
 
<div class="br">
    <button id="req">请求</button>
    结果:
    <iframe id="reqRet"></iframe>
</div>
 
<script type="text/tiscript">

	/*
    	第一次加载完元素后,不能触发回调。这个可能是个BUG
    	https://sciter.com/forums/topic/debug-break-in-self-ready-only-works-when-file-loaded-a-second-time
		self.ready = function() { };
	    可用 view.root.on("ready", function() { }); 替代
    */

	view.root.on("ready", function() {
		var file = "";
        var folder = "";

        //选择文件
        $(#selFile).on("click", function() {
            //文件筛选项
            const filter = "Image Files (*.jpg,*.jpeg,*.gif,*.png)|*.jpg;*.jpeg;*.gif;*.png|All Files (*.*)|*.*";
            //默认后缀
            const defaultExt = "jpg";
            //初始化路径,就是文件选择窗打开时所在路径
            const initialPath = System.path(#USER_DOCUMENTS);
            //标题
            const caption = "选择图片";
            file = view.selectFile(#open, filter, defaultExt, initialPath, caption );
            $(#filePath).text = file;
            return true;
        });
        //选择文件夹
        $(#selFolder).on("click", function() {
            folder = view.selectFolder("选择你的文件夹");
            $(#folderPath).text = folder;
        });
        //移动文件
        $(#moveFile).on("click", function() {
            if(file && folder) {
                //调用go中定义的函数进行移动文件处理
                var ret = view.moveFile(file, folder);
                $(#moveRet).text = ret;
            }
        });
 
        //消息框
        $(#msgbox1).on("click", function() {
            view.msgbox(#alert, "我是消息框");
        });
        //信息框
        $(#msgbox2).on("click", function() {
            view.msgbox(#information, "我是信息框", "信息框");
        });
        //问题框
        $(#msgbox3).on("click", function() {
            view.msgbox(#question,
                        "请选择是或否",
                        "问题框",
                        //按钮组
                        [{id:#yes,text:"是"},{id:#no,text:"否"}],
                        //onLoad,窗口加载时调用
                        function(root) {
 
                        },
                        //onClose,窗口关闭时调用
                        function(root, id) {
                            //id表示你选择按钮的ID
                            if(id == "yes") {
                                view.msgbox(#alert, "你选择的yes");
                            } else {
                                view.msgbox(#alert, "你选择的no");
                            }
                        });
        });
        //警告框
        $(#msgbox4).on("click", function() {
            view.msgbox(#warning, "我是警告框");
        });
        //错误框
        $(#msgbox5).on("click", function() {
            view.msgbox(#error, "我是错误框");
        });
 
        //新对话框
        $(#dlg1).on("click", function() {
            var dlg = view.dialog({
                //加载到对话框中的URL,可加载本地文件
                url: self.url("simple.html"),
                //对话框的x,y坐标
                x: 50,
                y: 50,
                //窗口的宽度,高度
                width: 200,
                height: 200,
                //是否是客户区,如果为真,那么x,y,width,height作为客户区坐标,而不是窗口
                client: false,
                //对话框参数
                parameters: {"test":"test"},
                //对话框标题
                caption: "新对话框",
                //相对于屏幕窗口对齐
                alignment: 3,
            });
        });
 
        //新窗口
        $(#win1).on("click", function() {
            var win = view.window({
                //窗口类型
                //View.FRAME_WINDOW 框架窗口
                //View.TOOL_WINDOW 工具窗口
                //View.POPUP_WINDOW 弹出窗口
                type: View.TOOL_WINDOW,
                //加载到窗口中的URL,可加载本地文件
                url: self.url("simple.html"),
                //窗口的x,y坐标
                x: 200,
                y: 200,
                //窗口的宽度,高度
                width: 400,
                height: 400,
                //是否是客户区,如果为真,那么x,y,width,height作为客户区坐标,而不是窗口
                client: false,
                //窗口状态
                //View.WINDOW_SHOWN 显示
                //View.WINDOW_HIDDEN 隐藏
                //View.WINDOW_MINIMIZED 最小化
                //View.WINDOW_MAXIMIZED 最大化
                //View.WINDOW_FULL_SCREEN 全屏
                state: View.WINDOW_SHOWN,
                //窗口参数
                parameters: {"test":"test"},
                //窗口标题
                caption: "新窗口",
                //相对于屏幕窗口对齐
                alignment: 3,
            });
            //访问窗口中设置的参数
            stdout.println(win.parameters["test"]);
        });
 
        //修改当前窗口的状态
        $(#state1).on("click", function() {
            //全屏
            view.state = View.WINDOW_FULL_SCREEN;
        });
        $(#state2).on("click", function() {
            //默认
            view.state = View.WINDOW_SHOWN;
        });
        $(#state3).on("click", function() {
            //关闭
            view.close();
        });
 
        //view的事件响应
        //视图窗口大小发生改变时
        view.on("sizing", function(sizingParams) {
            view.dump("大小改变", sizingParams.x, sizingParams.y, sizingParams.width, sizingParams.height);
        });
        //视图窗口移动时
        view.on("moving", function(movingParams) {
            view.dump("移动改变", movingParams.x, movingParams.y, movingParams.width, movingParams.height);
        });
        //视图窗口状态改变时
        view.on("statechange", function() {
            view.dump(view.state);
        });
 
        //请求方法类似jquery中的ajax
        $(#req).on("click", function() {
            view.request({
                //请求类型(#get, #post, #put, #delete)
                type: #get,
                //请求url
                url: "http://www.163.com",
                //协议(#basic, #multipart, #json)
                protocol: #basic,
                params: {
                    "test": "test"
                },
                //成功回调函数
                success: function(data,status) {
                    $(#reqRet).html = data;
                },
                //失败回调函数
                error: function(err,status) {
                
                }
            });
        });
	});
</script>
</body>
</html>

demo9.go代码如下:

package main;
 
import (
    "github.com/sciter-sdk/go-sciter/window"
    "github.com/sciter-sdk/go-sciter"
    "log"
    "net/url"
    "os"
    "strings"
    "path/filepath"
    "io/ioutil"
    "fmt"
)
 
func defFunc(w *window.Window) {
    //注册dump函数方便在tis脚本中打印数据
    w.DefineFunction("dump", func(args ...*sciter.Value) *sciter.Value {
        for _, v := range args {
            fmt.Print(v.String() + " ");
        }
        fmt.Println();
        return sciter.NullValue();
    });
    //处理文件移动
    w.DefineFunction("moveFile", func(args ...*sciter.Value) *sciter.Value {
	    // 获取文件和获取路径,对于中文都进行了url编码,需要通过go的url.PathUnescape进行解码。
        file := url.PathUnescape(args[0].String());
        folder := url.PathUnescape(args[1].String());
 
        //去掉路径左边的file://
        file = strings.TrimLeft(file, "file://");
        //获取文件名
        fileName := filepath.Base(file);
        //读取文件数据
        data, err := ioutil.ReadFile(file);
        if err != nil {
            return sciter.NewValue(err.Error());
        }
        //写入文件数据
        err = ioutil.WriteFile(filepath.Join(folder, fileName), data, os.ModePerm);
        if err == nil {
            //删除原文件
            os.Remove(file);
            return sciter.NewValue("移动成功");
        } else {
            return sciter.NewValue("移动失败");
        }
    });
}
 
func main() {
    w, err := window.New(sciter.DefaultWindowCreateFlag, sciter.DefaultRect);
    if err != nil {
        log.Fatal(err);
    }
    //注意这个地方,sciter较新的版默认的情况下禁用了非安全脚本功能
    //需要设置下配置,开启此功能,不然tiscript中打开文件或目录将无法使用。
    w.SetOption(sciter.SCITER_SET_SCRIPT_RUNTIME_FEATURES,
                sciter.ALLOW_FILE_IO |
                sciter.ALLOW_SOCKET_IO |
                sciter.ALLOW_SYSINFO);
    w.LoadFile("demo9.html");
    w.SetTitle("view对象学习");
    defFunc(w);
    w.Show();
    w.Run();
}

显示结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关于选择文件,选择目录,无法使用的说明。
由于sciter的更新,默认情况下已禁用非安全脚本功能。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Regulations/article/details/105655459
今日推荐