如何实现如下功能(200分)

JWhiteHorse 2003-01-29 11:14:01
鼠标移入ComboBox控件,控件自动下拉,
移出ComboBox控件和下拉框,自动收缩。
...全文
55 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
牧牛人软件 2003-01-30
  • 打赏
  • 举报
回复
Adayuer([±0℃]) 的建议很好!

补充一点BCB6是:
private: // User declarations

Classes::TWndMethod OldComBoxWP;

以前的版本是:
private: // User declarations
Controls::TWndMethod OldComBoxWP
孩皮妞野 2003-01-29
  • 打赏
  • 举报
回复
有事,说一下思路。

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
oldProc = ComboBox1->WindowProc;
ComboBox1->WindowProc = ComboProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboProc(TMessage& msg)
{
if(msg.Msg == CM_MOUSEENTER){
ComboBox1->Perform(CB_SHOWDROPDOWN,(WPARAM)TRUE,0);
::SetCapture(ComboBox1->Handle);
msg.Result = true;
}else if(msg.Msg == WM_MOUSEMOVE){
// 取得下拉区的位置。
RECT r;
ComboBox1->Perform(CB_GETDROPPEDCONTROLRECT,0,LPARAM(&r));
if(!点在r中或ComboBox1的客户区){
::ReleaseCapture(ComboBox1->Handle);
ComboBox1->Perform(CB_SHOWDROPDOWN,(WPARAM)FALSE,0);
}


msg.Result = true;
}else
oldProc(msg);

}
JWhiteHorse 2003-01-29
  • 打赏
  • 举报
回复
关键在于ComboBox的下拉框的移出事件比较难判断。
Libran 2003-01-29
  • 打赏
  • 举报
回复
关键在于如何捕获移入和移出事件,以前有过讨论,可以搜索一下
ComboBox的下拉和收缩,用ComboBox->DroppedDown属性就可以控制
Billy_Chen28 2003-01-29
  • 打赏
  • 举报
回复
发送下拉消息
大大怪老张 2003-01-29
  • 打赏
  • 举报
回复
哎呀,楼主下次把问题写在题目里,搜索的时候有的放矢.
牧牛人软件 2003-01-29
  • 打赏
  • 举报
回复
家里要安装BCB
favorit 2003-01-29
  • 打赏
  • 举报
回复
可惜在家里没有BCB,要不然也可以学习一下了:)
Jim3 2003-01-29
  • 打赏
  • 举报
回复
学习
牧牛人软件 2003-01-29
  • 打赏
  • 举报
回复
给你我的代码,下拉菜单名称较长EnrolDateComboBox,
加一个Timer1,Timer1->Enabled=false; Timer1->Interval=100;


*.h:

private: // User declarations

Classes::TWndMethod OldComBoxWP;
void __fastcall NewComBoxWP(TMessage &Msg);

//---------------------------------------------------------------------------
__fastcall TNoteForm::TNoteForm(TComponent* Owner)
: TForm(Owner)
{
OldComBoxWP = EnrolDateComboBox->WindowProc;
EnrolDateComboBox->WindowProc = NewComBoxWP;
}
//---------------------------------------------------------------------------

RECT r;
void __fastcall TNoteForm::Timer1Timer(TObject *Sender)
{
POINT pos;
GetCursorPos(&pos);
if(!(pos.x>r.left && pos.x<r.right && pos.y >r.top && pos.y < r.bottom)){
EnrolDateComboBox->DroppedDown=false;
Timer1->Enabled=false;
}
}
//---------------------------------------------------------------------------

void __fastcall TNoteForm::NewComBoxWP(TMessage& msg)
{
switch (msg.Msg)
{
case CM_MOUSEENTER:
{
EnrolDateComboBox->DroppedDown=true;
msg.Result = true;

break;
}
case CM_MOUSELEAVE:
{
POINT pos;
Timer1->Enabled=true;
GetCursorPos(&pos);
EnrolDateComboBox->Perform(CB_GETDROPPEDCONTROLRECT,0,LPARAM(&r));
if(!(pos.x>r.left && pos.x<r.right && pos.y >r.top && pos.y < r.bottom)){//★★★当鼠标向下移时,就无法判断CM_MOUSELEAVE,在Timer1Timer()判断。
EnrolDateComboBox->DroppedDown=false;
}

msg.Result = true;
break;
}
case WM_DESTROY:
{
EnrolDateComboBox->WindowProc = OldComBoxWP;
break;
}
}
OldComBoxWP(msg);

}

有问题再问
nxyc_twz 2003-01-29
  • 打赏
  • 举报
回复
楼上写的不错,实际上就是检测鼠标位置(通过鼠标移动事件),然后发送鼠标单击消息(WM_LBUTTONDOWN)!

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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