问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

winform编程中下面的控件是怎么做的

发布网友 发布时间:2022-04-30 04:15

我来回答

1个回答

热心网友 时间:2022-04-20 17:16

可以使用TextBox 进行重绘

这是我刚刚做出来的  代码比较粗糙

具体的行距等等需要你自己去 算 我这里只写的粗算 行数太多的话行距有小误差

 

代码  首先重写Text

    class MyTextBox : TextBox
    {
        const int WM_ERASEBKGND = 0x0014;

      
       
         public static SizeF FontSize(string 文字, Font 字体, Graphics MaxIn)
        {
            SizeF FontSize = MaxIn.MeasureString(文字, 字体);
            return FontSize;
        }
         protected void OnEraseBkgnd(Graphics gs)
         {
             
            gs.FillRectangle(Brushes.White, 0, 0, this.Width, this.Height); //填充为白色 
         

             SizeF 行属性 = FontSize("文字", this.Font, gs);
             int h=this.Height ;
             float  w=this.Width ;
             int n = (int)(h / (行属性.Height-2));
             float T = 行属性.Height / 17;
             float h2 = 行属性.Height / (float)4.5;
             for (int i = 1; i <= n; i++)
             {

                 gs.DrawLine(new Pen(Color.Black), 2, (float)(T + (行属性.Height - h2) * i), w-6, (float)(T + (行属性.Height - h2) * i));
             }
            gs.Dispose();
        }
    
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_ERASEBKGND) //绘制背景
            {
                
                OnEraseBkgnd( Graphics.FromHdc(m.WParam));
             
                m.Result = (IntPtr)1;
            }
           
            base.WndProc(ref m);
        }
    }
 

 

然后再窗口里面修改控件背景透明色

 

const int WM_CTLCOLOREDIT = 0x0133;
        const int TRANSPARENT = 0x1;
        [DllImport("gdi32")]
        static extern int SetBkMode(IntPtr hdc, int bkMode);
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_CTLCOLOREDIT && (m.LParam == myTextBox1.Handle
            {
                SetBkMode(m.WParam, TRANSPARENT);
              
                return;
            }
           

            else base.WndProc(ref m);
        }

追问背景和回车可以建立关系吗,比如,回车增加一行.最初为一行.

追答可以的
你在KeyDown 里面判断如果输入了回车那么 在文本框中查找 当前有多少个回车就 绘制多少行

当然要当前回车+1因为在KeyDown 的时候本次输入的回车没有计算

然后绘制之前保存当前文本框的内容+回车 然后绘制完成之后 先清空 文本框然后重写赋值 文本框
并设置文本框选择开始为文本框TEXT长度

初始化一行 修改 protected void OnEraseBkgnd(Graphics gs) 事件下的代码
gs.DrawLine(new Pen(Color.Black), 2, (float)(T + (行属性.Height - h2) * i), w-6, (float)(T + (行属性.Height - h2) * i));
去掉循环 去掉*i 就好了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? C# WinForm怎么代码产生控件(如Lable) C# winform 中什么是自定义控件,什么是自定义组件?有什么区别?有案例最好。 有没有比Excel好用的数据可视化工具? C# winform 自定义的控件里要怎么向所属窗体添加控件 为什么现在的抗战电视剧都被拍成了雷剧,神剧,偶像剧? 为啥现在那么多人骂抗日雷剧啊,我觉得那些雷剧挺好看的啊,特别是手撕鬼子那一片段极其爽快 对雷剧零容忍不能止于“下架”,你同意吗? 雷州县的历史是什么? 广东代表剧种 抗日雷剧让我们痛恨,其实这几点才是重点 经刘伯温改造后不仅千年无患,而且才人辈出的古村是什么? 写雷剧的作文500字 泄露天机会有什么后果? 梁山好汉108将 这些年雷人的抗日神剧层出不穷,你怎样看待抗日神剧? 《射雕英雄传》中,郭靖为何不敢小瞧瑛姑? 水浒传人物名称和特点 雷州有哪些风俗文化? 历史上真实的袁天罡是一个什么样的人,真的料事如神吗? 雷剧的简介 C# winform中有哪些第三方控件? Winform怎么自定义一个三个panel的控件 Winform 中有什么好的第三方控件显示数据实现类似如下布局 如何使用C#编写获取机器人坐标的winform程序 C# 中怎么将控件设为公共的(即所有窗体都可以用这个控件) 在C#语言中如何遍历List里面的每个元素? java中 foreach 和迭代器在遍历 List 集合 一些情况下为什么能使用集合自动的删除方法删除元素? struts2迭代iterator 遍历list问题 如何遍历list中对象的数据 struts中的迭代器如何和遍历Map中的List集合 Java 中用迭代器遍历list打印的却是内存地址 求解答 在线等 obj改掉是一样的 乐扣玻璃饭盒微波炉加热后会烫手吗? 在用迭代器遍历时遇到问题,请教各位 宜家家居的透明玻璃碗怕烫吗? C++ list容器有个函数叫insert(),和push_back()有什么不同?给个程序说一下INSERT的用法,谢谢! 玻璃饭盒 是不是放进微波炉很不容易加热 春前草作文五百字 对联 上联:神驹轻踏春前草 下联:小燕喜穿柳上风 钢化玻璃碗怕烫吗?可承受最高多少温度? 以我是一棵春前草为题,写一篇作文