C#操作QQ的TreeView控件

C#实现树状结构图。树状目录。 C#实现目录树状图,完整工程源代码。C#实现目录树状图,完整工程源代码。C#实现目录树状图,完整工程源代码。C#实现目录树状图,完整工程源代码。C#实现目录树状图,完整工程源代码。 立即下载

转载: http://www.cnblogs.com/Rolends/archive/2012/04/23/2467044.html#commentform

image

通过spy++我们可以发现类ATL:30A57F50为treeview控件

我们需实现如下对treeview的操作

1),遍历获取信息 2),单选 3),多选

操作其他进程的步骤这个不区分语言的,一般实现过程如下

1),打开远程进程,这个调用API 函数 OpenProcess来实现

2),分配远程内存,调用API VirtualAllocEx 来实现,当然不是绝对的,当操作是不需要对象,而是通过SendMessage直接返回时就不需要分配

3),内存复制,由本地进程内存复制到远程进程内存,使用WriteProcessMemory来实现,同上不是绝对,只有调用需要读取对象信息时,才有需要

4),发送消息,发送消息就不用说了SendMessage

5),上面发送的消息结果,如果是写入对象的话,那么我们需要读取远程内存到本地和3相反,ReadProcessMemory

6),完了?,没有的.资源没释放,OK,释放资源,一般意义上就完成了

上面所有的步骤在vc里一般都这样实现的

我来讲解一下在C#如何实现操作其他进程的TreeView

1),获取Treeview控件句柄使用API FindWindowEx来实现,下面这个函数是找出所有控件,可以调用之后判断className来获取到控件指针
 public static List<IntPtr> FindControl(IntPtr hwnd, string className, string title = null)
 {
            List<IntPtr> controls = new List<IntPtr>();
            IntPtr handle = IntPtr.Zero;
            while (true)
            {
                IntPtr tmp = handle;
                handle = WinAPIHelper.FindWindowEx(hwnd, tmp, className, title);
                if (handle != IntPtr.Zero)
                {
                    controls.Add(handle);
                }
                else
                    break;
            }
            return controls;
     }

2),读取item

    a),获取根节点

  int retval = WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_GETNEXTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_ROOT, IntPtr.Zero);

,返回值为节点指针

   b),选择获取到的项

 int r1 = WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_SELECTITEM,
                  (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_CARET, new IntPtr(retval));

,返回值为操作结果

   c),展开选中项

 int r2 = WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_EXPAND,
                        (int)WinAPIHelper.TVM_EXPAND.TVE_EXPAND, new IntPtr(retval));

,返回操作结果

   d),声明ITEM并写入远程内存 
 

                    WinAPIHelper.TVITEM tvItem = new WinAPIHelper.TVITEM();
                    int size = Marshal.SizeOf(tvItem);
                    tvItem.mask = WinAPIHelper.TVIF_TEXT;
                    tvItem.hItem = (IntPtr)retval;
                    tvItem.pszText = (IntPtr)(remoteBuffer.ToInt32() + size + 1);
                    tvItem.cchTextMax = 255;
                    localBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(tvItem));
                    Marshal.StructureToPtr(tvItem, localBuffer, false);
                    bSuccess = WinAPIHelper.WriteProcessMemory(hProcess, remoteBuffer, ref tvItem, size, IntPtr.Zero);

关于item定义,大家可查询MSDN

   e),发送获取Item消息

   WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_GETITEM, 0, remoteBuffer);

    f),读取远程内存

   bSuccess = WinAPIHelper.ReadProcessMemory(hProcess, remoteBuffer, localBuffer, buff_size, IntPtr.Zero);

    g),将指针转为结构

WinAPIHelper.TVITEM retItem = (WinAPIHelper.TVITEM)
                                   Marshal.PtrToStructure(localBuffer, (Type)typeof(WinAPIHelper.TVITEM))

经过上面的操作我们就获取到了选定的某一项的信息,接下来我们使用

  retval = WinAPIHelper.SendMessage(hwnd, (int)WinAPIHelper.TV_Messages.TVM_GETNEXTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_NEXTVISIBLE, new IntPtr(retval));
来选择下一个项在进行上面的操作,直到返回值为空位置

3),多选实现,多选我们需要通过修改ITEM的状态来实现

  a),声明ITEM(操作为更改状态)

                WinAPIHelper.TVITEM tvItem = new WinAPIHelper.TVITEM();
                tvItem.hItem = items[i].Handle;
                tvItem.mask = WinAPIHelper.TVIF_STATE;
                tvItem.state = WinAPIHelper.TVIS_SELECTED;
                tvItem.stateMask = WinAPIHelper.TVIS_SELECTED;

   b),分配远程内存

IntPtr remoteBuffer = WinAPIHelper.VirtualAllocEx(hPro, IntPtr.Zero, buff_size, WinAPIHelper.AllocationType.Commit, WinAPIHelper.MemoryProtection.ExecuteReadWrite);

   c),写入远程内存

   bool result = WinAPIHelper.WriteProcessMemory(hPro, remoteBuffer, ref tvItem, size, IntPtr.Zero);

   d),设置状态

 int retval = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_SETITEM, 0, remoteBuffer);

  经过上面就实现了为某一项设置选中状态,实际操作中,我们为提高内存使用效率,是先分配缓冲区,在设置(写入)对象,然后发送指令

下面是完整代码

    public class WinTreeViewItem
    {
        public int Index { get; set; }
        public int lpAddress { get; set; }
        public string Text { get; set; }
        public bool OwnChild { get; set; }
        public IntPtr Handle { get; set; }
    }
    public class TreeViewHelper
    {
        const int buff_size = 1024;
        const int MAX_TVMSTRING = 255;        
        static public List<WinTreeViewItem> GetAllItem(IntPtr hTv)
        {
            return GetItems(hTv, null, null, int.MaxValue);
        }
 
        static public WinTreeViewItem GetItemByText(IntPtr hTv, params string[] text)
        {
            List<string> containsList = new List<string>();
            foreach (var item in text)
            {
                if (item != null && item != "")
                    containsList.Add(item);
            }
            List<WinTreeViewItem> items = GetItems(hTv, containsList, null, 1, false);
            if (items.Count > 0)
                return items[0];
            else
                return null;
        }
 
        static public bool SelectItem(IntPtr hTv, WinTreeViewItem item)
        {
            List<WinTreeViewItem> items = new List<WinTreeViewItem>();
            items.Add(item);
            return SelectItems(hTv, items);
        }
 
        static public List<WinTreeViewItem> GetItems(IntPtr hTv, List<string> containsList, List<string> withOutList, int takeCount)
        {
            return GetItems(hTv, containsList, withOutList, takeCount, false);
        }
 
        static public List<WinTreeViewItem> GetItems(IntPtr hTv, List<string> containsList, List<string> withOutList, int takeCount, bool isAddParent, int containsPreferenceCount = 0, int withOutPreferenceCount = 0)
        {
            if (withOutPreferenceCount < 1 && containsPreferenceCount < 1)
            {
                throw new Exception("两个数量级不能同时为空");
            }
            int tryCount = 0;
            IntPtr hPro = WinAPIHelper.OpenProcess(WinAPIHelper.PROCESS_ALL_ACCESS, false, WndHelper.GetProcessId(hTv));
            List<WinTreeViewItem> withOutResultItems = new List<WinTreeViewItem>();
            List<WinTreeViewItem> containsResultItems = new List<WinTreeViewItem>();
            int index = 0;
            int retval = 0;
        GETROOT:
            if (retval == 0)
            {
                tryCount++;
                if (tryCount > SysConfig.TreeViewItemFindTryCount)
                {
                    return null;
                }
                retval = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETNEXTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_ROOT, IntPtr.Zero);
                Console.WriteLine("根节点" + retval);
                Thread.Sleep(500);
                goto GETROOT;
            }
            tryCount = 0;
            int itemCount = 0;
        FINDCOUNT:
            if (itemCount == 0)
            {
                tryCount++;
                if (tryCount > SysConfig.TreeViewItemFindTryCount)
                {
                    return null;
                }
                itemCount = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETCOUNT, 0, IntPtr.Zero);
                Console.WriteLine("可用创建数量" + itemCount);
                Thread.Sleep(500);
                goto FINDCOUNT;
            }
            IntPtr pStrBufferMemory = WinAPIHelper.VirtualAllocEx(hPro, IntPtr.Zero, MAX_TVMSTRING, WinAPIHelper.AllocationType.Commit, WinAPIHelper.MemoryProtection.ReadWrite);
            IntPtr remoteBuffer = WinAPIHelper.VirtualAllocEx(hPro, IntPtr.Zero, Marshal.SizeOf(typeof(WinAPIHelper.TVITEM)), WinAPIHelper.AllocationType.Commit, WinAPIHelper.MemoryProtection.ExecuteReadWrite);
 
            if (remoteBuffer == IntPtr.Zero)
            {
                Console.WriteLine("远程地址分配失败");
                return null;
            }
            if (pStrBufferMemory == IntPtr.Zero)
            {
                Console.WriteLine("远程地址分配失败");
                return null;
            }
            WinAPIHelper.TVITEM tvItem = new WinAPIHelper.TVITEM();
            // int size = Marshal.SizeOf(tvItem);
            tvItem.mask = WinAPIHelper.TVIF_TEXT;
            tvItem.pszText = pStrBufferMemory;
            tvItem.cchTextMax = MAX_TVMSTRING;
            IntPtr localBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(tvItem));
            Marshal.StructureToPtr(tvItem, localBuffer, false);
            int addCount = 0;
            string tmpcontxt = "";
            while (retval != 0)
            {
                if (index + 1 > itemCount) break;
                tvItem.hItem = (IntPtr)retval;
                var item = new WinTreeViewItem()
                {
                    Index = index,
                    lpAddress = retval
                };
                int r1 = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_SELECTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_CARET, new IntPtr(retval));
                if (r1 == 0)
                {
                    Console.WriteLine("选择项失败");
                    continue;
                }
                //Thread.Sleep(100);
                int r2 = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_EXPAND, (int)WinAPIHelper.TVM_EXPAND.TVE_EXPAND, new IntPtr(retval));
                if (r2 == 1)
                {
                    //Console.WriteLine("可以展开");
                    itemCount = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETCOUNT, 0, IntPtr.Zero);
                    item.OwnChild = true;
                }
                else
                {
                    //Console.WriteLine("不可以展开");
                }
                bool bSuccess = WinAPIHelper.WriteProcessMemory(hPro, remoteBuffer, ref tvItem, Marshal.SizeOf(tvItem), IntPtr.Zero);
                if (bSuccess == false)
                {
                    Console.WriteLine("写入远程地址失败");
                    continue;
                }
                int r3 = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETITEM, 0, remoteBuffer);
                if (r3 == 0)
                {
                    Console.WriteLine("选择项操作失败");
                    continue;
                }
                bSuccess = WinAPIHelper.ReadProcessMemory(hPro, remoteBuffer, localBuffer, Marshal.SizeOf(tvItem), IntPtr.Zero);
                if (bSuccess == false)
                {
                    Console.WriteLine("读取远程地址失败");
                    continue;
                }
                WinAPIHelper.TVITEM retItem = (WinAPIHelper.TVITEM)Marshal.PtrToStructure(localBuffer, (Type)typeof(WinAPIHelper.TVITEM));
                int readLen = 0;
                IntPtr pStrLocaAddress = Marshal.AllocHGlobal(MAX_TVMSTRING);
 
                bSuccess = WinAPIHelper.ReadProcessMemory(hPro, pStrBufferMemory, pStrLocaAddress, MAX_TVMSTRING, out readLen);
                string pszItemText = Marshal.PtrToStringUni(pStrLocaAddress);
                // Console.WriteLine(pszItemText);
                item.Handle = tvItem.hItem;
                item.Text = pszItemText;
                bool withOutAdd = false;
                bool containsAdd = false;
                if (item.OwnChild)
                {
                    goto NEXTITEM;
                }
                if (containsList != null)
                {
                    foreach (var conItem in containsList)
                    {
                        if (pszItemText.Trim().Contains(conItem.Trim()))
                        {
                            containsAdd = true; goto ADDITEM;
                        }
                    }
                }
                if (withOutList != null)
                {
                    bool isContains = false;
                    foreach (var outItem in withOutList)
                    {
                        if (pszItemText.Trim().Contains(outItem.Trim()))
                        {
                            isContains = true;
                            goto NEXTITEM;
                        }
                    }
                    if (!isContains)
                    {
                        withOutAdd = true;
                        goto ADDITEM;
                    }
                }
 
            ADDITEM:
                if ((withOutList == null && containsList == null) || (withOutAdd || containsAdd))
                {
                    if (withOutAdd)
                    {
                        if (withOutResultItems.Count < withOutPreferenceCount && takeCount - containsPreferenceCount > withOutResultItems.Count)
                        {
                            withOutResultItems.Add(item);
                            addCount++;
                        }
                    }
                    if (containsAdd)
                    {
                        if (containsResultItems.Count < containsPreferenceCount && takeCount - withOutPreferenceCount > containsResultItems.Count)
                        {
                            containsResultItems.Add(item);
                            addCount++;
                        }
                    }
                    containsAdd = false;
                    withOutAdd = false;
                    if (addCount == takeCount)
                        break;
                }
            NEXTITEM:
                retval = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_GETNEXTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_NEXTVISIBLE, new IntPtr(retval));
                index++;
            }
            if (localBuffer != IntPtr.Zero)
            {
                try { Marshal.FreeHGlobal(localBuffer); }
                catch { }
            }
            if (remoteBuffer != IntPtr.Zero)
            {
                try { WinAPIHelper.VirtualFreeEx(hPro, remoteBuffer, 0, WinAPIHelper.MEM_RELEASE); }
                catch { }
            }
            if (pStrBufferMemory != IntPtr.Zero)
            {
                try { WinAPIHelper.VirtualFreeEx(hPro, pStrBufferMemory, 0, WinAPIHelper.MEM_RELEASE); }
                catch { }
            }
            if (hPro != IntPtr.Zero)
            {
                try { WinAPIHelper.CloseHandle(hPro); }
                catch { }
            }
            withOutResultItems.AddRange(containsResultItems);
            return withOutResultItems;
        }
 
        static public bool SelectItems(IntPtr hTv, List<WinTreeViewItem> items)
        {
            if (items.Count < 1) return false;
 
            int r1 = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_SELECTITEM, (int)WinAPIHelper.TVM_GETNEXTITEM.TVGN_CARET, items[0].Handle);
            if (items.Count == 1) return r1 == 1 ? true : false;
            IntPtr hPro = WinAPIHelper.OpenProcess(WinAPIHelper.PROCESS_ALL_ACCESS, false, WndHelper.GetProcessId(hTv));
            IntPtr remoteBuffer = WinAPIHelper.VirtualAllocEx(hPro, IntPtr.Zero, buff_size, WinAPIHelper.AllocationType.Commit, WinAPIHelper.MemoryProtection.ExecuteReadWrite);
            for (int i = 1; i < items.Count; i++)
            {
 
                WinAPIHelper.TVITEM tvItem = new WinAPIHelper.TVITEM();
                tvItem.hItem = items[i].Handle;
                tvItem.mask = WinAPIHelper.TVIF_STATE;
                tvItem.state = WinAPIHelper.TVIS_SELECTED;
                tvItem.stateMask = WinAPIHelper.TVIS_SELECTED;
                int size = Marshal.SizeOf(tvItem);
                bool result = WinAPIHelper.WriteProcessMemory(hPro, remoteBuffer, ref tvItem, size, IntPtr.Zero);
                int retval = WinAPIHelper.SendMessage(hTv, (int)WinAPIHelper.TV_Messages.TVM_SETITEM, 0, remoteBuffer);
 
                Thread.Sleep(100);
            }
            if (remoteBuffer != IntPtr.Zero)
            {
                try { WinAPIHelper.VirtualFreeEx(hPro, remoteBuffer, 0, WinAPIHelper.MEM_RELEASE); }
                catch { }
            }
            if (hPro != IntPtr.Zero)
            {
                try { WinAPIHelper.CloseHandle(hPro); }
                catch { }
            }
            return true;
        }
 
 
    }

c#文件操作实现资源管理器的一些功能,实现树形浏览全部文件,并且在LISTVIE显示具体信息, c#文件操作,有树视图做的,有点想资源管理器,实现树形浏览全部文件,并且在LISTVIEw显示具体文件的信息, 立即下载

相关推荐

2022年电赛F题23年电赛D题-信号调制度测量装置说明中提到带通采样定律。

另外,当对于一个频率很高的射频信号采样时,如果采样频率设的太低,对提高采样量化的信噪比是不利的。低通采样定理在《信号与系统》教材中进行了详细的讨论,但未对带通信号的采样定理进行描述,国内樊昌信和曹丽娜老师编写的《通信原理》第10章第2小节有所描述,但没有详细的公式推导,容易给初学者产生超过该最低采样频率即不会产生频谱混叠的假象。故采样频率没选好,就会使周期性频谱搬移过程中造成频谱混叠,既然频谱和原信号的频谱对不上了,故就无法无失真恢复原信号了,总之,频域波形不出现重叠是无失真传输的重要保障。

qq_64919823的博客 2183

C#的TreeView控件(树控件)

为树控件中的节点设置图标TreeView控件(树控件)可以为用户显示节点层次结构,每个节点又可以包含子节点,包含子节点的节点叫父节点。就像在Windows操作系统的Windows资源管理器功能的左窗口中显示文件和文件夹一样。一、添加和删除树节点。

wenchm的博客 6763

DS18B20温度传感器项目实战:从驱动编写到LCD显示,打造你的第一个温控系统

本文详细介绍了如何使用DS18B20温度传感器和LCD1602显示屏构建一个完整的温控系统。从硬件连接、OneWire协议实现到温度数据采集与LCD显示,全面解析了系统整合与工程化实现的关键步骤,帮助开发者快速掌握嵌入式温度监测系统的开发技巧。

weixin_42525328的博客 349

WPF 自定义TreeView控件样式,仿QQ联系人列表

根据思路,我们需要设置三个样式,TreeView样式,TreeViewItem样式,HierarchicalDataTemplate分层模板样式。像这种联系人列表一般涉及到多层级数据,而且有很多数据是需要动态更新的,如果通过手动一条条增加数据反而更复杂,而且不方便。默认的TreeView控件四周会有边距,因此需要设置下TreeView的样式。另外鼠标经过和鼠标选中的背景色需要变化,因此还需要设置TreeViewItem的样式。分层模板中存在两种样式,一种是分组样式,一种是人员样式。

weixin_53370274的博客 1835

嵌入式Linux Qt/QML开发实战:从Buildroot配置到应用部署

本文详细介绍了嵌入式Linux Qt/QML开发全流程,从Buildroot系统配置、交叉编译工具链搭建到应用部署与调试。以RK3506开发板为例,提供实战指南,帮助开发者高效完成嵌入式应用开发,解决常见环境配置与性能优化问题。

m2n3o4p5的博客 224

从零搭建无人机仿真环境:ROS 2与Gazebo Fortress实战指南

本文提供了一份详细的无人机仿真环境搭建实战指南,基于Ubuntu 22.04系统,整合ROS 2 Humble与Gazebo Fortress两大核心工具。通过分步讲解安装、配置及桥接过程,并引入PX4飞控与XTDrone2工具链,帮助开发者快速构建一个稳定、高效的无人机算法开发与测试平台,有效降低真机测试的成本与风险。

water的专栏 428

treeview 实现类似qq列表

&#13; #include enum {    COLUMN = 0,    NUM_COLS};void on_changed(GtkWidget * widget, gpointer statusbar){    GtkTreeIter iter;    GtkTreeModel *model;    char *value;    if (gtk_tree_se...

dragon434的专栏 388

1.4 《SST通用技术规范》整体框架与核心条款解读

本小节以**GB/T《电力电子变压器通用技术要求》**(固态变压器SST核心通用规范)为核心依据,结合电力电子变压器技术特性与工程应用边界,系统解析规范的整体章节框架、层级逻辑与强制性/推荐性核心条款,明确规范与传统工频变压器标准的差异,为SST拓扑设计、性能验证、出厂检验与工程落地提供标准化依据。全文以标准原文、期刊文献数据与试验规范为支撑,无主观推演与感性表述。

技术工作者 1683

C# 高仿腾讯QQ (实现QQ好友列表-基于ListBox的绘法)

C#实现QQ好友列表,一直是我网上百搜却不得其解的控件,几乎找不到相关的信息,而找到的也不是我想要的那种。不过,曾在优快云上看过到过网上一位大牛用C++实现QQ好友列表这种效果,当然,对于我这个C++基本没学过的小程序员来说,读他的代码却有点像看天书.....不过还好,C++代码看不懂,但从他的文章中却给我了一个实现QQ好友列表的思路-基于ListBox绘法 之前曾...

weixin_30542079的博客 1022

Cadence PCB 仿真宝典【目录】

欢迎大家来到《Cadence PCB 仿真宝典》该专栏包括【入门篇】【提升篇】【技巧篇】【疑难篇】四个部分,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 3269

手把手教你学simulink实例--基于Simulink的储能系统性能评估与仿真

储能系统是现代能源体系中的关键组成部分,广泛应用于可再生能源并网、电网调峰调频、电力质量改善以及电动汽车充电等领域。为了提高储能系统的运行效率和可靠性,对其性能进行准确评估至关重要。基于MATLAB/Simulink平台,可以构建储能系统的动态模型,并通过仿真分析其在不同工况下的性能表现。本项目旨在研究储能系统的建模方法、控制策略及其性能评估指标,并通过Simulink仿真验证系统的动态特性和稳态性能。

MHD0815的博客 195

C# 操作其他进程ListView

由于上篇C#操作QQ的TreeView控件以及详细讲解过如何操作其他进程的控件的流程,所以关于如何操作我就不在啰嗦了 主要实现流程如下 1), 获取列数 获取列数需先获取列的索引指针 columnIndex = WinAPIHelper.SendMessage(lvHwnd, (int)WinAPIHelper.LVM.GETHEADER, 0, 0); .csharp...

weixin_30505043的博客 218

使用Python从图像中提取表格

python 实现图片表格提取

qq_30895747的博客 2570

C#编写的通讯录

软件设计内容 1.1设计构思 通讯录系统主要功能用户的登录以及数据的维护。 用户登录:在数据库里设置user表,对具有用户名和密码的人方可访问数据库中其他数据。 数据的维护:包括数据的查询、添加、修改、删除的功能,对数据库中联系人进行各种操作。 1.2软件功能的验收标准 一、有较为美观简洁大方的菜单,能保证用户方便、直观、快捷的熟悉并使用软件的各项功能。 二、要求设计并实现一

研创物联 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C#控件的闪烁问题解决方法总结

最近对代码作了一些优化,试验后效果还可以,但是发现界面会闪烁,具体是TreeView控件会闪烁,语言为C#,IDE为VS2005。在查阅一些资料,使用了一些基本技术后(如开启双缓冲),发现没什么效果。 于是使用Profiler工具,查找出瓶颈在于每次更新完界面的EndUpdate操作(使用这个是为了减少界面更新次数,但这里不理想是因为控件中中的元素很多),猜想大概每次更新...

weixin_30621711的博客 95

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汇编实现多列类TreeView

这是我学习汇编写的一个程序移出来的代码,编译成LIB基础类在我的资源共享里,欢迎大家测试。目前为0.1版,未优化功能也不太全以后在弄吧呵呵。   以下是此LIB使用说明,我的环境为 XPsp3 +RADASM。有啥米问题QQ:285979593留言哒。         ;关于每个函数的返回值可以根据自己需要建立相应的结构      ;此0.1版本未优化,功能也不太全以后在弄

X_FOCUS的专栏 1599

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色   在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件进行控制,但对于WinForm则没有这样方便。申明一下,我在这儿所说的改变当前节点的字体与颜色,主要是在WinForm中的TreeView控件,当前选中节点后,其失去鼠标焦点后节点的字体与颜色...

.NET快速开发框架 267

C#遍历目录

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;namesp

Neok HOME 1256

c#ktv项目思维导图_GitHub - joysenlong/MindMapUserControlForWinForm: 这是一个可供Winform使用的思维导图的自定义控件 This is a u...

这是一个可供Winform使用的思维导图的自定义控件 This is a user control of MindMap for C# WinForm它允许你在Winform程序上集成思维导图,就像使用普通自定义控件一样。它并不依赖任何第三方DLL或控件库。你只需要引用WlxMindMap.dll就可以在窗口设计器中直接拖入到你的程序中。其开发该控件的初衷是用来选择代替TreeView控件,让用户...

weixin_33873270的博客 301

界面控件DevExpress WPF v26.1新版亮点 - TreeView、Spreadsheet控件功能升级

在接下来的系列文章中,我将为大家一一介绍DevExpress WPF v26.1在新版本中的更新亮点,希望能帮助到大家~

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 718

此处记载查询到重要资料链接

1.ASCII表 https://wenku.baidu.com/view/695d89b76429647d27284b73f242336c1eb930c2.html?from=search 2. 未能加载正确的程序集XXX或其某一依赖项。。。 https://blog.youkuaiyun.com/biyusr/article/details/7279791?utm_so...

Jessyzhao_0的博客 593

界面控件DevExpress Blazor UI v23.2 - 浅谈增强的可访问性

本文将主要介绍界面控件DevExpress Blazor UI在之前发布的v23.2版本中增强的可访问性,欢迎下载最新版体验!

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 1016

treeView和递归的简单运用

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Task

.NET学习者。 509
上一篇: Visual Studio 2010 Macros Stop Working
下一篇: 转帖:扩展jQuery easyui datagrid增加动态改变列编辑的类型
VCACC
博客等级 码龄17年 3粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值