精华内容
下载资源
问答
  • 解决方法也试了很多但是都不是很满意,由于C#WINFROM窗体没有SETPARENT方法,所以很多东西都需要自己去编写,下面就贴一个至少让我感觉非常不错方法吧。 解决办法 user32.dll 首先来介绍一下什么是...

    问题

    • 这几天在优化程序的时候发现了一个问题,就是在MDI窗体中的子窗体被激活显示出来之后,总是被主窗体中的控件遮挡(各种控件)。解决的方法也试了很多但是都不是很满意,由于C#的WINFROM窗体没有SETPARENT的方法,所以很多东西都需要自己去编写,下面就贴一个至少让我感觉非常不错的方法吧。

    解决办法

    user32.dll

    • user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息。

    System.Runtime.InteropServices

    • System.Runtime.InteropServices 命名空间提供各种各样支持 COM interop 及平台调用服务的成员,此命名空间提供了多种类别的功能。

    • 简单的来说,就是提供在窗体运行时的各种服务。

    代码

    • 了解了上面两种工具的大致意思,剩下的就是怎么解决问题了。代码如下:
    using System.Runtime.InteropServices;  '调用命名空间'
    
    [DllImport("user32")];  '引用DLL'
    
    public static extern int SetParent(int children,int parent);        '''编写函数过程'''
    
    '调用过程'
    '这里默认MDI窗体为This'
    form1 fm=new form1();
    fm.MdiParent=this;
    fm.show();
    SetParent((int)fm.Handle,(int)this.Handle);

    总结

    • 其实还有一些其他的方法可以实现类似的效果,什么两个窗体合成啊、使用PANEL控件啊、设置控件图层啊之类的,但是在这种情况下都不能真正的实现这样的效果,不过方法还是要灵活运用的,不能学死。希望上面的方法对你在C#中的窗体制作有用。
    展开全文
  • 通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它。那么,如何解决跨线程调用...

    通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它。那么,如何解决跨线程调用Windows窗体控件呢?可以用线程委托实现跨线程调用Windows窗体控件。下面将上一个例子进行一下改动。代码如下:

    using System;
    
    using System.Collections.Generic;
    
    using System.ComponentModel;
    
    using System.Data;
    
    using System.Drawing;
    
    using System.Linq;
    
    using System.Text;
    
    using System.Windows.Forms;
    
     
    
    using System.Threading;//添加线程的命名空间
    
     
    
    namespace ppp
    
    {
    
        public partial class Form1 : Form
    
        {
    
            public Form1()
    
            {
    
                InitializeComponent();
    
            }
    
     
    
            Thread t; //定义线程变量
    
     
    
            private void button1_Click(object sender, EventArgs e)
    
            {
    
                t = new Thread(new ThreadStart(Threadp)); //实例化线程
    
                t.Start();//启动线程
    
            }
    
     
    
            private delegate void setText();//定义一个线程委托
    
    自定义方法Threadp,主要用于线程的调用。代码如下:
    
            public void Threadp()
    
            {
    
                setText d = new setText(Threading); //实例化一个委托
    
                this.Invoke(d); //在拥用此控件的基础窗体句柄的线程上执行指定的委托
    
            }
    
    自定义方法Threading,主要作于委托的调用。代码如下:
    
            public void Threading()
    
            {
    
                textBox1.Text = "实现在子线程中操作主线程中的控件";
    
                t.Abort();//关闭线程
    
            }
    
        }
    
    }

     

    转载于:https://www.cnblogs.com/test404/p/7420601.html

    展开全文
  • 在C#中,直接在子线程中对窗体的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同空间,因此想要在子线程来操作窗体的控件,是不可能简单通过控件对象名来操作,但不是说不能进行操作,微软提供...

    在C#中,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。

    要实现该功能,有两种方法可以选择:

     

    1、在程序初始化的时候对要操作的控件设置下面的属性:

    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls  =  false;

    这样,系统就不会再抛出上面所说的这个错误了。

    从实质上说,该方法是通过采用取消线程安全保护模式的方式实现的,所以不建议采用。

     

    2、基本思路如下:

    把想对另一线程中的控件实施的操作放到一个函数中,然后使用delegate代理那个函数,并且在那个函数中加入一个判断,用InvokeRequired 来判断调用这个函数的线程是否和控件线程处于同一线程中,如果是则直接执行对控件的操作,否则利用该控件的Invoke或BeginInvoke方法来执行这个代理。示例代码如下:

    复制代码
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Windows.Forms;
      4 
      5 using System.Threading;
      6 
      7 namespace 子线程操作主线程窗体上的控件
      8 {
      9     public partial class frmMain : Form
     10     {
     11         /***************************************************** 定义该类的私有成员 ****************************************************/
     12         
     13         /// <summary>
     14         /// 定义一个队列,用于记录用户创建的线程
     15         /// 以便在窗体关闭的时候关闭所有用于创建的线程
     16         /// </summary>
     17         private List<Thread> ChaosThreadList;
     18 
     19         /***************************************************** 该类的初始化相关函数 ****************************************************/
     20                 
     21         /// <summary>
     22         /// 窗体的初始化函数,初始化线程队列ChaosThreadList
     23         /// </summary>
     24         public frmMain()
     25         {
     26             InitializeComponent();
     27             ChaosThreadList = new List<Thread>();
     28         }
     29                
     30         /// <summary>
     31         /// 窗体的关闭事件处理函数,在该事件中将之前创建的线程全部终止
     32         /// </summary>
     33         /// <param name="sender"></param>
     34         /// <param name="e"></param>
     35         private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
     36         {
     37             if (ChaosThreadList.Count > 0)
     38             {
     39                 //编列自定义队列,将所有线程终止
     40                 foreach (Thread tWorkingThread in ChaosThreadList)
     41                 {
     42                     tWorkingThread.Abort();
     43                 }
     44             }
     45         }        
     46 
     47         /***************************************************** 定义该类的自定义函数 ****************************************************/
     48 
     49         /// <summary>
     50         /// 定义一个代理
     51         /// </summary>
     52         /// <param name="index"></param>
     53         /// <param name="MSG"></param>
     54         private delegate void DispMSGDelegate(int index,string MSG);
     55 
     56         /// <summary>
     57         /// 定义一个函数,用于向窗体上的ListView控件添加内容
     58         /// </summary>
     59         /// <param name="iIndex"></param>
     60         /// <param name="strMsg"></param>
     61         private void DispMsg(int iIndex,string strMsg)
     62         {
     63             if (this.lstMain.InvokeRequired==false)                      //如果调用该函数的线程和控件lstMain位于同一个线程内
     64             {
     65                 //直接将内容添加到窗体的控件上
     66                 ListViewItem lvi = new ListViewItem();
     67                 lvi.SubItems[0].Text = iIndex.ToString();
     68                 lvi.SubItems.Add(strMsg);
     69                 this.lstMain.Items.Insert(0, lvi);
     70             }
     71             else                                                        //如果调用该函数的线程和控件lstMain不在同一个线程
     72             {
     73                 //通过使用Invoke的方法,让子线程告诉窗体线程来完成相应的控件操作
     74                 DispMSGDelegate DMSGD = new DispMSGDelegate(DispMsg);
     75 
     76                 //使用控件lstMain的Invoke方法执行DMSGD代理(其类型是DispMSGDelegate)
     77                 this.lstMain.Invoke(DMSGD, iIndex, strMsg);
     78                 
     79             }
     80         }
     81 
     82         /// <summary>
     83         /// 定义一个线程函数,用于循环向列表中添加数据
     84         /// </summary>
     85         private void Thread_DisplayMSG()
     86         {
     87             for (int i = 0; i < 10000; i++)
     88             {
     89                 DispMsg(i + 1, "Welcome you : " + (i + 1).ToString());
     90                 Thread.Sleep(10);
     91             }
     92         }
     93 
     94         /***************************************************** 定义该类的事件处理函数 ****************************************************/
     95 
     96         /// <summary>
     97         /// 【开始】按钮的单击事件处理函数,新建一个线程向窗体上的ListView控件填写内容
     98         /// </summary>
     99         /// <param name="sender"></param>
    100         /// <param name="e"></param>
    101         private void btnBegin_Click(object sender, EventArgs e)
    102         {
    103             //创建一个新的线程
    104             Thread tWorkingThread = new Thread(Thread_DisplayMSG);
    105 
    106             //将新建的线程加入到自定义线程队列中,以便在窗体结束时关闭所有的线程
    107             ChaosThreadList.Add(tWorkingThread);
    108 
    109             //开启线程
    110             tWorkingThread.Start();
    111         }     
    112 
    113     }
    114 }
    复制代码

     

     

    这样子就可以实现用子线程去操作主线程窗体上的控件的内容,同时,又不影响主线程对窗体上其他控件的响应。程序运行截图如下:

     

     

     

     点击[开始]按钮,程序开启一个新的线程,不断向列表中添加新的数据,而同时不会影响主界面对其它控件(例如:文本框)的响应。

     

    [P.S]:

    INVOKE方法的作用:

    它使该控件所在的线程执行Invoke方法参数中指定的代理,也就是使主线程执行我们想对控件进行的操作。


    转自:http://www.cnblogs.com/chaosimple/archive/2012/05/11/2495811.html

    展开全文
  • 探索之后找到一个方法,虽然不是明确获得目标窗体的引用以便像this.XXX这样对其控件进行操作,但是也基本达到了相同目的。下面简单show一下这个方法,但本文并非意在推荐这个方法如何如何牛逼,如何如何有用,仅仅...

    网上很多人问如何在当前窗体上获取其他窗体的引用,作为初学者,我也曾搜索很多资料寻求答案。探索之后找到一个方法,虽然不是明确获得目标窗体的引用以便像this.XXX这样对其控件进行操作,但是也基本达到了相同的目的。下面简单show一下这个方法,但本文并非意在推荐这个方法如何如何牛逼,如何如何有用,仅仅是贴出来让大家看看,看看它到底怎么样,好在哪里,差在哪里,所以如果大神们有什么更好的方法,还望不吝赐教哈。

     

    首先,假设有FormA和FormB两个窗体,分别有buttonA和buttonB。

    给ButtonA添加事件以打开FormB

    private void buttonA_Click(object sender, EventArgs e)
    {
         new FormB().Show();
    }


    现在在buttonB上添加事件已改变buttonA的Text

    private void buttonB_Click(object sender, EventArgs e)
    {
         foreach (Form f in Application.OpenForms)//获取当前打开的所有Form并迭代
         {
              if (f is FormA)
              {
                  foreach (Control ctrl in f.Controls)//获取FormA的所有控件并迭代
                  {
                      if (ctrl.Name == "buttonA")
                      {
                          ctrl.Text = "Text Changed";
                       }
                  }
              }
         }
    }


     到目前为止,尚且存在问题是,如果存在不止一个Form是FormA类型,那么如何只对其中一个进行操作呢?

    这个问题很多情况下并没有什么实际价值,毕竟在应用程序里面,同样的Form允许打开多个的情况并不多见。

    以上纯属个人见解,有意见就晒出来哈,别只喷人不拿出真凭实据。

    展开全文
  • c#winform拖拽获取窗体句柄 今天使用SPY++ Findwindow功能的时候,在想这个拖拽获取控件的名字还有句柄是否自己可以实现,然后拿起了...按下鼠标移动鼠标获取当前的鼠标坐标相对于屏幕(看好是屏幕不是窗体),是通...
  • 昨天公司要打单子而不是以前手写为了实现这样功能上网搜索了一下http://blog.csdn.net/fwj380891124/article/details/8071801这篇文章来入门,不过发现无法实现套打功能,把所有信息都打出来了 对代码进行了...
  • C#多个窗体共享同一个SerialPort控件

    千次阅读 2019-08-21 19:51:03
    在使用SerialPort控件时,能够发现虽然可以把它拖拽到窗口上,但它并不会显示在窗体上,而是在窗体的下面,这说明此控件不是一个可视化的控件,类似的控件还有Timer。正是由于SerialPort这种特性,使得我们可以...
  • DevExpress相信不少人用过,虽然人家不是免费,但是用过应该都知道,确实是花了心血C#插件,下面来介绍下在DevExpress下如何统一设置自己WPF程序为经典Windows风格。 窗体设置windows风格: 导入上...
  • C#控件大小随窗体大小等比例变化

    千次阅读 2019-04-03 09:36:08
    相信很多博友在开发初次接触学习C# winForm时,当窗体大小变化时,窗体内的...下面我将建立一个Demo来大概解释下这个方法的实现:(注:我使用的是的VS2010) Step1:打开VS2010,建立一个C#Winform项目(注:这...
  • 1.一种是设置窗体属性,很简单,但是透明后,可以接触到窗口矩形区域下面的地方,比如有一个文件,可以直接双击打开,可以说操作是不透明。把窗口想象成木框+玻璃,这种方法相当于只有木框,没玻璃。当然,控件还...
  • 步骤3:将dotnetbar中的控件添加到vs工具箱中,具体做法是:点击vs上菜单“工具”下“选择工具箱项”,然后“浏览“,选择刚才复制到debug目录下DevComponents.DotNetBar2.dll,确定,这样工具箱下面就新增了...
  • C#控件大全

    热门讨论 2012-10-22 13:54:46
    往在控件之中还有一个控件,例如最典型的就是窗体控件中会包含很多的控件,像标签控件、文本框等。 这时称包含控件的控件为容器控件或父控件,而父控件称为子控件。这时将遇到一个问题,即子控件与父 控件的位置关系...
  • 机房重构——常用控件的总结

    热门讨论 2016-01-25 20:56:31
    1.首先就是窗体的Load事件,和以往一样没有什么好说的,关键在于窗体的close事件,在vb.net中,窗体的关闭不是用的unload,而用的是close()一个关闭函数,而触发的事件也由原来的unload和querity unload变为了...
  • 这一问题并不是因为'当前处于单元格数据输入模式下',因此“窗体”和“控件工具箱”.工具栏上所有按钮都变暗.即使不在输入模式下和网格线未被隐藏情况下,这些控件仍然是灰色,不可用.但是重新打开一个电子...
  • 使用Dotnetbar做出office07风格的窗体

    万次阅读 热门讨论 2010-01-22 15:09:00
    步骤3:将dotnetbar中的控件添加到vs2005工具箱中,具体做法是:点击vs上菜单“工具”下“选择工具箱项”,然后“浏览“,选择刚才复制到debug目录下DevComponents.DotNetBar2.dll,确定,这样工具箱下面就新
  • 窗体特效旋转

    千次阅读 2011-07-01 11:19:00
    由于演示程序里只是添加了普通的C#控件,目前不是很清楚其他的C#控件,或者一些换肤的东西放上去会不会有问题,不过从原理上来说,这个跟C#的窗口是基本无关的,应该不会有问题。 目前放出的是一个API库,C#通过调用...
  • 问题八 MSFlexGrid 控件

    热门讨论 2016-09-04 16:51:05
    操作机房时,和 MSFlexGrid 控件 打了不少交道, 在一些查询窗体及删除和添加用户和学生上机状态查看窗体,我们都用到了 MSFlexGrid 控件,郁闷的是如何删除呢? 一、删除和添加用户  当我添加完用户时,我不想要...
  • 访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。但是有时在程序编写的时候...
  • 前些天遇到一个棘手小问题,居然搞了半天。情况如下:在同一个WinForm界面上,放了3个一样button,然后分别将...原来,他们是按控件窗体的层次属性来排列。就是说,最下面的按钮会占据DOCK最顶端位置,反之,
  • Visual C#动态生成控件

    2009-06-01 23:00:00
    以前在用Delphi写程序时候,总不喜欢在窗体上排放很多组件,这一方面有点不美观,并且在调试程序时候,也不是十分方便。通常在写程序时候,当要用到某些组件,采用方法一般都是动态创建,用完以后就释放掉。...
  • 机房收费系统——添加删除用户窗体

    千次阅读 热门讨论 2013-10-11 19:34:18
     首先,要设置myflexgrid控件的属性,因为我们删除用户时要求选中一整条记录,而不是单个一个,这就要用到下面的代码: myflexgrid.SelectionMode = flexSelectionByRow '单击的时候选择的是整行 myflexgrid....
  • WinForm中日期控件开窗

    千次阅读 2010-10-09 21:15:00
    当然微软给我们提供了强大日期控件,我们可以通过下拉选择来选择相应日期,但是你会发现日期格式不是我们所需要,或者 我们希望得到日期格式,并且呈现出来效果也不是非常美观。在此我给大家...
  • 值得一提的是,Skin++对Label的支持是彻底,并且不像其他的换肤软件需要在窗体上放置一个他们提供的特有的控件。因为在已经成型的软件中, 如果让用户来一个一个替换原有的Label控件,将是非常痛苦的事情。 对...

空空如也

空空如也

1 2 3 4 5 6
收藏数 108
精华内容 43
关键字:

下面不是窗体控件的是