这个问题google 了,论坛也有人没,没答案

vincent_1011 2009-08-22 07:01:41
问题:继承CEdit控件,将新编辑控件中选中文本的颜色改变成绿色(默认是白色),选中文本的背景色改成黄色(默认是蓝色)。

和同学说了他也不说
有没朋友能给个demo来
...全文
127 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2009-08-23
  • 打赏
  • 举报
回复
在我这里不闪烁,你的对话框可能还有问题。
Invalidate(); //这个是CMyEdit的窗口。让它无效是因为要调用父类CEdit的PAINT,接着UpdateWindow(); //是让父类把CEDIT的默认窗口绘制完。这时未选中的文本已经被绘制完。
然后你再作处理。即绘制所选择的文本
CPaintDC dc(this); //这是CMyEdit的paint DC
vincent_1011 2009-08-23
  • 打赏
  • 举报
回复
Invalidate(); 之后不是又会触发onpain吗?这样下面的代码还没执行,难道说这个是低级消息,下面的执行完才会触发onpaint,MFC还真不太懂,
另外一个不懂的就是,为什么在这个DC上设置的颜色不影响未选中的文本?这个DC应该什么DC,照理这是在paindc,应该是SDK的beginpain的DC,但在这里是在EDIT里面调用Invalidate,所以在OnPaint里面得到的DC应该是整个EDIT的啊。闷
schlafenhamster 2009-08-23
  • 打赏
  • 举报
回复
// 绘制MyEdit的默认窗口,如原来的text和边框。
Invalidate();
UpdateWindow();
//尽管在OnMouseMove有了一句,也不能去掉。
vincent_1011 2009-08-23
  • 打赏
  • 举报
回复
学了点东西,不知道SDK怎么整,查了下MSDN,几个重要的函数都是MFC的,SDK上没有
vincent_1011 2009-08-23
  • 打赏
  • 举报
回复
效果出来了,原理那里不太懂 onpaint里面调用Invalidate(); 不是有点乱吗?

闪屏有点厉害,我把Invalidate(); 去掉后,就没那么厉害了

看来截取选中内容只能判断键盘
schlafenhamster 2009-08-23
  • 打赏
  • 举报
回复
//给你一个例子:
/////////////////////////////////////////////////////////////////////////////
// CMyEdit message handlers
void CMyEdit::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// afxDump << point << "\n" ;
if (GetKeyState(VK_LBUTTON)&0x8000)
Invalidate();
CEdit::OnMouseMove(nFlags, point);
}

void CMyEdit::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// 取对话框的字体
CWnd *pParent=GetParent();
CFont *pFont=pParent->GetFont();
dc.SelectObject(pFont);
// 绘制Edit的默认窗口(如原text,边框等)
Invalidate();
UpdateWindow();
// 保存原Text
CString str;
GetWindowText(str);
// 取 selection
int nStartChar,nEndChar;
GetSel(nStartChar,nEndChar);
CPoint start=PosFromChar(nStartChar);
CPoint end=PosFromChar(nEndChar);
//
dc.SetBkColor(RGB(255,255,0));
dc.SetTextColor(RGB(0,255,0));
dc.TextOut(start.x,start.y+1,str.Mid(nStartChar,nEndChar-nStartChar));
//
CEdit::OnPaint();// 一定要把注释去掉!
}
晒月光的青蛙 2009-08-22
  • 打赏
  • 举报
回复
换个高级点的编辑控件试试
vincent_1011 2009-08-22
  • 打赏
  • 举报
回复
是啊,有同学说CUSTOMDRAW消息,不知道行不,我看了下,貌似都是处理listctrl 的item颜色的
bdzwj 2009-08-22
  • 打赏
  • 举报
回复
CEdit不好实现你说的功能,建议用RichEdit替代
MoXiaoRab 2009-08-22
  • 打赏
  • 举报
回复
选中的文本的颜色?
vincent_1011 2009-08-22
  • 打赏
  • 举报
回复
什么意思啊- -|+

你上面代码只能设置整编辑框的,我需要的是只选的。
MoXiaoRab 2009-08-22
  • 打赏
  • 举报
回复
这个社区,发代码是要负责任的
vincent_1011 2009-08-22
  • 打赏
  • 举报
回复

to 1楼,我也觉得是选中这里难,你用mousemove也没意思,别人还可以用其它办法选中

to 2楼,这样可以吗?这样修改的是整个EDIT的内容

我想这是系统内定的,很难截获
MoXiaoRab 2009-08-22
  • 打赏
  • 举报
回复

HBRUSH CSeleGuidDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
if( nCtlColor==CTLCOLOR_EDIT && pWnd->GetDlgCtrlID()==IDC_EDIT_COLOR )
{
pDC->SetTextColor( colorSelect );
pDC->SetBkColor( colorSelect );
HBRUSH hBr = CreateSolidBrush(colorSelect); // 背景色
return (HBRUSH) hBr;

};
// TODO: Return a different brush if the default is not desired
return hbr;
}


颜色这么来

COLORREF RGB(
BYTE byRed, // red component of color
BYTE byGreen, // green component of color
BYTE byBlue // blue component of color
);
schlafenhamster 2009-08-22
  • 打赏
  • 举报
回复
问题在CEdit的Selection变化时没有消息。试试用WM_MOUSEMOVE。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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