精华内容
下载资源
问答
  • 透明窗体上显示标准Winform控件

    千次阅读 2011-03-21 19:21:00
    透明窗体指的是利用UpdateLayeredWindows函数完成窗体绘制过程的特殊窗体,采用这种技术的... Winform绘图过程简要分析控件在两种情况下需要调用绘制过程,一:遮挡物移开了;二:自身的视觉相关属性发生变化。这两个

    透明窗体指的是利用UpdateLayeredWindows函数完成窗体绘制过程的特殊窗体,采用这种技术的最大优势在于支持含Alpha通道的PNG格式图片作为背景图,从而得到非常漂亮的异型窗体。可惜的是这种窗体与Winform体系的本质冲突导致其不能与标准Winform控件共同工作。

    Google到的解决方案多是使用双窗体来解决,不过本着技术研究的精神,我尝试设计了另一种让此二者共存的方案。

     

    Winform绘图过程简要分析

    控件在两种情况下需要调用绘制过程,一:遮挡物移开了;二:自身的视觉相关属性发生变化。这两个情况下,最终都要通过Invalidate函数才能进入到绘制过程,而在OnPaint绘制函数中,绘图设备对象Graphics则是由Control基类传递下来的。由此可见,Invalidate函数的处理过程肯定是发出了一个信号,而系统则在接受到此信号后通过WM_Paint消息将绘图设备对象和绘图区域信息反馈给了控件,并通过Control基类的OnPaint方法完成所有子类的绘制过程。

    这么看来,问题的核心就在于如何获取Graphics对象,并将其指定给Control对象的OnPaint方法。

    由于Form继承自Control,所以必然遵从同样的绘图过程,但对Layered窗体而言,OnPaint方法是不会被调用了,也就是说,无法获取系统传递的Graphics对象,那么此时,一个窗体又是如何完成绘制的呢?

     

    插入我们的Graphics

    Layered窗体的绘制过程,核心是UpdateLayeredWindows函数,但若要支持半透明PNG背景,必然有一个背景图的绘制过程。通常,是在UpdateLayeredWindows函数调用之前,先获取操作系统桌面绘图设备的内存映射,再将背景图绘制在此内存设备上,最后,将内存映射设备合并到桌面绘图设备上。(具体过程可以参考我提供的源码)。没错了,既然存在背景图对象,自然让人联想到Graphics类中提供了一个由背景图创建绘图设备的方法,通过这个绘图设备来绘制任何内容,最终都会成为背景图的一部分,那么最终也就能在桌面上显示出来了。

    整个方案简单来说就是在Layered窗体绘制过程中,由背景图创建出Graphics对象,并构造一个PaintEventArgs对象传递给winform控件的OnPaint方法,从而使得控件的绘制过程在我们指定的绘图设备上完成。

     

     

     

    透明背景的控件

    标准Winform控件对透明的支持相当“愚蠢”,是通过将自己的绘图设备指定给父控件,让父控件先在要透明的区域绘制一遍以获得“透明”的效果,但是在以上实现方法中,如果还这样绘制就行不通了,因为传递给控件的Graphics绘图设备就是从窗体的背景图获得的,本身已经包含了背景内容,如果再绘制一次,这种“假透明”就穿帮了。为了强调这一点,我在代码中强制了控件必须实现一个接口来完成绘制过程,在这个接口方法的实现中,你可以自由控制是否要绘制背景。(不是必须的,简单修改一下代码即可)

     

    一点遗憾

    对于大多数控件来说,这个方案完全符合自绘控件的实现标准,但是对于一些特殊的控件,暂还没有找到好的实现方法(PS.如果你已经实现,或有兴趣研究,欢迎交流)。这些所谓特殊控件即如TextBox那样存在一个输入光标的控件,由于这个闪动的小光标并不是控件自己绘制的,而是由windows系统负责控制的,我暂时还没有找到实现方法。而且,对于TextBox这种控件,似乎其文字也不是由其自身绘制的,实验中,我必须在TextBox的OnTextChanged重载中强制重绘才能完成输入内容的显示。

     

    Vista下实现全透明窗体的简单方法

    对于Vista及win7系统,在开启Aero后,通过相关API函数可以将毛玻璃效果扩展到整个窗体,令人意外的是,此时若将窗体边框设为None,窗体将完全从桌面上消失,不过控件依旧能正常显示。在给出的代码中,我已同时支持这两种技术来实现全透明的窗体,不过,可能没有人希望在能实现Aero效果的同时实现全透明窗体吧 ^_^

     

    代码应用效果:

    说明:左上这个蓝色区域即为Layered模式下的半透明窗体实例,为了效果明显一点,窗体本身的绘制过程添加了半透明背景和边框的绘制。
    中间那个绿色的箭头是一个标准PictureBox控件,实现了我上文提到的接口以支持透明背景,你可以用这个控件加载一个透明Gif试试 ^_^

     

    ------------------破处分割线------------------------------

    第一次在CSDN博客发帖,怎么发布源码?

    下载地址:

    http://download.csdn.net/source/3113901


    展开全文
  • 我们希望Form2splitContainer1或者panel控件中显示 1:首先看splitContainer1中显示。splitContainer控件本身就分为panel1和panel2两部分。我们可以上下布局和左右布局。 我这里是上下布局,我把Form2splitC...

    现在有两个窗体 Form1 和Form2 

    Form1中有控件splitContainer1 和panel 。控件。我们希望Form2在splitContainer1或者panel控件中显示

    1:首先看在splitContainer1中显示。splitContainer控件本身就分为panel1和panel2两部分。我们可以上下布局和左右布局。

    我这里是上下布局,我把Form2在splitContainer1中的panel1中显示

    先把Form1为MDI容器 即属性 IsMdiContainer=true

    我把代码写在Form1的load事件中。让窗体加载就显示

     private void Form1_Load(object sender, EventArgs e)
            {
                //splitContainer1控件
                Form2 u = new Form2();
                //u.Top = -25;
                //u.Dock = DockStyle.Fill; //充满父容器
                //u.FormBorderStyle = FormBorderStyle.None; //不显示边框
                //this.splitContainer1.Panel1.Controls.Clear();
                u.MdiParent = this;
                u.Parent = this.splitContainer1.Panel1;
                u.Show();
    
            }

     

    2:在panel中显示窗体 。只需改少量代码  《就不上图了》

     private void Form1_Load(object sender, EventArgs e)
            {
                //splitContainer1.Panel1.Container.Add("");
                //Form2 d = new Form2();
                //d.MdiParent = this;
                //d.Show();
    
                //splitContainer1控件
                Form2 u = new Form2();
                u.TopLevel = false;
                //u.Top = -25;
                //u.Dock = DockStyle.Fill; //充满父容器
                //u.FormBorderStyle = FormBorderStyle.None; //不显示边框
                //this.splitContainer1.Panel1.Controls.Clear();
                //u.MdiParent = this;
                //u.Parent = this.splitContainer1.Panel1;
                //u.Show();
    
                Form2 x = new Form2();
                x.TopLevel = false; //既然是子窗体就不能是顶级窗体
                this.panel1.Controls.Add(x);
                x.Show();
            }

     

    窗体是显示出来了。如果你觉得显示了 最大化。最小化 删除按钮不喜欢。想让别人家看上去完全是一个窗体的效果。

    我们可以通过上面的代码u.Top = -25 距离顶部的距离(控件panel1 或者splitContainer1.panel1顶部的距离)。是负数则向上移。那么splitContainer1或者

    panel1控件就会遮住最大化。最小化 删除按钮 。不过这个值的大小。需要自己尝试,不一定是 -25。或者。你可以索性设置Form2的属性设置: FormBorderStyle.None;

    转载于:https://www.cnblogs.com/nsky/p/3330296.html

    展开全文
  • WPF驻留Windows窗体控件虽然WPF已经提供了很多元素可供我们使用,使我们能够编出一个完美的程序。...解决方案为WPF中显示Windows窗体控件,需要使用System.Windows.Forms.Integration名称控件

    在WPF中驻留Windows窗体控件

    虽然在WPF中已经提供了很多元素可供我们使用,使我们能够编出一个完美的程序。但是当我们想用以前已经开发好的winform控件时,如果把它们转换成WPF控件,将会消耗很多精力和成本。尤其是使用的第三方控件是winform控件时,更加不可能。

    解决方案

    为在WPF中显示Windows窗体控件,需要使用System.Windows.Forms.Integration名称控件中的WidnowsFormsHost类。WindowsFormsHost类是WPF元素,该类可以包含Windows窗体控件,其中的Windows窗体控件是通过其Child属性提供的。创建的方法很简单,唯一的缺点是VS没有为WindowsFormsHost控件提供多少设计时支持。

    实例

    XAML代码

    <Window x:Class="添加WinForm控件.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
       Title="MainWindow" Height="820" Width="824">
        <Border BorderBrush="#FFDE12D5" BorderThickness="5" Margin="10,0,2,5">
            <Grid Margin="10">
                <Grid.RowDefinitions>
                    <RowDefinition Height="14*"/>
                    <RowDefinition Height="15*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="247*"/>
                    <ColumnDefinition Width="270*"/>
                </Grid.ColumnDefinitions>
    
                <WindowsFormsHost>
                    <forms:MaskedTextBox  x:Name="mm" Text="haohao " Dock="Fill"></forms:MaskedTextBox>
                </WindowsFormsHost>
                <WindowsFormsHost Grid.Row="1"
                              Grid.Column="1" Margin="5,0,-6,0">
                    <forms:PictureBox x:Name="pic" Dock="Fill" ImageLocation="c:\外星人.png" BorderStyle="Fixed3D"/>
                </WindowsFormsHost>
                <WindowsFormsHost Grid.Row="1"
                              Grid.Column="0" Margin="5,0,-6,0">
                    <forms:PictureBox x:Name="pic1" Dock="Fill" ImageLocation="c:\外星人.png" BorderStyle="Fixed3D" SizeMode="StretchImage"/>
                </WindowsFormsHost>
                <Image x:Name="image1" Grid.Column="1" Margin="5,5,0,0" />
    
            </Grid>
        </Border>
    </Window>
    

    C#代码

    using System;
    using System.Globalization;
    using System.Windows;
    using System.Windows.Media.Imaging;
    using Timer = System.Windows.Forms.Timer;
    
    namespace 添加WinForm控件
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            private readonly Timer _time = new Timer();
    
            public MainWindow()
            {
    
                InitializeComponent();
                //加载本地图片
                pic.Image = System.Drawing.Image.FromFile(@"c:\外星人.png");
                //加载网络图片
                pic1.ImageLocation = @"http://pic17.nipic.com/20111026/8686680_140506586159_2.jpg";
    
                //使用WPF自带的Image控件(元素)加载本地图片
                var image = new BitmapImage(new Uri(@"C:\外星人.png", UriKind.Absolute));
                image1.Source = image;
    
                //使用WinForm的Timer组件
                _time.Tick += time_Tick;
                _time.Interval = 500;
                _time.Start();
            }
    
            private void time_Tick(object sender, EventArgs e)
            {
                mm.Text = DateTime.Now.ToString(CultureInfo.InvariantCulture);
            }
        }
    }
    

    运行效果

    这里写图片描述

    展开全文
  • C#使用Panel控件实现一个窗体中嵌套另一个窗体 C#使用Panel控件实现一个窗体中嵌套另一个窗体ShowAllPagesAllPage = new ShowAllPage();// sAllPage.FormBorderStyle = FormBorderStyle.None;// ...

    在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体

    在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体
    ShowAllPage sAllPage = new ShowAllPage();
              //  sAllPage.FormBorderStyle = FormBorderStyle.None;
               // sAllPage.Dock = DockStyle.Fill;
                sAllPage.TopLevel = false;
                this.MainPanel.Controls.Clear();
                this.MainPanel.Controls.Add(sAllPage);
                sAllPage.Show();

    MainPanel为主窗体中的Panel控件,ShowAllPage为要在主窗体中显示中Panel中的窗体.

     

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------

    FormBorderStyle 属性设置新窗体的边框样式
    Dock属性获取或设置哪个边框停靠到父框体并确定如何随父框体一起调整大小
    这两项属性可不加

     

    但是用一个最简单的方法来说,就是使用MDI
    首先,父窗口要设置IsMdiContainer属性为True。实现MDI结构的父子窗口套用
    然后在窗口跳转处改为如下代码:
    例:一般跳转:Form1 f=new Form();
                                     F.Show();
    改为:
    Form1 c = new Form1();
                c.MdiParent = this;
                c.Show();
    不过这样有时会遇到一个问题,就是子窗体在跳出的时候会以父窗体的0,0坐标为准,所以在父窗体中如果有菜单栏的话,子窗体会被遮盖上,那么我们就在子窗体的Form_Load()中加上一句话来设置它与窗体上边缘的距离
    this.Top = 100;
    这样就完成了一个窗体在另一个窗体中的嵌套

    转载于:https://www.cnblogs.com/woxihuadabai/p/8041541.html

    展开全文
  • VC 窗体状态栏插入输入控件在控件中输入字符,主窗体的响应区会显示字符,本例重点不是显示字符,而是如何将一个输入控件添加到窗体的状态栏,虽然很小,不值得一提,但你可以举一返三,其实状态栏是程序...
  • 具体实现过程请参看一下代码(form2的textbox1输入然后form1的label1中显示textbox的内容 //form1代码,form1有一个label1和一个button1,其中label1的modifier属性为public namespace Windows...
  • 实现功能:同过按钮【界面1切换】和【界面2切换】实现panel1的界面1和界面2的切换. 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using ...
  • 窗体设置透明使用是掩码颜色,所以在窗体上用DC绘图的过程当中如果采用了和透明掩码颜色相同的颜色将不会显示出来。  2.如果将Border属性设置成了NONE,那么想通过响应WM_NCHITEST消息来实现窗体拖动就无法完成了...
  • VB6 FORM窗体上控件实现滚动的方法

    万次阅读 2014-09-09 13:54:06
    你将所有的控件都放在窗体的 picturebox控件上 除了 PictureBox 控件之外,也可用水平、垂直滚动条创建可滚动的图形视口应用程序。当所包含的图形超过控件范围时,单独一个 PictureBox 控件无法实现滚动功能─ ...
  • Qt中子窗体控件向父窗体控件传值

    千次阅读 2015-07-09 22:49:14
    今天学习Qt中控件相互传值的方法。其中参考了一些网上的意见。今天学习了两种方法。...第一幅图是主窗体画笔宽度文本框和画笔颜色文本框可以填入宽度和样色值,决定画笔宽度和颜色,然后选择右边的画椭圆,画
  • winform窗体控件

    2020-04-22 13:56:25
    1、窗体(Form) 2、Label (标签)控件 3、TextBox(文本框)控件 4、RichTextBox控件 5、NumericUpDown控件 6、Button(按钮)控件 7、GroupBox(分组框)控件 8、RadioButton(单选按钮)控件 9、CheckBox...
  • C# winform窗体使用WebBrowser控件显示百度地图

    千次阅读 热门讨论 2018-04-19 09:46:23
    效果图:下面是项目创建的过程:一、打开vs---新建项目项目选择windows窗体项目。名字随便取。二、右键项目--&gt;添加---&gt;选择新建项。选择左边web下的html页三。现在项目下应该有一个窗体和一个html...
  • <p>C#窗体中c;设置一个密码登录界面࿰c;密码登录成功后࿰c;怎么显示另外一个窗体中的用户控件?求大佬教!</p>
  • 1、Panel放置多个窗体和修改窗体控件的属性 Formm_Form = new Form(); m_Form.TopLevel = false; m_Form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; panelMainForm.Con...
  • C#窗体的textbox控件显示当前时间

    千次阅读 2020-05-27 15:28:09
    在窗体添加一个“Timer”控件 双击窗体在窗体的load事件里写 /// <summary> /// 窗体的load事件 /// </summary> /// <param name="sender"></param> /// <param name="e">&...
  • public void TraverControl(Control Ctl){ foreach (Control c in Ctl.Controls) { label1.Text += "\n" + "" + c.... //用于显示窗体中包含的所有的控件名,首先显示的是最外层的控件 if (c.Controls.Count =...
  • C#,直接子线程窗体上控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要子线程来操作窗体上控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供...
  • winform窗口打开后文本框的默认焦点...Form的Activated事件添加textBox1.Focus(), 即可获得焦点。 private void Form1_Activated(object sender, EventArgs e) { textBox1.Focus(); } TextBox是可以获得焦点的
  • 一般来说,直接子线程窗体上控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要子线程来操作窗体上控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软...
  • 首先窗体拖放一些控件,为了达到效果,最好放一些容器控件,最后再放一个label控件,用于显示窗体中控件的信息,开始前先将label1的text属性设置为:“窗体包含的控件如下:”然后放一个Button控件,用于.....
  • 实际,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比例变化即可。因为窗体上控件的位置和大小是相对于自己所在的窗体的,也就是所谓的窗口坐标...
  • 窗体(FromA)改变父窗体(MainForm)中控件的属性(利用委托) 代码(MainForm.cs): namespace TestSelect { public partial class MainForm : Form { public MainForm() { InitializeC
  • vb读取excel的数据并在窗体上显示

    万次阅读 2017-11-20 17:23:13
    Public ExcelTable As Workbook 'excel 工作表对象 Private TextBoxA() As ...Private FormWidth As Integer '窗体宽度 '以下子程序是用来建立数据网格 Sub CreateGrid(No, Data)  For
  • Excel VBA(08)窗体控件

    千次阅读 2020-04-29 16:36:58
    基础部分 一、窗体的基本操作 ...4、显示设置 窗体标题:caption 背景色:backcolor 背景图片:picture,代码里面可以使用loadpicture()方法进行加载 属性窗口里面可以查看 5、位置大小 to...
  • 转载于 新浪博客,链接...原文如下:改进C# WinForm窗体及其控件自适应各种屏幕分辨率一 、说明 2012-11-30 曾经写过 《C# WinForm窗体及其控件自适应各种屏幕分辨率》 ,其中也讲解了控件自适应的原理。近期有网友说,
  • 改进C# WinForm窗体及其控件自适应各种屏幕分辨率 一。说明  2012-11-30 曾经写过 《C# WinForm窗体及其控件自适应...使用皮肤时,要注意在窗体Load事件,有些控件(比如DataGridView)的子控件还没有完成,
  • C#窗体缩放时控件按比例自动缩放

    千次阅读 2019-11-09 12:05:24
    C#窗体缩放时窗体控件大小自动按同...那么窗体大小可调,但此时窗体控件大小和位置仍然保持不变,此时界面就不是我们所希望的了,基 于此,我查找学习了有关窗体缩放的代码,并分享给大家 这里插入代码片 ...
  • 例如控件A button ,B button, 分别调用 C窗体, 当控件A 时,窗体名称变成 A窗体画面,text里 显示A的字段信息 当控件为B时,窗体名称变成B窗体画面。text里显示B字段信息

空空如也

空空如也

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

在c中不会显示在窗体上的控件是