社区
C++ Builder
帖子详情
急,请高手进来看看(有关模仿超级链接的问题),今天就要完成。
huang_jihua
2002-10-10 04:14:53
我想在我的DBGRID中模仿超级链接,某一个FIELD记录的是EMAIL,我想实现鼠标移到这一列字上面的时候鼠标变为crHandPoint,鼠标在其他地方的时候鼠标为crDefault,单击文字的时候可以打开email处理软件,单击文字旁边空白的时候不要打开email处理软件。
...全文
79
22
打赏
收藏
急,请高手进来看看(有关模仿超级链接的问题),今天就要完成。
我想在我的DBGRID中模仿超级链接,某一个FIELD记录的是EMAIL,我想实现鼠标移到这一列字上面的时候鼠标变为crHandPoint,鼠标在其他地方的时候鼠标为crDefault,单击文字的时候可以打开email处理软件,单击文字旁边空白的时候不要打开email处理软件。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
22 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
梦回童年001
2002-10-15
打赏
举报
回复
不错
imickey(mickey)
HearMe
2002-10-15
打赏
举报
回复
gz
huang_jihua
2002-10-15
打赏
举报
回复
谢谢duduwolf(嘟嘟狼),问题还是没有解决,再等两天,两天后结帐
duduwolf
2002-10-14
打赏
举报
回复
sorry,给你发迟了!我在StringGrid中实现了你要的这个功能,那是因为StringGrid是我自己画的,cells里的字也是我用textrect画上去的,所以我可以得到每个cells里的textRect;如果换成dbgrid,你也就必须得自己在OnDrawCell里自己画每个cell的字了,不然无法确切的得到Rect,下面是在StringGrid里实现的代码;
void __fastcall TFrmDBIntoList::StringGrid1DrawCell(TObject *Sender,
int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
......
int Left = Rect.Left
+ (Rect.Width() - Canvas->TextWidth(StringGrid1->Cells[ACol][ARow]))/2;
int Top = Rect.Top
+ (Rect.Height() - Canvas->TextHeight(StringGrid1->Cells[ACol][ARow]))/2;
Canvas->TextRect(Rect,Left,Top,StringGrid1->Cells[ACol][ARow]);
......
}
bool TFrmDBIntoList::InText(int X, int Y, const int ACol, const int ARow) //自定义的一个函数,X和Y是鼠标在Grid中的值,ACol和ARow为Grid的列值和行值
{
TRect txtRect;
int txtWidth = StringGrid1->Canvas->TextWidth(StringGrid1->Cells[ACol][ARow]);
int txtHeight = StringGrid1->Canvas->TextHeight(StringGrid1->Cells[ACol][ARow]);
int ColWidth[10]; //假定有10个column;
ColWidth[0] = StringGrid1->ColWidths[0];
for(int i=1;i<StringGrid1->ColCount;i++)
{
ColWidth[i] = ColWidth[i-1]+StringGrid1->ColWidths[i];
if(i<ACol)break;
}
int Left = ColWidth[ACol-1]+ACol;
//ShowMessage(Left);
int Right = ColWidth[ACol]+ACol+1;
int Top = StringGrid1->DefaultRowHeight*ARow+ARow;
int Bottom = StringGrid1->DefaultRowHeight*(ARow+1)+ARow+1;
txtRect.Left = Left+(Right-Left-txtWidth)/2;
txtRect.Top = Top+(StringGrid1->DefaultRowHeight-txtHeight)/2;
txtRect.Right = txtRect.Left+txtWidth;
txtRect.Bottom = txtRect.Top+txtHeight;
Edit1->Text = "X:"+IntToStr(X)+" Y:"+IntToStr(Y)+" Left:"+IntToStr(txtRect.Left)
+" Right:"+IntToStr(txtRect.Right)+" Top:"+IntToStr(txtRect.Top)
+" Bottom:"+IntToStr(txtRect.Bottom);
if(X>=txtRect.Left&&X<=txtRect.Right&&Y>=txtRect.Top&&Y<=txtRect.Bottom)
return true;
else return false;
}
void __fastcall TFrmDBIntoList::StringGrid1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
//然后再StringGridMouseMove里调用上面的那个自定义函数
if(InText(X,Y,1,1))StringGrid1->Cursor = crHandPoint;//加定为StringGrid1->Cells[1][1]这一栏实现效果
else StringGrid1->Cursor = crDefault;
}
。。。。。。
写的仓促,比较凌乱,如果哪儿看不懂就在给我发端消息吧!
如果那位高手有其他的办法,望赐教!!!我这个办法太笨了... :(
duduwolf
2002-10-14
打赏
举报
回复
sorry,
huang_jihua
2002-10-14
打赏
举报
回复
还有没有人帮我看看?
imickey
2002-10-14
打赏
举报
回复
Q: 如何打开一个应用程序?
ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
或
ShellExecute(this->m_hWnd,"open","notepad.exe",
"c:\\MyLog.log","",SW_SHOW );
As you can see, I haven't passed the full path of the programs.
Q: 如何打开一个同系统程序相关连的文档?
ShellExecute(this->m_hWnd,"open",
"c:\\abc.txt","","",SW_SHOW );
Q: 如何打开一个网页?
ShellExecute(this->m_hWnd,"open",
"http://www.google.com","","", SW_SHOW );
Q: 如何激活相关程序,发送EMAIL?
ShellExecute(this->m_hWnd,"open",
"mailto:nishinapp@yahoo.com","","", SW_SHOW );
Q: 如何用系统打印机打印文档?
ShellExecute(this->m_hWnd,"print",
"c:\\abc.txt","","", SW_HIDE);
Q: 如何用系统查找功能来查找指定文件?
ShellExecute(m_hWnd,"find","d:\\nish",
NULL,NULL,SW_SHOW);
Q: 如何启动一个程序,直到它运行结束?
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或:
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess("c:\\winnt\\notepad.exe", NULL,
NULL,NULL,FALSE,0,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
MessageBox("The process could not be started...");
}
Q: 如何显示文件或文件夹的属性?
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "properties";
ShExecInfo.lpFile = "c:\\"; //can be a file as well
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
zbc
2002-10-11
打赏
举报
回复
你的要求可能有一点不太好实现,既然这样的话,你还不如把它的列宽固定好,以避免显示出空白区域来
huang_jihua
2002-10-11
打赏
举报
回复
谢谢: zbc(犹豫的强盗)
zbc(犹豫的强盗)的方法已经可以了,但是我是想在单击字符旁边的空白时不要触发,单击文字时触发。这样无法实现,请高人指点。
huang_jihua
2002-10-11
打赏
举报
回复
我测试的是第二列中的,你在运行期改变该列宽度试试,我在改变该列宽度后出现问题更为明显
zbc
2002-10-11
打赏
举报
回复
我帮你看了一下,你只要在某一列中移动的话,它的手形是不会变的,不知道你是怎么测试的.
huang_jihua
2002-10-11
打赏
举报
回复
谢谢: zbc(犹豫的强盗)
我现在用的就是你这个方法,如果这样的话就会出现只要单击那一列就会触发,我是想在单击字符旁边的空白时不要触发,单击文字时触发。
而且鼠标变形的时候定位有问题,我发现当我数据长的时候它定位的时候只能定位到前面一部分,也就是,我的一列为:
111sdfsdf22333asdf
122sdf1312sadfsadfsdf
1231sdf244sdfsdfssd
12413241sadfsadf
这个时候,当我鼠标移上去的时候,在前面几个字符的时候是手型的,而在后面几个字符确是普通的形状。
帮我看看什么毛病,还有没有其他办法?
huang_jihua
2002-10-11
打赏
举报
回复
我看有的软件可以实现的,不知道哪位高人能够指点一二,先谢谢了
zbc
2002-10-10
打赏
举报
回复
报歉,给你留下一个不大不小的bug,修改下面过程中的代码可以做到万无一失:
void __fastcall TForm1::DBGrid1CellClick(TColumn *Column)
{
if (Column->Index == 0)//多加了这句,也就是只有是第1列才可以打开eml的
ShellExecute(this->Handle, "open", ("mailto:" + Query1->FieldByName("gdpjmx_id")->AsString).c_str(), NULL, NULL, SW_SHOWNORMAL);
}
zbc
2002-10-10
打赏
举报
回复
你不要等了,我现在给你一个easy的例子,其实,这很好实现的,呵呵:
void __fastcall TForm1::DBGrid1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
TGridCoord p = DBGrid1->MouseCoord(X,Y);
if(p.X == 1)
DBGrid1->Cursor = crHandPoint;
else
DBGrid1->Cursor = crDefault;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DBGrid1CellClick(TColumn *Column)
{
ShellExecute(DBGrid1->Handle, "open", ("mailto:" + Query1->FieldByName("gdpjmx_id")->AsString).c_str(), NULL, NULL, SW_SHOWNORMAL);
}
这样的话,你就可以点击第一列中的值来发送eml了!
duduwolf
2002-10-10
打赏
举报
回复
sorry,要下班了,明早写好了给你贴上来(晚上在家没法上网!)
huang_jihua
2002-10-10
打赏
举报
回复
我等,谢谢
duduwolf
2002-10-10
打赏
举报
回复
mousehook可以解决,不过有点小题大作
你可以得到当前鼠标的point,
然后再dbgrid内得到每一个单元格的rect,然后用textheight和textwidth进行判断
...
说起来好麻烦!你等等,我给你代码先!
huang_jihua
2002-10-10
打赏
举报
回复
我想我还是在说清楚一点:
我现在的问题是怎么才能知道我鼠标所在的位置上面是文字,而不是一块空白。
huang_jihua
2002-10-10
打赏
举报
回复
怎么还是没有人帮我看看
加载更多回复(2)
龙哥盟 PMP 课程笔记(二百零二)
Hello,你好,我是秋阳,欢迎回到我们超级沟通力训练营,
今天
的课程呢,我们会继续聊关于增量思维,怎么样在沟通当中打开局面,打开你的思路,我们之前聊过,当我们感觉信息不够的时候,怎么样能够听到更多东西。当我们感觉这个沟通陷入死局的时候,我们怎么样能够引导到一个,有建设性的方向上去,而
今天
我们要聊的是,当我们感觉到一个沟通陷入了两难啊,我怎么说都不对的时候,如何通过一个核心观念,只需要一个核心观念。就可以让我们从此告别所有沟通中的两难。
开发者 发展 9 心智模式
根据人类的学习与记忆过程来高效学习训练你的神经网络 获得知识的过程——学习——本质上是个体力活(尽管是有一定方法的体力活),这个体力活大致分为两步: 将外界(书本上的)知识转化为外显记忆。 通过不断练习,将外显记忆转化为内隐记忆。 李敖:换句话说,我这本书看完之后,被我大卸八块,五马分尸。可是被我勾住了,这些资料我不凭记忆来记它,我凭用细部的很耐心的功夫把它勾紧,放在资料夹子里。 ...
reStructuredText
reStructuredText 简明教程 060724 17:58 作者: Laurence 邮箱: 2999am@gmail.com ID: Kardinal @ Ubuntu.org.cn论坛 版权: This document has been placed in the public domai
AI入门: 关于人工智能的深度思考
超强人工智能究竟能否实现? ----关于人工智能的哲学思考 原文链接:http://fancyerii.github.io/2019/03/14/philosophy/#%E8%87%AA%E7%94%B1%E6%84%8F%E5%BF%97free-will 阅读提示: 这是一篇长文,全文约5万7千字;为了便于可选择的阅读,转发时特意加了目录标签,少量排版
问题
可参照原文。 本文讨论人工智能是否可以实现这个哲学
问题
。本文是《深度学习理论与实战:提高篇》的一章,更多内容
请
点击深度学习理论与实战:提高篇。 转载
怎样规划你毕业以后的人生
怎样规划你的毕业后的人生 我今年39岁了,25岁研究生毕业,工作14年,回头
看看
,应该说走了不少的弯路,有一些经验和教训。现在开一个小公司,赚的钱刚够养家糊口的。
看看
这些刚毕业的学生,对前景也很迷茫,想抛砖引玉,谈谈自己的看法,局限于理工科的学生,我对文科的不懂,身边的朋友也没有这一类型的。 91年研究生毕业,那时出路就是1种:留在北京的国营单位,搞一个北京户口,这是最好的选择。到后来的2~3
C++ Builder
13,870
社区成员
102,693
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章