c++builder from窗体caption值如何居向窗体最左边(菜鸟级问题)???

 我来答
手机用户59330
2011-03-05 · TA获得超过360个赞
知道答主
回答量:172
采纳率:0%
帮助的人:132万
展开全部
窗体的消息(下面称之为MouseLeave)。在C++ Builder里,并没有直接提供处理这种消息的方法,需要我们自己动手来做。通过参考一些资料,我发现在C++ Builder里面处理MouseLeave,不外乎以下四种方法,现写出来供大家参考。如果有什么不对之处,请指正。

(一)、笨拙的Timer

每每提到捕捉鼠标离开窗体的消息的时候,也许有人就会马上想到用Timer来处理。不错,这种方法很简单,也确实有效。只须在Timer的OnTimer事件中判断鼠标所处位置的坐标是否在窗体内就可以了,详细代码如下:

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
POINT pt;
GetCursorPos(&pt); //得到鼠标的坐标
RECT rect;
GetWindowRect(Handle,&rect); //得到窗体的矩形范围
if(!PtInRect(rect,pt)) //判断鼠标的坐标是否在窗体的矩形范围内

Caption="out";
else
Caption="in";
}

为什么我要说是笨拙的Timer呢?原因有二:其一、OnTimer是优先级别比较低的消息,从严格意义上讲,上面这种做法并不精准。如果系统正在处理一大堆级别比较高的消息,那我们就无法及时获得MouseLeave消息。其二、Timer是比较宝贵的系统资源,用在MouseLeave上面似乎有些浪费了,因为我们还有更好的方法来做同样的事情。

(二)、霸道的SetCapture()

SetCapture()可以让指定的窗体捕获所有鼠标消息,当然也包括MouseLeave了:

void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
Caption="in";
SetCapture(Handle);
TPoint pt(X,Y);
TRect rect;
rect=GetClientRect();
if (!PtInRect(rect,pt))
{
ReleaseCapture();
Caption="out";
}
}

不过这种方法太过于霸道了,因为SetCapture()将所有的鼠标消息据为己有。虽然在捕获了MouseLeave以后已经ReleaseCapture了,但是在捕获过程中,你却无法对其他的鼠标消息做出反应。不信?你不妨在窗体在多放一个Button控件,再运行点点看?:)

(三)、受限的TrackMouseEvent()

MSDN上面说,TrackMouseEvent()可以让指定的窗体接受WM_MOUSELEAVE消息。但是在接受消息以后如果还要继续接受WM_MOUSELEAVE消息,必须重新调用TrackMouseEvent():

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
MouseTrack=false; //TForm1的私有变量,检测鼠标是否已经被Track
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(TMessage& Message) //重载WndProc
{
if (Message.Msg==WM_MOUSELEAVE) //在这里捕获WM_MOUSELEAVE消息
{
Caption="out";
MouseTrack=false; //鼠标Track已经完成
}
TForm::WndProc(Message);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
Caption="in";
if (!MouseTrack)
{
TRACKMOUSEEVENT tt;
tt.cbSize=sizeof(tt);
tt.dwFlags=TME_LEAVE;
tt.hwndTrack=Handle;
TrackMouseEvent(&tt);
MouseTrack=true; //开始鼠标Track
}
}
//---------------------------------------------------------------------------

这种方法很好用,唯一的缺点是可能不支持Win98(具体支不支持我也没有做过实验,哪位兄弟有Win98的帮我测试一下)。在Win2000的环境下,我推荐用这种方法,:)

(四)、未知的CM_MOUSELEAVE

在CSDN论坛里经常看到有人说可以通过捕获CM_MOUSELEAVE消息来达到同样的效果。不过根据我的测试,CM_MOUSELEAVE在控件上面工作得很好,可以用来捕获鼠标离开控件的消息。但用在窗体上似乎就不灵验了,可能我自己没有做对吧。如果有哪位大虾知道该怎么用,请告知小弟一声,我将感激不尽。

以上代码均在Win2k Professional+bcb6.0环境中编译成功。
独落长秋
2011-02-24 · TA获得超过1535个赞
知道小有建树答主
回答量:606
采纳率:0%
帮助的人:681万
展开全部
本来就在左边的。。。
如果想向右边的话。简单的就打空格来调吧。。、
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
军军106
2011-02-24 · TA获得超过453个赞
知道小有建树答主
回答量:1747
采纳率:0%
帮助的人:763万
展开全部
不会。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式