鼠标左键按下不放移动指针问题

cxljm 2012-09-21 09:45:18
C++builder6中,怎样实现运行时在一个控件上按下鼠标左键不放,将指针移动到其他控件,另一控件也响应OnMouseDown事件?
例如:
窗体Form1中放置两个Panel控件Panel1、Panel2。
当鼠标在Panel1上按下时改变颜色,代码:
void __fastcall TForm1::Panel1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Panel1->Color==clWhite)
Panel1->Color=clSkyBlue;
else if(Panel1->Color==clSkyBlue)
Panel1->Color=clWhite;
}
鼠标左键保持按下状态,指针移动到Panel2,让Panel2也响应OnMouseDown事件,改变颜色。

注:窗体中有20个小Panel,一个一个点太麻烦。
...全文
292 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2012-09-21
  • 打赏
  • 举报
回复
大概效果是这样:
ccrun.com 2012-09-21
  • 打赏
  • 举报
回复
给你个简单实现,自己再加工吧。
.h文件中:
private:	// User declarations
bool m_bFlags[25][8];


.cpp文件中:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
StringGrid1->Font->Name = "宋体";
StringGrid1->Font->Size = 9;

StringGrid1->Options = StringGrid1->Options >> goRowSizing >> goColSizing
>> goRowMoving >> goColMoving >> goEditing;

StringGrid1->Width = 560;
StringGrid1->Height = 175;

StringGrid1->RowCount = 8;
StringGrid1->ColCount = 25;

StringGrid1->DefaultColWidth = 20;
StringGrid1->DefaultRowHeight = 20;

StringGrid1->ColWidths[0] = 45;

LPTSTR lpWeeks[] =
{
"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
};
for (int i = 0; i < 7; i++)
StringGrid1->Cells[0][i + 1] = lpWeeks[i];

for (int i = 0; i < 24; i++)
StringGrid1->Cells[i + 1][0] = String().sprintf(TEXT("%02d"), i);


memset(m_bFlags, 0x0, sizeof(m_bFlags));
}

// ---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
if (ACol == 0 || ARow == 0) return;

if (State.Contains(gdSelected))
m_bFlags[ACol][ARow] = !m_bFlags[ACol][ARow];

if (m_bFlags[ACol][ARow])
StringGrid1->Canvas->Brush->Color = clRed;
else
StringGrid1->Canvas->Brush->Color = clWhite;

StringGrid1->Canvas->FillRect(Rect);
}


在窗体上放一个StringGrid,然后将StringGrid的OnDrawCell事件和StringGrid1DrawCell挂钩即可。
Richardw 2012-09-21
  • 打赏
  • 举报
回复
自画的话,所有操作都自己来做,状态自己来记录,不存在不能隔行选择的问题呀,想选哪个,就改变哪个的状态好了,说到底都是数组元素赋值吧
cxljm 2012-09-21
  • 打赏
  • 举报
回复
该吃饭了,要是离得近我一定得请您!
cxljm 2012-09-21
  • 打赏
  • 举报
回复
我试的StringGrid只能连续拖选,不能隔行隔列选择。
cxljm 2012-09-21
  • 打赏
  • 举报
回复
我不急,等妖哥不忙了指点指点就行!
ccrun.com 2012-09-21
  • 打赏
  • 举报
回复
你的图是这个:


用StringGrid组件自画可以模拟。这么多格子,你用Panel来做,效率太低了。
cxljm 2012-09-21
  • 打赏
  • 举报
回复
cxljm 2012-09-21
  • 打赏
  • 举报
回复
如图:


cxljm 2012-09-21
  • 打赏
  • 举报
回复
我儿子玩电脑着迷,我想编个简单的程序,用来控制孩子用电脑的时间,win7的家长控制不好用。程序里选择时间的界面想做在win7家长控制里的那样,但不知道CBuilder6里哪个控件能实现?
ccrun.com 2012-09-21
  • 打赏
  • 举报
回复
是的,2010相对稳定并且好用。
你再说说你具体的需求?我帮你写段代码。
cxljm 2012-09-21
  • 打赏
  • 举报
回复
要不我就换 RAD Studio 2010 ,看论坛上说这个版本比较稳定
ccrun.com 2012-09-21
  • 打赏
  • 举报
回复
复杂倒不至于。高版本C++Builder中,象Panel这样的控件已经支持OnMouseEnter事件,处理这个就很方便。低版本的CBuilder中只能通过子类化了。

但是我在CBuilder6中试了一下,效果不理想,鼠标处于Capture状态时,不响应CM_MOUSEENTER事件。
cxljm 2012-09-21
  • 打赏
  • 举报
回复
“可以考虑响应CM_MOUSEENTER消息。”

这个估计很复杂吧,我不会呀!
ccrun.com 2012-09-21
  • 打赏
  • 举报
回复
可以考虑响应CM_MOUSEENTER消息。
cxljm 2012-09-21
  • 打赏
  • 举报
回复
好像MouseMove事件只在鼠标键没被按下时才能触发
cxljm 2012-09-21
  • 打赏
  • 举报
回复
“在Panel1中MouseDown后,在Panel2中处理MouseMove事件,根据当前的状态改变颜色或保持不变”

这个我试了,在Panel1中MouseDown后,不放开,在Panel2中就不响应MouseMove事件了。
dataxdata 2012-09-21
  • 打赏
  • 举报
回复
在Panel1中MouseDown后,在Panel2中处理MouseMove事件,根据当前的状态改变颜色或保持不变
缘中人 2012-09-21
  • 打赏
  • 举报
回复
触发MouseDown事件不可能了
我想应该从鼠标move消息入手
cxljm 2012-09-21
  • 打赏
  • 举报
回复
边看妖哥回复边查资料,终于明白了,又学很多新知识。
我太佩服您了!您的学识和修养。

13,825

社区成员

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

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