精华内容
下载资源
问答
  • 本人第一次发帖,希望收到高手指点,选中一个panel,panel上用Drawimg画了一个图像,鼠标按住左键移动生成一个虚拟图像,拖动效果和桌面快捷方式一样,怎么生成虚拟图像呢? 小女子拜求大牛指点[img=...
  • 说明:本次作业采用EntityFramework框架完成,连接字符串的存放位置:Exam001\Exam001\App.congif 登录界面 ... 主界面 主界面可以直接进行数据的“删除”与“查询”操作。...查询数据:查询时,“货物代码”、“商品...

    说明:本次项目为.Net数据访问技术课程期末大作业,采用EntityFramework框架完成,连接字符串的存放位置:Exam001\Exam001\App.congif,源代码参见上方资源链接。

    • 登录界面

    输入用户名:daixiang,密码:123456,点击登录按钮登录进入主界面,账户名密码错误会提示“用户名或密码错误”,代码调用存储过程实现登录。
    在这里插入图片描述

    • 主界面

    主界面可以直接进行数据的“删除”与“查询”操作。
    删除数据:在数据行上右键“删除”或选中记录行点击“删除”按钮,可进行数据的删除操作。
    查询数据:查询时,“货物代码”、“商品名称”不是必填,“商品类型”必选,输入/选择后,点击“查询”按钮可进行多条件查询。
    在这里插入图片描述

    • 查询界面

    查询:查询时,“货物代码”、“商品名称”不是必填,“商品类型”必选,输入/选择后,点击“查询”按钮可进行多条件查询。
    在这里插入图片描述

    • 删除界面

    删除数据:在数据行上右键“删除”或选中记录行点击“删除”按钮,可进行对数据的删除操作。
    在这里插入图片描述

    • 添加商品界面

    添加商品:用户在主界面点击“增加”按钮,进入添加商品界面,库存量和售价只接收数字输入,输入信息后点击“提交”即可完成商品的添加,提交时会校验字段,为空不允许提交。
    在这里插入图片描述

    • 修改商品界面

    修改商品:选中数据行,点击修改,进入数据修改界面,填写信息后点击“提交”存储信息。
    在这里插入图片描述


    作者:戴翔
    电子邮箱:daixiangcn@outlook.com
    微信开发者主页:Null
    简介:中国公民,CSDN博客专家,秦淮区疾控中心托管社会公益组织指南针工作室志愿者,创业公司研发中心负责人,在校大学生。第二届大学生微信小程序应用开发大赛全国三等奖项目第一作者,微信小程序《约车吗》、《庆云慈善会》、《锋云速检》项目总工程师。


    展开全文
  • WindowsForm窗体位置

    2017-02-20 16:19:21
     WindowsForm的窗体,是winForm程序的基本单元。窗体的大小和位置是如何控制的呢?   先看窗体的几个属性。如下图所示   一、 设置窗体起始位置居中 窗口默认是在左上角的,可以用微软定义好...

    转载地址:http://www.cnblogs.com/mfk0506/p/6196020.html

     WindowsForm的窗体,是winForm程序的基本单元。窗体的大小和位置是如何控制的呢?

     

    先看窗体的几个属性。如下图所示

     

    一、 设置窗体起始位置居中

    窗口默认是在左上角的,可以用微软定义好的FormStartPosition属性来配置为居中:

    this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;

    等同于 

    这个属性的其他值也可以了解下:

    属性值

    说明

    CenterParent

    在其父窗体中居中

    Manual

    位置由Location属性决定

    WindowsDefaultBounds

    默认位置,边界也默认

    WindowsDefaultLocation

    默认位置,尺寸在窗体大小中指定

     

    其中提到了Location属性,下面详谈。

     

    二、 指定窗体位置和大小。

    窗体有Left,Right,Top,Bottom属性,似乎很完美,应该定义这四项,就能明确指定窗体的大小和位置了吧?然而并非如此。RightBottom是只读的属性,可以用它们来获取窗体边距,却不能用来指定边距。

    确定窗体位置,只需要窗体左上角这一个点的位置。Left,Top 就是这个点与屏幕左、上边距的距离,换句话说,窗体的Location属性,实际上就是(Left,Top)。 下面的语句是等价的:

    this.Location=new Point(100,100);

    this.Left = 100; this.Top = 100;

    而确定窗体的大小,用Width 宽度和Height高度,就够了。指定当前窗体的大小很简单:

     this.Width = 600;

     this.Height =480;

    窗体是有最小值和最大值的,可以通过设置MaximumSizeMinimumSize来指定。如果没有指定,最大不能超过屏幕分辨率,最小不是(0,0),而是系统自己计算出的能让这几个图标显示出来的大小:   

    有时候涉及到对于窗体大小的动态调整,就应该注意判断,不要越界。那么如果想设置窗体能根据不同屏幕的大小自动调整呢?

     

    三、 根据分辨率调整窗体大小

    首先要获取屏幕大小:

                int width = Screen.PrimaryScreen.WorkingArea.Width;

                int height = Screen.PrimaryScreen.WorkingArea.Width;

    Screen.PrimaryScrenn为获取显示器,如果有多显示器也可以用Screen.AllScreens[0],Screen.AllScreens[1]...WorkingArea为桌面工作区域,不包括任务栏等。

    然后设置宽度和高度:

                this.Width = (int)(width / 2);

                this.Height = (int)(height / 2);

     

    四、窗体最大化、最小化和全屏

    通过设置WindowsState属性为MaximizedManimized来实现窗体的最大化和最小化。如果需要全屏显示,可将窗体大小设置为屏幕大小(见三)。但此时可能需要隐藏上方的图标、标题、最大最小化和关闭按钮。方法为设置FormBorderStyleNone

     

    五、窗体置于顶层

    设置TopMost属性为True即可。

     

    由上述内容可见,基本上都是通过设置窗体的属性来实现,在学习过程中,对各种属性应该有一个基本的了解。.net将很多工作都隐藏在幕后,所以在属性窗口的设置,其实也可以通过代码来实现。如果有不清楚的地方,可以打开对应的Designer.cs文件来查看,更是大大方便了学习。可以看这一段:

               //

              // Form1

                //

                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);

                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

                this.Controls.Add(this.btnOpenNewForm);

                this.Controls.Add(this.btnChangePos);

                this.Controls.Add(this.txttop);

                this.Controls.Add(this.txtWidth);

                this.Controls.Add(this.txtHeight);

                this.Controls.Add(this.txtLeft);

                this.Controls.Add(this.label4);

                this.Controls.Add(this.label3);

                this.Controls.Add(this.label2);

                this.Controls.Add(this.label1);

                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

                this.Name = "Form1";

                //起始居中

                this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;

                //窗体位置和大小

                this.Location = new System.Drawing.Point(100, 100);

                this.ClientSize = new System.Drawing.Size(454, 400);

     

                this.Text = "Form1";

                //窗体置顶

                this.TopMost = true;

                //窗体最大化

                this.WindowState = System.Windows.Forms.FormWindowState.Maximized;

                this.Load += new System.EventHandler(this.Form1_Load);

                this.ResumeLayout(false);

                this.PerformLayout();


    展开全文
  • VS2008 Windows Form项目安装包生成详解

    千次阅读 2016-12-13 19:14:07
    Visual Studio 2008 Windows Form项目的发布对有经验的程序员来说,可能不值一提,但对很多新手来说却不知道如何操作,因为在很多关于Visual Studio的书籍中也没有相关介绍,权威如《C# 2005/8 高级编程》对该内容也...

    Visual Studio 2008 Windows Form项目的发布对有经验的程序员来说,可能不值一提,但对很多新手来说却不知道如何操作,因为在很多关于Visual Studio的书籍中也没有相关介绍,权威如《C# 2005/8 高级编程》对该内容也末涉及。好在网络上不乏热心网友对相关操作经验进行分享,只是在表述上并不详尽,笔者觉得有必要对该操作方法详细说明一番,希望能对有些新手朋友起到一些帮助。有时学习的乐趣不在于我们掌握了何种技术、何种技巧,善于总结、学会分享也是一种不错的体验,在我们遇到问题茫然无助时,都是多么希望能有过来人给我们指引,希望我们也能成为别人学习历程中的一个指路人。

    下面就让我来说一说,如何将我们已经测试好的项目,打包发布成一个商品化软件,可双击安装的应用程序。

    一、新建一个安装项目

    操作步骤:文件->新建->项目,在“新建项目”对话框左边“项目类型”中选择“其它项目类型”下面的“安装和部署”,在对话框右边的“模板”窗口中选择“安装项目”。

    图示如下:




    给该安装项目取一个名称,如:mySetup ,并选择一下项目存储位置,如:E:\,然后单击“确定”,确定后会进入安装项目工作界面。如下图所示:


    二、在“应用程序文件夹”下添加两个文件夹,一个叫image用来存储程序的ICO图标,另一个叫program用来存储自己开发项目的Debug下面编译好的所有文件。选中“program”,点右键添加文件,通过浏览对话框找到自己开发程序的Bin\Debug目录下的文件,将它们都添加进来。







    添加后的界面如下:


    三、向“用户的‘程序’”菜单中添加内容,可先添加一个文件夹,比如取名“教材管理系统”,再将program中的你的程序的可执行文件***.exe选中点右键,选择“创建***.exe”快捷方式,如下图:




    给创建好的快捷方式重新命名,如“教材管理系统Ver1.0 ”,然后将其剪切到“用户的‘程序’菜单”,重复上述操作,在“用户桌面”下添加同样的快捷方式。这样在安装之后,在开始菜单“程序”与用户的桌面上就会有相应程序的菜单项及图标了。




    四、给“用户的‘程序’菜单”中添加卸载该软件命令项,首先,要在program文件夹下添加Windows自带的卸载程序文件“msiexec.exe”,其路径为“C:\WINDOWS\system32”,然后将其重新命名,改成“uninstall.exe”,如下图所示:




    给其创建一个快捷方式,给快捷方式重新命名,如“卸载教材管理系统”,再将其剪切到用户的“程序”菜单下面的“教材管理系统”文件夹中,如下图所示:


    接着要设定该卸载快捷方式的Arguments属性,如下图所示:


    命令行参数要填上要卸载程序的产品代码,代码在项目mySetup属性下的ProductCode对应的值,将其复制一下,如下图:


    然后copy到卸载快捷方式的Arguments参数值上,并在前面加上“/x ”,如下图所示:


    五、给应用程序添加图标 将自己喜欢的图标小文件添加到Image文件夹下,然后选中用户的“程序”菜单下面的快捷方式,在属性窗口中的 Icon中为其快捷方式添加图标。

    六、添加相关的系统必备项,确保在安装时不缺少相关的文件  选中mySetup项目,点右键属性,在出现的属性页对话框中有“系统必备”按钮,如下图所示:


    在出现的对话框中选择相关的必备项,如下图所示:


    七、生成项目


    生成成功后,在项目的Bin\Debug目录下就会找到生成好的两个安装文件,如下图所示:


    双击setup就可以安装了,安装好后,在开始菜单中就会找到相应的菜单命令,如下图所示:


    同样,在用户的桌面上也会有一个可执行的快捷方式图标。

    到此,一个完整的vs2008程序的发布打包过程就讲解完了,希望能对你的学习有些帮助。

    展开全文
  • Go实战--使用golang开发Windows Gui桌面程序(lxn/walk)

    万次阅读 多人点赞 2017-09-12 20:23:57
    golang官方并没有提供Windows gui库,但是今天还是要跟大家分享一下使用golang开发Windows桌面程序,当然又是面向github编程了。知乎上有一个问答: golang为什么没有官方的gui包?这里,主要使用第三方库lxn/walk...

    生命不止,继续 go go go!!!

    golang官方并没有提供Windows gui库,但是今天还是要跟大家分享一下使用golang开发Windows桌面程序,当然又是面向github编程了。

    知乎上有一个问答:
    golang为什么没有官方的gui包?

    这里,主要使用第三方库lxn/walk,进行Windows GUI编程。

    lxn/walk

    github地址:
    https://github.com/lxn/walk

    star:
    2018

    描述:
    A Windows GUI toolkit for the Go Programming Language

    获取:

    go get github.com/lxn/walk

    例子:

    main.go

    package main
    
    import (
        "github.com/lxn/walk"
        . "github.com/lxn/walk/declarative"
        "strings"
    )
    
    func main() {
        var inTE, outTE *walk.TextEdit
    
        MainWindow{
            Title:   "SCREAMO",
            MinSize: Size{600, 400},
            Layout:  VBox{},
            Children: []Widget{
                HSplitter{
                    Children: []Widget{
                        TextEdit{AssignTo: &inTE},
                        TextEdit{AssignTo: &outTE, ReadOnly: true},
                    },
                },
                PushButton{
                    Text: "SCREAM",
                    OnClicked: func() {
                        outTE.SetText(strings.ToUpper(inTE.Text()))
                    },
                },
            },
        }.Run()
    }

    go build生成go_windows_gui.exe。

    go_windows_gui.exe.manifest

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
            <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
            <dependency>
                <dependentAssembly>
                    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
                </dependentAssembly>
            </dependency>
        </assembly>

    运行结果:
    这里写图片描述

    什么是manifest

    上面提到了manifest,这是干什么的呢?

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa375365(v=vs.85).aspx

    介绍:
    Manifests are XML files that accompany and describe side-by-side assemblies or isolated applications. Manifests uniquely identify the assembly through the assembly’s assemblyIdentity element. They contain information used for binding and activation, such as COM classes, interfaces, and type libraries, that has traditionally been stored in the registry. Manifests also specify the files that make up the assembly and may include Windows classes if the assembly author wants them to be versioned. Side-by-side assemblies are not registered on the system, but are available to applications and other assemblies on the system that specify dependencies in manifest files.

    是一种xml文件,标明所依赖的side-by-side组建。

    如果用VS开发,可以Set通过porperty->configuration properties->linker->manifest file->Generate manifest To Yes来自动创建manifest来指定系统的和CRT的assembly版本。

    详解
    观察上面的manifest文件:

    <xml>这是xml声明:

    版本号----<?xml version="1.0"?>。
    这是必选项。 尽管以后的 XML 版本可能会更改该数字,但是 1.0 是当前的版本。
    
    编码声明------<?xml version="1.0" encoding="UTF-8"?>
    这是可选项。 如果使用编码声明,必须紧接在 XML 声明的版本信息之后,并且必须包含代表现有字符编码的值。
    
    standalone表示该xml是不是独立的,如果是yes,则表示这个XML文档时独立的,不能引用外部的DTD规范文件;如果是no,则该XML文档不是独立的,表示可以用外部的DTD规范文档。

    <dependency>这一部分指明了其依赖于一个库:

    <assemblyIdentity>属性里面还分别是:
    type----系统类型,
    version----版本号,
    processorArchitecture----平台环境,
    publicKeyToken----公匙

    应用

    做一个巨丑无比的登录框

    这里用到了LineEdit、LineEdit控件

    package main
    
    import (
        "github.com/lxn/walk"
        . "github.com/lxn/walk/declarative"
    )
    
    func main() {
        var usernameTE, passwordTE *walk.LineEdit
        MainWindow{
            Title:   "登录",
            MinSize: Size{270, 290},
            Layout:  VBox{},
            Children: []Widget{
                Composite{
                    Layout: Grid{Columns: 2, Spacing: 10},
                    Children: []Widget{
                        VSplitter{
                            Children: []Widget{
                                Label{
                                    Text: "用户名",
                                },
                            },
                        },
                        VSplitter{
                            Children: []Widget{
                                LineEdit{
                                    MinSize:  Size{160, 0},
                                    AssignTo: &usernameTE,
                                },
                            },
                        },
                        VSplitter{
                            Children: []Widget{
                                Label{MaxSize: Size{160, 40},
                                    Text: "密码",
                                },
                            },
                        },
                        VSplitter{
                            Children: []Widget{
                                LineEdit{
                                    MinSize:  Size{160, 0},
                                    AssignTo: &passwordTE,
                                },
                            },
                        },
                    },
                },
    
                PushButton{
                    Text:    "登录",
                    MinSize: Size{120, 50},
                    OnClicked: func() {
                        if usernameTE.Text() == "" {
                            var tmp walk.Form
                            walk.MsgBox(tmp, "用户名为空", "", walk.MsgBoxIconInformation)
                            return
                        }
                        if passwordTE.Text() == "" {
                            var tmp walk.Form
                            walk.MsgBox(tmp, "密码为空", "", walk.MsgBoxIconInformation)
                            return
                        }
                    },
                },
            },
        }.Run()
    }
    

    效果:
    这里写图片描述

    TableView的使用

    这里主要使用的是TableView控件,代码参考github:

    package main
    
    import (
        "fmt"
        "sort"
    
        "github.com/lxn/walk"
        . "github.com/lxn/walk/declarative"
    )
    
    type Condom struct {
        Index   int
        Name    string
        Price   int
        checked bool
    }
    
    type CondomModel struct {
        walk.TableModelBase
        walk.SorterBase
        sortColumn int
        sortOrder  walk.SortOrder
        items      []*Condom
    }
    
    func (m *CondomModel) RowCount() int {
        return len(m.items)
    }
    
    func (m *CondomModel) Value(row, col int) interface{} {
        item := m.items[row]
    
        switch col {
        case 0:
            return item.Index
        case 1:
            return item.Name
        case 2:
            return item.Price
        }
        panic("unexpected col")
    }
    
    func (m *CondomModel) Checked(row int) bool {
        return m.items[row].checked
    }
    
    func (m *CondomModel) SetChecked(row int, checked bool) error {
        m.items[row].checked = checked
        return nil
    }
    
    func (m *CondomModel) Sort(col int, order walk.SortOrder) error {
        m.sortColumn, m.sortOrder = col, order
    
        sort.Stable(m)
    
        return m.SorterBase.Sort(col, order)
    }
    
    func (m *CondomModel) Len() int {
        return len(m.items)
    }
    
    func (m *CondomModel) Less(i, j int) bool {
        a, b := m.items[i], m.items[j]
    
        c := func(ls bool) bool {
            if m.sortOrder == walk.SortAscending {
                return ls
            }
    
            return !ls
        }
    
        switch m.sortColumn {
        case 0:
            return c(a.Index < b.Index)
        case 1:
            return c(a.Name < b.Name)
        case 2:
            return c(a.Price < b.Price)
        }
    
        panic("unreachable")
    }
    
    func (m *CondomModel) Swap(i, j int) {
        m.items[i], m.items[j] = m.items[j], m.items[i]
    }
    
    func NewCondomModel() *CondomModel {
        m := new(CondomModel)
        m.items = make([]*Condom, 3)
    
        m.items[0] = &Condom{
            Index: 0,
            Name:  "杜蕾斯",
            Price: 20,
        }
    
        m.items[1] = &Condom{
            Index: 1,
            Name:  "杰士邦",
            Price: 18,
        }
    
        m.items[2] = &Condom{
            Index: 2,
            Name:  "冈本",
            Price: 19,
        }
    
        return m
    }
    
    type CondomMainWindow struct {
        *walk.MainWindow
        model *CondomModel
        tv    *walk.TableView
    }
    
    func main() {
        mw := &CondomMainWindow{model: NewCondomModel()}
    
        MainWindow{
            AssignTo: &mw.MainWindow,
            Title:    "Condom展示",
            Size:     Size{800, 600},
            Layout:   VBox{},
            Children: []Widget{
                Composite{
                    Layout: HBox{MarginsZero: true},
                    Children: []Widget{
                        HSpacer{},
                        PushButton{
                            Text: "Add",
                            OnClicked: func() {
                                mw.model.items = append(mw.model.items, &Condom{
                                    Index: mw.model.Len() + 1,
                                    Name:  "第六感",
                                    Price: mw.model.Len() * 5,
                                })
                                mw.model.PublishRowsReset()
                                mw.tv.SetSelectedIndexes([]int{})
                            },
                        },
                        PushButton{
                            Text: "Delete",
                            OnClicked: func() {
                                items := []*Condom{}
                                remove := mw.tv.SelectedIndexes()
                                for i, x := range mw.model.items {
                                    remove_ok := false
                                    for _, j := range remove {
                                        if i == j {
                                            remove_ok = true
                                        }
                                    }
                                    if !remove_ok {
                                        items = append(items, x)
                                    }
                                }
                                mw.model.items = items
                                mw.model.PublishRowsReset()
                                mw.tv.SetSelectedIndexes([]int{})
                            },
                        },
                        PushButton{
                            Text: "ExecChecked",
                            OnClicked: func() {
                                for _, x := range mw.model.items {
                                    if x.checked {
                                        fmt.Printf("checked: %v\n", x)
                                    }
                                }
                                fmt.Println()
                            },
                        },
                        PushButton{
                            Text: "AddPriceChecked",
                            OnClicked: func() {
                                for i, x := range mw.model.items {
                                    if x.checked {
                                        x.Price++
                                        mw.model.PublishRowChanged(i)
                                    }
                                }
                            },
                        },
                    },
                },
                Composite{
                    Layout: VBox{},
                    ContextMenuItems: []MenuItem{
                        Action{
                            Text:        "I&nfo",
                            OnTriggered: mw.tv_ItemActivated,
                        },
                        Action{
                            Text: "E&xit",
                            OnTriggered: func() {
                                mw.Close()
                            },
                        },
                    },
                    Children: []Widget{
                        TableView{
                            AssignTo:         &mw.tv,
                            CheckBoxes:       true,
                            ColumnsOrderable: true,
                            MultiSelection:   true,
                            Columns: []TableViewColumn{
                                {Title: "编号"},
                                {Title: "名称"},
                                {Title: "价格"},
                            },
                            Model: mw.model,
                            OnCurrentIndexChanged: func() {
                                i := mw.tv.CurrentIndex()
                                if 0 <= i {
                                    fmt.Printf("OnCurrentIndexChanged: %v\n", mw.model.items[i].Name)
                                }
                            },
                            OnItemActivated: mw.tv_ItemActivated,
                        },
                    },
                },
            },
        }.Run()
    }
    
    func (mw *CondomMainWindow) tv_ItemActivated() {
        msg := ``
        for _, i := range mw.tv.SelectedIndexes() {
            msg = msg + "\n" + mw.model.items[i].Name
        }
        walk.MsgBox(mw, "title", msg, walk.MsgBoxIconInformation)
    }
    

    效果:
    这里写图片描述

    文件选择器(加入了icon)

    这里就是调用Windows的文件选择框
    主要是使用:FileDialog

    package main
    
    import (
        "github.com/lxn/walk"
        . "github.com/lxn/walk/declarative"
    )
    
    import (
        "fmt"
        "os"
    )
    
    type MyMainWindow struct {
        *walk.MainWindow
        edit *walk.TextEdit
    
        path string
    }
    
    func main() {
        mw := &MyMainWindow{}
        MW := MainWindow{
            AssignTo: &mw.MainWindow,
            Icon:     "test.ico",
            Title:    "文件选择对话框",
            MinSize:  Size{150, 200},
            Size:     Size{300, 400},
            Layout:   VBox{},
            Children: []Widget{
                TextEdit{
                    AssignTo: &mw.edit,
                },
                PushButton{
                    Text:      "打开",
                    OnClicked: mw.pbClicked,
                },
            },
        }
        if _, err := MW.Run(); err != nil {
            fmt.Fprintln(os.Stderr, err)
            os.Exit(1)
        }
    
    }
    
    func (mw *MyMainWindow) pbClicked() {
    
        dlg := new(walk.FileDialog)
        dlg.FilePath = mw.path
        dlg.Title = "Select File"
        dlg.Filter = "Exe files (*.exe)|*.exe|All files (*.*)|*.*"
    
        if ok, err := dlg.ShowOpen(mw); err != nil {
            mw.edit.AppendText("Error : File Open\r\n")
            return
        } else if !ok {
            mw.edit.AppendText("Cancel\r\n")
            return
        }
        mw.path = dlg.FilePath
        s := fmt.Sprintf("Select : %s\r\n", mw.path)
        mw.edit.AppendText(s)
    }
    

    效果:
    这里写图片描述

    文本检索器

    package main
    
    import (
        "fmt"
        "log"
        "strings"
    
        "github.com/lxn/walk"
        . "github.com/lxn/walk/declarative"
    )
    
    func main() {
        mw := &MyMainWindow{}
    
        if _, err := (MainWindow{
            AssignTo: &mw.MainWindow,
            Title:    "SearchBox",
            Icon:     "test.ico",
            MinSize:  Size{300, 400},
            Layout:   VBox{},
            Children: []Widget{
                GroupBox{
                    Layout: HBox{},
                    Children: []Widget{
                        LineEdit{
                            AssignTo: &mw.searchBox,
                        },
                        PushButton{
                            Text:      "检索",
                            OnClicked: mw.clicked,
                        },
                    },
                },
                TextEdit{
                    AssignTo: &mw.textArea,
                },
                ListBox{
                    AssignTo: &mw.results,
                    Row:      5,
                },
            },
        }.Run()); err != nil {
            log.Fatal(err)
        }
    
    }
    
    type MyMainWindow struct {
        *walk.MainWindow
        searchBox *walk.LineEdit
        textArea  *walk.TextEdit
        results   *walk.ListBox
    }
    
    func (mw *MyMainWindow) clicked() {
        word := mw.searchBox.Text()
        text := mw.textArea.Text()
        model := []string{}
        for _, i := range search(text, word) {
            model = append(model, fmt.Sprintf("%d检索成功", i))
        }
        log.Print(model)
        mw.results.SetModel(model)
    }
    
    func search(text, word string) (result []int) {
        result = []int{}
        i := 0
        for j, _ := range text {
            if strings.HasPrefix(text[j:], word) {
                log.Print(i)
                result = append(result, i)
            }
            i += 1
        }
        return
    }
    

    效果:
    这里写图片描述

    邮件群发器

    别人写的邮件群发器,出自:
    https://studygolang.com/articles/2078
    关于golang中stmp的使用,请看博客:
    Go实战–通过net/smtp发送邮件(The way to go)

    package main
    
    import (
        "bufio"
        "encoding/gob"
        "errors"
        "fmt"
        "io"
        "net/smtp"
        "os"
        "strconv"
        "strings"
        "time"
    )
    
    import (
        "github.com/lxn/walk"
        . "github.com/lxn/walk/declarative"
    )
    
    type ShuJu struct {
        Name    string
        Pwd     string
        Host    string
        Subject string
        Body    string
        Send    string
    }
    
    func SendMail(user, password, host, to, subject, body, mailtype string) error {
        fmt.Println("Send to " + to)
        hp := strings.Split(host, ":")
        auth := smtp.PlainAuth("", user, password, hp[0])
        var content_type string
        if mailtype == "html" {
            content_type = "Content-Type: text/html;charset=UTF-8"
        } else {
            content_type = "Content-Type: text/plain;charset=UTF-8"
        }
        body = strings.TrimSpace(body)
        msg := []byte("To: " + to + "\r\nFrom: " + user + "<" + user + ">\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body)
        send_to := strings.Split(to, ";")
        err := smtp.SendMail(host, auth, user, send_to, msg)
        if err != nil {
            fmt.Println(err.Error())
        }
        return err
    }
    
    func readLine2Array(filename string) ([]string, error) {
        result := make([]string, 0)
        file, err := os.Open(filename)
        if err != nil {
            return result, errors.New("Open file failed.")
        }
        defer file.Close()
        bf := bufio.NewReader(file)
        for {
            line, isPrefix, err1 := bf.ReadLine()
            if err1 != nil {
                if err1 != io.EOF {
                    return result, errors.New("ReadLine no finish")
                }
                break
            }
            if isPrefix {
                return result, errors.New("Line is too long")
            }
            str := string(line)
            result = append(result, str)
        }
        return result, nil
    }
    
    func DelArrayVar(arr []string, str string) []string {
        str = strings.TrimSpace(str)
        for i, v := range arr {
            v = strings.TrimSpace(v)
            if v == str {
                if i == len(arr) {
                    return arr[0 : i-1]
                }
                if i == 0 {
                    return arr[1:len(arr)]
                }
                a1 := arr[0:i]
                a2 := arr[i+1 : len(arr)]
                return append(a1, a2...)
            }
        }
        return arr
    }
    
    func LoadData() {
        fmt.Println("LoadData")
        file, err := os.Open("data.dat")
        defer file.Close()
        if err != nil {
            fmt.Println(err.Error())
            SJ.Name = "用户名"
            SJ.Pwd = "用户密码"
            SJ.Host = "SMTP服务器:端口"
            SJ.Subject = "邮件主题"
            SJ.Body = "邮件内容"
            SJ.Send = "要发送的邮箱,每行一个"
            return
        }
        dec := gob.NewDecoder(file)
        err2 := dec.Decode(&SJ)
        if err2 != nil {
            fmt.Println(err2.Error())
            SJ.Name = "用户名"
            SJ.Pwd = "用户密码"
            SJ.Host = "SMTP服务器:端口"
            SJ.Subject = "邮件主题"
            SJ.Body = "邮件内容"
            SJ.Send = "要发送的邮箱,每行一个"
        }
    }
    
    func SaveData() {
        fmt.Println("SaveData")
        file, err := os.Create("data.dat")
        defer file.Close()
        if err != nil {
            fmt.Println(err)
        }
        enc := gob.NewEncoder(file)
        err2 := enc.Encode(SJ)
        if err2 != nil {
            fmt.Println(err2)
        }
    }
    
    var SJ ShuJu
    var runing bool
    var chEnd chan bool
    
    func main() {
        LoadData()
        chEnd = make(chan bool)
        var emails, body, msgbox *walk.TextEdit
        var user, password, host, subject *walk.LineEdit
        var startBtn *walk.PushButton
        MainWindow{
            Title:   "邮件发送器",
            MinSize: Size{800, 600},
            Layout:  HBox{},
            Children: []Widget{
                TextEdit{AssignTo: &emails, Text: SJ.Send, ToolTipText: "待发送邮件列表,每行一个"},
                VSplitter{
                    Children: []Widget{
                        LineEdit{AssignTo: &user, Text: SJ.Name, CueBanner: "请输入邮箱用户名"},
                        LineEdit{AssignTo: &password, Text: SJ.Pwd, PasswordMode: true, CueBanner: "请输入邮箱登录密码"},
                        LineEdit{AssignTo: &host, Text: SJ.Host, CueBanner: "SMTP服务器:端口"},
                        LineEdit{AssignTo: &subject, Text: SJ.Subject, CueBanner: "请输入邮件主题……"},
                        TextEdit{AssignTo: &body, Text: SJ.Body, ToolTipText: "请输入邮件内容", ColumnSpan: 2},
                        TextEdit{AssignTo: &msgbox, ReadOnly: true},
                        PushButton{
                            AssignTo: &startBtn,
                            Text:     "开始群发",
                            OnClicked: func() {
                                SJ.Name = user.Text()
                                SJ.Pwd = password.Text()
                                SJ.Host = host.Text()
                                SJ.Subject = subject.Text()
                                SJ.Body = body.Text()
                                SJ.Send = emails.Text()
                                SaveData()
    
                                if runing == false {
                                    runing = true
                                    startBtn.SetText("停止发送")
                                    go sendThread(msgbox, emails)
                                } else {
                                    runing = false
                                    startBtn.SetText("开始群发")
                                }
                            },
                        },
                    },
                },
            },
        }.Run()
    }
    
    func sendThread(msgbox, es *walk.TextEdit) {
        sendTo := strings.Split(SJ.Send, "\r\n")
        susscess := 0
        count := len(sendTo)
        for index, to := range sendTo {
            if runing == false {
                break
            }
            msgbox.SetText("发送到" + to + "..." + strconv.Itoa((index/count)*100) + "%")
            err := SendMail(SJ.Name, SJ.Pwd, SJ.Host, to, SJ.Subject, SJ.Body, "html")
            if err != nil {
                msgbox.AppendText("\r\n失败:" + err.Error() + "\r\n")
                if err.Error() == "550 Mailbox not found or access denied" {
                    SJ.Send = strings.Join(DelArrayVar(strings.Split(SJ.Send, "\r\n"), to), "\r\n")
                    es.SetText(SJ.Send)
                }
                time.Sleep(1 * time.Second)
                continue
            } else {
                susscess++
                msgbox.AppendText("\r\n发送成功!")
                SJ.Send = strings.Join(DelArrayVar(strings.Split(SJ.Send, "\r\n"), to), "\r\n")
                es.SetText(SJ.Send)
            }
            time.Sleep(1 * time.Second)
        }
        SaveData()
        msgbox.AppendText("停止发送!成功 " + strconv.Itoa(susscess) + " 条\r\n")
    }
    

    效果:
    这里写图片描述


    这里写图片描述

    展开全文
  • 源码不是我写的,但是我在基础上修改了一些...jQuery制作Web桌面系统界面类似WebQQ桌面布局 js有些修改。 左边是图标,双击可弹出弹框,弹框之间可进行切换,弹框可缩小放大,右下角的小图标内容是缩略图。
  • Vs2012 windowsForm程序打包

    千次阅读 2014-04-23 09:12:16
     在继续往下操作前一定要选择发布,在启动项目的属性内设置发布文件夹默认路径设置为安装系统的文件夹。    3、设置程序安装信息        Application Information主要设置程序在安装时显示的有关...
  • 1、在windows form程序中实现玻璃效果 这里要用到微软提供的Windows 7 API Code Pack 注:使用此API可以实现很多windows 7的特效(如:jumplist,areo,任务栏图标显示任务进度,等等。。。)
  • Visual Studio 2008 Windows Form项目的发布对有经验的程序员来说,可能不值一提,但对很多新手来说却不知道如何操作,因为在很多关于Visual Studio的书籍中也没有相关介绍,权威如《C# 2005/8 高级编程》对该内容也...
  • 本文将介绍如何创建一个操作系统层面的服务程序,并同步介绍如何通过系统服务自动监控桌面程序进程,如何杀掉进程,如何启动进程。本文穿越了WIN7以后操作系统session隔离的新特性,有效解决了旧版本下好用的调用...
  • 自己用C#编写了一个学生信息管理系统Windows桌面应用程序,第一次实践,某些地方可能还不够完善,但其中有些函数、方法等的使用可以参考。 工具 我用的集成开发环境是Visual Studio 2019,数据库是MySQL,可视化...
  • Visual Studio 2008 Windows Form项目的发布对有经验的程序员来说,可能不值一提,但对很多新手来说却不知道如何操作,因为在很多关于Visual Studio的书籍中也没有相关介绍,权威如《C# 2005/8 高级编程》对该内容也
  • Google Talk styled Windows Form(翻译)

    千次阅读 2006-05-09 23:45:00
    System.Windows.Forms.Form 控件(系统控件),以便提供 Google Talk 窗口表单的样式和风格。 The class properties IsWindowSnappable , IsResizable , ResizableColor , TitleColor , TitleFont , ...
  • Win10中可以点击任务视图按钮,在最上面就可以创建,(虚拟桌面在Linux操作系统是一个标配,但是在Windows操作系统一直没有此功能,直到Win10才加入这项功能)。 笔记本的话四个手指左右滑动触摸板就可以切换,...
  • Windows 10的虚拟桌面

    2019-12-27 14:56:06
    Windows 10发布后,Windows系统外壳终于内置了虚拟桌面功能。虽然该功能有些跟随Mac多重桌面的嫌疑,但它的确极大方便了桌面组织。 首先,本文将介绍一些使用虚拟桌面的快捷键。然后,讨论使用...
  • 在 WinForm 中调用 Windows 远程桌面

    千次阅读 2012-07-15 13:35:49
    原文链接:CodeProject - Remote Desktop using C#.NET Download demo project - 138.95 KB ...Remote Desktop Services is one of Microsoft Windows components to access a remote computer throug
  • Go实战--使用golang开发Windows Gui桌面程序 lxn/walk
  • golang开发Windows Gui桌面程序(lxn/walk)

    千次阅读 2018-12-12 12:36:00
    版权声明:本文为博主原创文章,未经博主允许不得转载。...golang官方并没有提供Windows gui库,但是今天还是要跟大家分享一下使用golang开发Windows桌面程序,当然又是面向github编程了。 知乎上有一...
  • C#桌面办公应用-工资管理系统系列九 今天介绍介绍一下我自主开发的工资管理系统中的“汇总查询打印”模块,改小模块具有以下的功能:可以汇总统计员工的工资发放明细信息,可以查询指定的某个部门下的某些员工的...
  • 使用Xmanager远程桌面LINUX系统

    万次阅读 2014-11-10 13:36:11
    原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任。 深蓝的blog:   实验环境 实验平台 WIN7 旗舰版 64bit ...虚拟操作系统 ...远程桌面软件
  • Windows XP 桌面图标玩贪吃蛇(视频地址为 http://v.youku.com/v_show/id_XMTIyODk2Njky.html ),一些朋友在评论中猜测程序原理:有人说是用批处理,还有人说是用汇编,甚至有人直接否定说是我用静态帧拼接起来的...
  • 默认情况下,Windows服务基于安全考虑,是不允许任何服务程序和桌面进行交互的,也就是说,使用任何的Windows Form 的很多特性将会莫名奇妙的不起作用,如进行屏幕截图,或者使用System.Windows.Form.Timer对象也...
  • 本文主要是讲解如果理由VNC实现Windows远程访问Ubuntu 16.04(因为本文已经有点年头了,之前以16.04版本为例讲解,最新版18.04笔主也测试过是没有问题的),其实网上有很多类似教程,但是很多需要安装第三方桌面(xfce...
  • C# 实现真正的透明控件(Windows桌面程序)

    万次阅读 热门讨论 2017-02-07 14:41:56
    因为Form有TransparencyKey属性,很容易实现真正的透明,就想干脆继承Form来做控件,使用的时候,直接SetParent岂不美好,先不说资源耗费,用户体验.单单位置控制都够呛,其消息队列性质的不同,带来的问题,完全不可取,而且...
  • windows系统cmd命令

    千次阅读 2015-12-23 17:52:39
    Windows系统CMD运行命令大全2009-10-14 23:29Windows系统:开始--运行--命令大全  Nslookup-------IP地址侦测器 explorer-------打开资源管理器  logoff---------注销命令 tsshutdn-------60秒倒计时关机命令  ...
  • Windows系统下CMD命令

    千次阅读 2019-02-20 10:20:06
     虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全、稳定,有的用户还在使用,所以一般Windows 的各种版本都与其兼容,用户可以在Windows 系统下运行DOS...
  • VNC Viewer 连接远程电脑桌面 UI自动化测试的示例代码 #!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @Author: 思文伟 @Date: 2021/03/30 15:49:32 ''' import io import os import sys from appium ...
  • C#可以从Windows注册表读取得到用户的特殊文件夹(桌面、收藏夹等等)的位置。 代码如下: using Microsoft.Win32; namespace JPGCompact { public partial class MainForm : Form ...
  • 获取用户桌面等特殊系统路径

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,411
精华内容 5,764
关键字:

windowsform桌面系统