怎么切换TabCtrol的当前页(有点挑战,希望会的朋友不吝赐教)!

llsus 2012-08-13 04:27:40
有个程序A使用TabCtrol,有多个TabPage,我希望写另外一个程序B,在程序B中改变程序A中的当前TabPage,怎么实现?我已经知道程序A的每个TabPage的窗口句柄。有没有相关的方法或相关的API?
...全文
276 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
SocketUpEx 2012-08-14
  • 打赏
  • 举报
回复
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;

namespace Text
{
public class Program
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern UInt32 SendMessage(IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam);

public const UInt32 TCM_FIRST = 0x1300;
public const UInt32 TCM_GETIMAGELIST = (TCM_FIRST + 2);
public const UInt32 TCM_SETIMAGELIST = (TCM_FIRST + 3);
public const UInt32 TCM_GETITEMCOUNT = (TCM_FIRST + 4);
public const UInt32 TCM_GETITEMA = (TCM_FIRST + 5);
public const UInt32 TCM_GETITEMW = (TCM_FIRST + 60);
public const UInt32 TCM_SETITEMA = (TCM_FIRST + 6);
public const UInt32 TCM_SETITEMW = (TCM_FIRST + 61);
public const UInt32 TCM_INSERTITEMA = (TCM_FIRST + 7);
public const UInt32 TCM_INSERTITEMW = (TCM_FIRST + 62);
public const UInt32 TCM_DELETEITEM = (TCM_FIRST + 8);
public const UInt32 TCM_DELETEALLITEMS = (TCM_FIRST + 9);
public const UInt32 TCM_GETITEMRECT = (TCM_FIRST + 10);
public const UInt32 TCM_GETCURSEL = (TCM_FIRST + 11);
public const UInt32 TCM_SETCURSEL = (TCM_FIRST + 12);
public const UInt32 TCM_HITTEST = (TCM_FIRST + 13);
public const UInt32 TCM_SETITEMEXTRA = (TCM_FIRST + 14);
public const UInt32 TCM_ADJUSTRECT = (TCM_FIRST + 40);
public const UInt32 TCM_SETITEMSIZE = (TCM_FIRST + 41);
public const UInt32 TCM_REMOVEIMAGE = (TCM_FIRST + 42);
public const UInt32 TCM_SETPADDING = (TCM_FIRST + 43);
public const UInt32 TCM_GETROWCOUNT = (TCM_FIRST + 44);
public const UInt32 TCM_GETCURFOCUS = (TCM_FIRST + 47);
public const UInt32 TCM_SETCURFOCUS = (TCM_FIRST + 48);
public const UInt32 TCM_SETMINTABWIDTH = (TCM_FIRST + 49);
public const UInt32 TCM_DESELECTALL = (TCM_FIRST + 50);
public const UInt32 TCM_HIGHLIGHTITEM = (TCM_FIRST + 51);
public const UInt32 TCM_SETEXTENDEDSTYLE = (TCM_FIRST + 52); // optional wParam == mask
public const UInt32 TCM_GETEXTENDEDSTYLE = (TCM_FIRST + 53);

static void Main(string[] args)
{
IntPtr h = new IntPtr(句柄自己取);
UInt32 count = SendMessage(h, TCM_GETITEMCOUNT, 0, 0);
Console.WriteLine("共有 " + count + " 个分页");

UInt32 index = SendMessage(h, TCM_GETCURSEL, 0, 0);
Console.WriteLine("当前选中第 " + (index + 1) + " 页");

if (index == 0)
{
index = count - 1;
}
else
{
index = 0;
}

SendMessage(h, TCM_SETCURSEL, index, 0);
Console.WriteLine("已跳转到 " + (index + 1) + " 页");

Console.ReadKey();
}
}
}


非常简单



fsy123456accp 2012-08-14
  • 打赏
  • 举报
回复
好难啊 真的不知道 望赐教!
SocketUpEx 2012-08-14
  • 打赏
  • 举报
回复
Tab控件有标准的Windows消息可以操作


「已注销」 2012-08-14
  • 打赏
  • 举报
回复
http://www.cnblogs.com/kevinGao/archive/2011/10/30/2231524.html
这里有个帖子
然后你可以在需要切换tab页的界面调用切换页面事件模拟传入参数。定义一个变量或者判断sender参数是否为空 在事件里面判断然后判断是否执行该方法
llsus 2012-08-14
  • 打赏
  • 举报
回复
确实可行啊,谢谢楼上朋友。
llsus 2012-08-14
  • 打赏
  • 举报
回复
这些问题我已经解决了,已经实现了跨进程选择TabControl的当前页,不过发送了TCM_SETCURSEL消息后,Tabcontrol的标题确实有变化,不过TabPage的内容并没有变,我再用ShowWindow显示一下对应的Tabpage试试看
SocketUpEx 2012-08-14
  • 打赏
  • 举报
回复
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

或者

[DllImport("user32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
public static extern IntPtr GetParent(IntPtr hWnd);

TabPage的句柄怎么取出来的?难道不用先取出TabControl句柄才能取TabPage句柄?



llsus 2012-08-14
  • 打赏
  • 举报
回复
继续请教,遇到问题了


上面例子中的句柄是TabControl的句柄,我不知道, 我只知道每个TabPage的句柄
llsus 2012-08-14
  • 打赏
  • 举报
回复
谢谢楼上朋友,我试试你的代码,然后在来交流
jimh 2012-08-13
  • 打赏
  • 举报
回复
可以使用custom message, 自己定义事件,自己处理,这个事件id要定义大一点,不能跟系统事件重复。
llsus 2012-08-13
  • 打赏
  • 举报
回复
SendMessage 怎么实现?我WM_SETFOCUS 试过,失败了,可能用错了方法。应该用哪个消息?
不能使用鼠标消息,因为程序A点击TabPage的标题,会执行事件,我不希望事件被执行,只想切换页面。
寂小魔 2012-08-13
  • 打赏
  • 举报
回复
多多 观照。。。。。
关照
「已注销」 2012-08-13
  • 打赏
  • 举报
回复
SendMessage 这个可以实现 系统API
不过前提都是要有窗体
llsus 2012-08-13
  • 打赏
  • 举报
回复
怎么这么快就沉了,不知道的朋友也帮我顶啊
内容概要:本文聚焦于高维多阶段随机规划问题,深入研究了正则化分解方法与马尔可夫过程在刻画不确定性动态演化中的应用,并提供了完整的Python代码实现。通过引入正则化技术有效降低了高维随机优化问题的计算复杂度,结合马尔可夫链建模多阶段决策过程中的不确定性传播机制,提升了模型在复杂动态环境下的求解效率与鲁棒性。研究涵盖了问题建模、算法设计、数值求解及结果分析全过程,具有较强的理论深度与工程实践价值; 适合人群:具备一定运筹学、优化理论基础及Python编程能力,从事智能决策、人工智能、能源系统优化、金融工程等相关领域的科研人员、高校研究生以及工业界研发工程师; 使用场景及目标:①应用于电力系统调度、供应链管理、金融资产配置等存在多阶段不确定性的复杂决策场景;②掌握高维随机规划的建模思路与高效求解技术,深入理解正则化方法与马尔可夫过程在实际优化算法中的融合机制与实现路径; 阅读建议:建议结合提供的Python代码进行动手实践,重点关注算法实现细节、参数敏感性分析与收敛性验证,鼓励在不同应用场景中迁移和改进该方法,进一步探索其在分布鲁棒优化、动态规划等前沿方向的扩展潜力。
内容概要:本文系统研究了离散时间线性系统中基于共识的分布式滤波器的稳定性与最优性问题,深入探讨了KF(卡尔曼滤波)、DKF(分布式卡尔曼滤波)、SMDKF(基于平方根的最大熵分布式卡尔曼滤波)、CI(协方差交叉)、ICF(信息共识滤波)和HCMCI(基于高阶交叉协方差的信息融合)等多种滤波算法的理论基础、数学推导与实现机制。通过Matlab平台构建多传感器网络仿真环境,实现了各类算法在不同噪声统计特性和通信拓扑结构下的状态估计仿真,重点分析了各算法在估计精度、收敛速度、鲁棒性及一致性方面的性能差异,并对融合策略中的协方差传播、信息权重分配与共识迭代过程进行了细致对比,旨在为复杂环境下多智能体系统的分布式状态估计提供可复现的技术方案与理论支撑。; 适合人群:具备控制理论、信号处理、线性系统理论及Matlab编程基础的研究生、科研人员,以及从事多传感器融合、分布式估计算法开发、无人系统导航与智能电网监控等领域的工程技术人员。; 使用场景及目标:① 掌握主流分布式滤波算法的核心思想与数学建模方法;② 在多节点传感网络中实现高效可靠的状态估计;③ 对比分析不同共识融合策略在非理想通信条件下的性能表现;④ 支持学术论文复现、算法改进与工程化验证,服务于科研创新与系统优化设计。; 阅读建议:建议结合Matlab代码逐模块解析算法实现流程,重点关注状态预测、局部更新、信息融合与一致性达成的关键步骤;可通过调整系统噪声、观测噪声、网络连接拓扑等参数开展扩展性仿真实验,深入理解算法的稳定边界与最优性条件,进一步探索其在实际应用场景中的适应性与改进空间。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧