在我的项目中,当用户将鼠标移到ComboBox项目上时,我想做一些注意事项, 例如:我有一个ComboBox,而物品是:鲍勃的手机,罗伯特的手机...... 当用户将鼠标移到Bob的手机上时,标签将出现在ComboBox中鼠标的位置,标签的内容为:05498762,。
请帮助我,谢谢!
答案 0 :(得分:2)
如果要在用户主动将鼠标移到TComboBox
项目上时显示提示,您可以执行以下操作:
如果TComboBox.Style
属性设置为csSimple
,则ComboBox的ListBox始终可见。但是,OnMouseMove
事件未公开,即使您手动分配它,也不会在将鼠标移到ComboBox的ListBox上时触发它,只会触发它的编辑字段。但是,您可以使用TApplication.OnShowHint
事件,或者将TComboBox
本身子类化为直接拦截CM_HINTSHOW
消息。无论哪种方式都会为您提供指向THintInfo
记录的引用/指针。您可以使用THintInfo.CursorPos
字段来确定当前鼠标下的ListBox项目:
致电GetComboBoxInfo()
以获取ComboBox的ListBox HWND
。
然后调用MapWindowPoints()
将CursorPos
坐标从ComboBox客户端坐标转换为ListBox客户端坐标。
然后使用翻译的坐标向ListBox发送LB_ITEMFROMPOINT
消息。
这将为您提供最接近坐标的项目的索引。然后,您可以使用所需的文本设置THintInfo.HintStr
字段。您还应该通过向ListBox发送THintInfo.CursorRect
消息来设置带有返回矩形的LB_GETITEMRECT
字段(使用MapWindowPoints()
将矩形从ListBox客户端坐标转换为ComboBox客户端坐标)。当鼠标移动到矩形之外时,将发出新的OnShowHint
/ CM_HINTSHOW
,然后您可以使用鼠标下的ListBox项目中的详细信息更新THintInfo
。
如果TComboBox.Style
属性未设置为csSimple
,则ListBox仅在下拉时才可见。在这种情况下,OnShowHint
/ CM_HINTSHOW
技巧不起作用。但是,您可以使用TComboBox.OnDropDown
事件直接手动子类化ListBox(以及OnCloseUp
事件以删除子类),使用SetWindowLongPtr()
或SetWindowSubclass()
。这将允许您拦截直接发送到ListBox的WM_MOUSEMOVE
消息,然后您可以使用提供的鼠标坐标将LB_ITEMFROMPOINT
发送到ListBox。
然而,要实际显示提示,仅在这种情况下设置TComboBox.Hint
属性是不够的(它不会显示,因为下拉列表基本上作为模态窗口并阻止正常的提示机制)。您必须手动显示自己的提示窗口,例如直接使用THintWindow
类。
答案 1 :(得分:1)
将function fun= f(t,y)
myu=398600.4418E+9;
J2=1.08262668E-3;
req=6378137;
r2=(y(1)**2 + y(2)**2 + y(3)**2);
r3=r2**(3/2);
w=1+1.5*J2*(req*req/r2)*(1-5*y(2)*y(2)/r2);
fun=[y(4),y(5),y(6),-myu*y(1)*w/r3,-myu*y(2)*w/r3,-myu*y(3)*w/r3];
endfunction
t0=86400*2.3567000000000000E+04;
tN= 86400*2.3567250000000000E+04;
t = linspace(t0,tN);
y0 = [-9.0656779992979474E+05, -4.8397431127596954E+06, -5.0408120071376814E+06, -7.6805804020022015E+02, 5.4710987127502622E+03, -5.1022193482389539E+03];
x = ode23s (f, t, y0 );
disp(x);
设置为true后,选择后鼠标移动将起作用:
ShowHint