TEdit文本用不同颜色绘制问题

zxyjyzxyjy 2006-12-26 09:43:05
曾在下帖中提问
http://community.csdn.net/Expert/topic/5251/5251508.xml?temp=.408581

程序中多次使用TEdit,且程序也完全做好,现在想增加TEdit文本显示时用不同颜色,所有TEdit文本格式相同。

可否象VC++中那样写一个类,该类从TEdit派生来实现不同文本不同颜色绘制,对原工程只修改头文件中的所有TEdit成员的定义。

代码肯定不多,请给出详细代码,本人没用过C++Builder来写组件或派生类的经验。

完整正确者两处的分全送给你了。:):) 谢谢。
...全文
231 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxyjyzxyjy 2006-12-28
  • 打赏
  • 举报
回复
为何结不了帖啊
constantine 2006-12-28
  • 打赏
  • 举报
回复
该控件吧,也不是很难,alt+F12打开窗体的文件,搜索TEdit代替位你要用的新控件,然后回到窗体上,F12换到代码,再代替一次就行了,接下来的估计就改改几个对应的属性就行了,也是全部代替就ok了,很快的
zxyjyzxyjy 2006-12-28
  • 打赏
  • 举报
回复
已完全解决,谢谢各位。

结帖了。
CACACACACA 2006-12-27
  • 打赏
  • 举报
回复
前几天搞了几小时也没搞定. 跺一脚.
zxyjyzxyjy 2006-12-27
  • 打赏
  • 举报
回复
即使改成BeginPaint/EndPaint也是不正确的。如下
case WM_PAINT:
{
HDC hdc;
//hdc = GetWindowDC(Handle);
PAINTSTRUCT ps = { 0 };
::BeginPaint( Handle, &ps );
hdc = ps.hdc;
int oldmode = SetBkMode(hdc,TRANSPARENT);
HGDIOBJ oleFont = SelectObject(hdc,Font->Handle);
if (SelLength > 0) SetBkColor(hdc, 0x006B2408);
SetTextColor(hdc, Color_1);//Color_1自定义颜色
TextOut(hdc, 2 , 2, Text.c_str(), Text.Length());
SelectObject(hdc,oleFont);
SetBkMode(hdc, oldmode);
::EndPaint( Handle, &ps );
//ReleaseDC(Handle, hdc);
}
break;
这时自已设的颜色一点作用都没有了。
pp616 2006-12-27
  • 打赏
  • 举报
回复
在WM_PAINT 消息中。取HDC应该使用BeginPaint/EndPaint 而不该用GetWindowDC/ReleaseDC
阿发伯 2006-12-27
  • 打赏
  • 举报
回复
TEdit是Windows本身的控件,由Windows自动绘制,如果允许用户自绘,控件的ControlState中包含csCustomPaint,而TEdit是不包含的,另外,一般的图形控件的WM_PAINT消息中,从WParam可以得到DC,而TEdit的WM_PAINT消息中WParam始终等于0,如果用户强行用GetDC来取得DC画,TEdit的文字会连续不断的更新画,这就造成了上面所说的其它控件无法正常显示了。不过,用钩子的方法应该可以解决的。
CACACACACA 2006-12-27
  • 打赏
  • 举报
回复
说句打击楼主的话. 好像根本实现不了. (windows自己会自动重绘Edit)

因为:
只要Edit进入输入状态.除了自己绘上的字,其它输入的字根本就不行.
感觉不如用RichEdit代替.
zxyjyzxyjy 2006-12-27
  • 打赏
  • 举报
回复
本人用以下代码实现,结果绘制了两次,并且该edit在获得输入焦点后颜色显示又不正确了,各位高手请帮看看是怎么回事。

//.h
class PACKAGE TMyEdit : public TEdit
{
private:
protected:
void __fastcall WndProc(Messages::TMessage &Msg);
public:
};
//.cpp
void __fastcall TMyEdit::WndProc(Messages::TMessage &Msg)
{

TEdit::WndProc(Msg);
switch (Msg.Msg)
{
case WM_PAINT:
{
HDC hdc;
hdc = GetWindowDC(Handle);
int oldmode = SetBkMode(hdc,TRANSPARENT);
if (SelLength > 0) SetBkColor(hdc, 0x006B2408);
SetTextColor(hdc, Color_1);
TextOut(hdc, 0 , 2, Text.c_str(), Text.Length());
SetBkMode(hdc, oldmode);
ReleaseDC(Handle, hdc);
}
break;
}
}
zxyjyzxyjy 2006-12-27
  • 打赏
  • 举报
回复
谢谢 jjwwang((空园歌独酌,春日赋闲居))

主要的问题是对VCL控件的消息处理不知内部是如何处理的,在对于绘制两次的问题,把处理函数改成
void __fastcall TMyEdit::WndProc(Messages::TMessage &Msg)
{

if (Msg.Msg != WM_PAINT)
TEdit::WndProc(Msg);
else
{
HDC hdc;
hdc = GetWindowDC(Handle);
int oldmode = SetBkMode(hdc,TRANSPARENT);
if (SelLength > 0) SetBkColor(hdc, 0x006B2408);
SetTextColor(hdc, Color_1);
TextOut(hdc, 0 , 2, Text.c_str(), Text.Length());
SetBkMode(hdc, oldmode);
ReleaseDC(Handle, hdc);
}
}
结果是其它控件在运行时根本就无法正常显示了。


zxyjyzxyjy 2006-12-26
  • 打赏
  • 举报
回复
class PACKAGE TMyEdit : public TEdit
{
private:
protected:

void __fastcall OnPaint(TMessage &Message);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_PAINT, TMessage, OnPaint)
END_MESSAGE_MAP(TEdit)

public:
__fastcall TMyEdit(TComponent* Owner);
__published:
};

void __fastcall TMyEdit::OnPaint(TMessage &Message)

{
;
}
那位大哥说说在此消息传递的参数该是什么????是不是HDC什么的。
谢谢
pp616 2006-12-26
  • 打赏
  • 举报
回复
"代码肯定不多,请给出详细代码."
知道不多为什么不自己写??

"本人没用过C++Builder来写组件或派生类的经验"
没写过凭什么说代码肯定不多??

BS!

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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