我的表单上有一个TreeView控件,我以递归方式从窗口本身开始浏览另一个窗口的元素.我用这个来找到元素:
getRecursiveElements(AutomationElement parent)
{
children = parent.FindAll(TreeScope.Children, Condition.TrueCondition);
foreach (AutomationElement child in children)
{
addToTreeView(child);
getRecursiveElements(child);
}
}
Run Code Online (Sandbox Code Playgroud)
一般来说,代码在大多数情况下都能很好地工作.树被填充,我有一些其他支持代码,允许我双击,例如,树视图中的元素,它将突出显示目标表单上的元素.
我遇到的问题是,虽然它生成了一个很棒的树,但某些目标程序仍然缺少一些元素.
可能有什么理由可以解决这个问题,有什么方法可以解决这个问题吗?如果我EnumChildWindows()从user32.dll 调用会有同样的问题吗?
假设我们有一个菜单向用户显示一些选项:
Welcome:
1) Do something
2) Do something else
3) Do something cool
4) Quit
Run Code Online (Sandbox Code Playgroud)
用户可以按1 - 4然后按回车键.程序执行此操作,然后将菜单返回给用户.无效选项应该只显示菜单.
我有以下main()方法:
int main()
{
while (true)
switch (menu())
{
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
case 3:
doSomethingCool();
break;
case 4:
return 0;
default:
continue;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是menu():
int menu()
{
cout << "Welcome:" << endl
<< "1: Do something" << endl
<< "2: Do something else" << endl
<< "3: Do something cool" << endl …Run Code Online (Sandbox Code Playgroud) 随着我的程序的成长和发展,我一直在发现我的使用Control.Tag越来越多.我不太确定为什么微软把它放在那里,但我发现它非常有用.
我想知道:他们最初的目的是什么?什么被认为是可接受的,什么被认为是禁忌?
根据MSDN,Control.Tag"获取或设置包含控件数据的对象."
在我的日历应用程序中,我存储了Appointment一个AppointmentControl代表的实际对象.我怀疑这是它的预期用途,MSDN上的例子似乎证实了这一点,但我也做了一些不寻常的事情.
例如,当我有一个后退/下一对按钮并且我希望在我们到达开始时被禁用,然后在我们到达结尾时被禁用,那么我将下一个按钮存储在前一个标签中,和下一个标签中的上一个按钮.这样,我总是可以设置((Button)Tag).Enabled = true单击(因为当您向后移动时,显然已禁用的下一个按钮将启用,反之亦然).
此外,我的日历由(视觉上)二维面板阵列组成.我存储DateTime每个面板对应的内容Panel.Tag,当用户放大以查看一天中的时间时,构成每个时隙的面板在其标签中有一个TimeSpan,表示插槽的开始时间.
所以我很好奇:您认为Tag的最常见用途是什么?您使用过或看过的Tag有哪些更不寻常的应用?您是否会考虑将链接对象(如我的后面/下一个按钮示例中)存储为"hacky"?
有些人反对使用标签,暗示他们是旧语言的残余.一个常见的抱怨是,最好简单地扩展一个控件,使其包含一个强类型对象,而不是任何需要在使用时进行转换的对象.你怎么看待这件事?
请参阅:ListBox选择所有项目
我有一个ListBox,我需要选择所有项目.唯一的问题是,我在ListBox.SelectIndexChanged事件上有事件处理程序,它会做一些CPU密集型的事情.在循环中选择循环中的项会导致程序在循环的每次迭代中触发SelectIndexChanged事件.
我已将循环包含在Suspend/ResumeLayout()中,如下所示:
SuspendLayout();
for (int i = 0; i < listBox.Items.Count; i++)
listBox.SetSelected(i, true);
ResumeLayout();
Run Code Online (Sandbox Code Playgroud)
但它仍然会触发事件并且仍然需要很长时间来更新选择.
我可以用一个简单的布尔标志解决这个问题,当我开始更新时,我会切换,但是如果有一种更简洁的解决方法,那就太棒了.
谢谢.
我有一个div,里面有一些东西,用户可以选择点击'x'来说"这不适用于我",例如.
而不是删除div,我想在它上面播放一个半透明的div.
我从一些复杂的javascript开始,以确定我的div的大小和位置,并在其上创建一个新的.脚本给出的大小和位置看起来与我的眼睛大致相同,但重叠div被放在错误的位置.
然后我意识到(可能)有一种更简单的方法可以做到这一点.
我在div 里面放了一个带有"停电"等级的div,我想要黑掉.停电css类的可见性设置为隐藏,因此javascript将在需要时将其设置为可见.
我遇到的问题是,即使使用这种方法,我也无法让它精确填充父div所具有的矩形.
我有
.blackout
{
position: absolute;
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
background-color: black;
opacity: 0.5;
filter: alpha(opacity = 50);
}
Run Code Online (Sandbox Code Playgroud)
这填满了整个屏幕,而不仅仅是父div.
我需要更改什么才能填充父div?
Random r = new Random();
List<object> myList = new List<object>();
for (int i = 0; i < 100; i++)
myList.Add(new { A = r.Next(), B = r.Next() });
myList.Sort( (obj1, obj2) => obj1.A.CompareTo(obj2.A) );
Run Code Online (Sandbox Code Playgroud)
上面的代码定义了一个泛型List,用100个匿名变量填充它,有两个成员A和B.
假设我想在A上对myList进行排序.最后一行尝试对列表进行排序,但是这段代码显然不能编译,因为编译器不知道对象列表包含什么.
不使用LINQ,是否可以使用lambda或类似方法对此列表进行排序?
我会在谷歌/ MSDN上查看,但我不知道它叫什么,所以我在这里问.
在Java中,我似乎记得你可以做这个非常酷的事情:
Class MyClass
{
int number;
MyClass() { }
void setNumber(int number)
{
this.number = number;
}
}
Run Code Online (Sandbox Code Playgroud)
然后做类似的事情:
MyClass myClass = new MyClass()
{
override void setNumber(int Number)
{
this.number = 2 * number;
}
};
Run Code Online (Sandbox Code Playgroud)
...或者其他的东西.原谅我上面犯的任何错误 - 我在大约6年内没有碰到过Java.
关键是,我记得你可以伪内联一个类.
现在,我需要扩展一个C#WinForms控件,但我只需要使用一次,并且修改非常小.我需要做的就是覆盖CreateParams属性和OnPaint()处理程序.
我的解决方案已经变得越来越大,所有的类都是如此,包含另一个基本上与标准.Net控件相同的类似乎是一种耻辱,只是行为略有不同.
是否可以像在Java中一样在C#中进行内联扩展?如果是这样,怎么样?(它叫什么,所以我可以在MSDN上查找它?)
我有一个EditBox HWND tbLog,以及以下函数(不起作用):
void appendLogText(char* newText)
{
int len = GetWindowTextLength(tbLog);
char* logText = new char[len + strlen(newText) + 1];
GetWindowText(tbLog, logText, len);
strcat(logText, newText);
SendMessage(tbLog, WM_SETTEXT, NULL, (LPARAM)TEXT(logText));
delete[] logText;
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
appendLogText("Put something in the Edit box.\r\n");
appendLogText("Put something else in the Edit box.\r\n");
Run Code Online (Sandbox Code Playgroud)
首先,TEXT()实际上做了什么?我曾尝试过/不使用它:(LPARAM)logText而且(LPARAM)TEXT(logText)就我所见,没有任何区别.
第二,我在追加功能中做错了什么?如果我注释掉我的delete行,那么第一次运行append函数时,我的Editbox中会出现垃圾,然后是消息.我第二次运行它,程序崩溃了.如果我没有注释掉它,那么它第一次就会崩溃.
想象一下,我在HTML中有一个数据表,每个行都有三个可能的类之一:RowA,RowB和RowC; 它代表行中的信息.(例如,小型,中型和大型车).
在桌子上方,我有3个复选框:"Show Small Cars","Show Medium Cars","Show Large Cars".
如果用户取消选择"显示小型汽车",则包含小型汽车的行应该消失.
我就是这样做的:
function showHideRows(classToShowOrHide, checkBoxSender)
{
var tableObj = document.getElementById("myDataTable");
for (i = 0; i < tableObj.childNodes.length; i++)
if (tableObj.childNodes[i].className == classToShowOrHide)
tableObj.childNodes[i].style.display = checkBoxSender.checked ? "visible" : "none";
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?例如,我可以使用javascript修改css类来包含/排除display: none吗?
我没有使用jQuery.
假设我Particle在X,Y空间中有多个s,并且我想将它们全部归一化,使得平均X和Y为0.
串口实施:
public void Normalise()
{
double avgX = 0.0;
double avgY = 0.0;
foreach (Particle p in Particles)
{
avgX += p.X;
avgY += p.Y;
}
avgX /= (double)Particles.Count;
avgY /= (double)Particles.Count;
foreach (Particle p in Particles)
{
p.X -= avgX;
p.Y -= avgY;
}
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,性能也不错,因为它是O(n),但它是"令人尴尬的平行".看看我的PLINQ实现:
public void PNormalise()
{
double avgX = 0.0;
double avgY = 0.0;
Particles.AsParallel().ForAll(p =>
{
avgX += p.X;
avgY += p.Y;
});
avgX /= (double)Particles.Count;
avgY /= (double)Particles.Count;
Particles.AsParallel().ForAll(p => …Run Code Online (Sandbox Code Playgroud)