CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

如何改变Edit控件的文本颜色,不涉及MFC,

楼主rengo(攀梯)2002-04-22 22:48:44 在 VC/MFC / 基础类 提问

如何改变Edit控件的文本颜色,不涉及MFC,谢谢 问题点数:20、回复次数:33Top

1 楼footway(靠边行走)回复于 2002-04-22 22:58:06 得分 0

WM_CTLCOLORTop

2 楼rengo(攀梯)回复于 2002-04-23 23:46:09 得分 0

能不能详细点,麻烦了Top

3 楼sedulity(孤狐)回复于 2002-04-24 00:38:08 得分 0

SetTextColor()Top

4 楼quanxiongwei(毛毛熊)回复于 2002-04-24 00:55:15 得分 0

NO   MFC   why?  
  在MFC下极简单.  
  WM_CTLCOLOR  
   
  Top

5 楼rengo(攀梯)回复于 2002-04-24 01:03:47 得分 0

用SetTextColor(),可是怎么得到Edit的HDC呢Top

6 楼rengo(攀梯)回复于 2002-04-24 01:04:58 得分 0

quanxiongwei(毛毛熊):我现在在学sdk,等差不多了再学mfcTop

7 楼quanxiongwei(毛毛熊)回复于 2002-04-24 01:39:18 得分 0

下面代码不知行不行  
      UINT   id=pWnd->GetDlgCtrlID();  
          if   (id==IDC_EMAIL)       //改变   id为IDC_EMAIL   Edit控件的颜色  
          {  
                  pDC->SetTextColor(RGB(0,0,255));  
               
          }  
  Top

8 楼quanxiongwei(毛毛熊)回复于 2002-04-24 02:40:08 得分 0

rengo   ()   ,看一看  
  http://www.csdn.net/expert/topic/644/644996.xml?temp=.4449274Top

9 楼jishiping(JSP 季世平)回复于 2002-04-24 08:11:27 得分 0

Edit的背景颜色可以通过消息WM_CTLCOLOR改变,文字的颜色好像不可以改变。  
  Top

10 楼lyzcom(初学者)回复于 2002-04-24 08:33:34 得分 0

文字的颜色一样的可以改变!VB   C++Builder做这方面非常的容易,VC++我就不太清楚了。因为没有拿MFC写过程序:)Top

11 楼jishiping(JSP 季世平)回复于 2002-04-24 08:46:42 得分 0

我就是搞C++Builder的,在C++Builder里,Edit只能改背景颜色。Top

12 楼rengo(攀梯)回复于 2002-04-24 08:55:38 得分 0

不能吧,VC不是号称无所不能的吗,连这个小小的case都搞不定啊Top

13 楼rengo(攀梯)回复于 2002-04-24 09:25:47 得分 0

SetTextColor   好像只能改变TextOut和ExtTextOut   的颜色,下面是MSDN里面的SetTextColor的Remark:  
  The   text   color   is   used   to   draw   the   face   of   each   character   written   by   the   TextOut   and   ExtTextOut   functions.   The   text   color   is   also   used   in   converting   bitmaps   from   color   to   monochrome   and   vice   versa.  
  而且我试了用GetDC返回Edit的HDC,然后用SetTextColor,不行.而且我想随时改变Edit的文本颜色,处理WM_CTLCOLOR消息应该也不行吧.好烦的vcTop

14 楼jishiping(JSP 季世平)回复于 2002-04-24 09:59:29 得分 0

刚才又献丑啦。C++Builder里可以设定Edit的字体颜色。Top

15 楼jishiping(JSP 季世平)回复于 2002-04-24 10:05:46 得分 0

C++Builder的做法,我看了源程序,很复杂,没完全看懂。其中一个方法就  
  是,在class   TEdit里,响应消息WM_PAINT,建立一个内存   DC,在内存DC里  
  画,然后再将内存DC的内容用BitBlt复制到Edit的DC上。在VC里,就是需要  
  由VC的Edit控件派生一个控件,在这个控件里,相应消息WM_PAINT,再按上  
  面的说法做就可以了。Top

16 楼chenzhou35(vcworm.51.net)回复于 2002-04-24 10:28:59 得分 0

试试这个  
  hwnd   为Edit的句柄  
   
  HDC   hDC   =   ::GetDC(hwnd);  
  ::SetTextColor(hDC,RGB(255,0,0));  
  Top

17 楼rengo(攀梯)回复于 2002-04-24 12:51:53 得分 0

chenzhou35(vcworm.51.net)   :你是用MFC的方法吧,我试过了用GetDC得到Edit的HDC,然后用SetTextColor(hDC,RGB(255,0,0));,不行,SetTextColor返回0(应该是黑色吧)  
    jishiping(JSP   季世平):我用的是sdk的方法,MFC我还没开始学,MFC对我来说太难了点  
      这个问题好像很难哦,大家都不知道吗.还是我给的分太少了,好吧,我加分到100,希望大家该出手时就出手,谢谢各位了Top

18 楼40Star(斯文、大方、有前途)回复于 2002-04-24 13:20:12 得分 0

这么Easy都搞不定,怎么在CSDN混  
   
  来40Star告诉你:  
   
  将代码加入窗口的消息处理过程中(先声明HBRUSH   hbrEdit;)  
   
  case   WM_CTLCOLOREDIT://设置Edit控件的颜色  
  SetTextColor((HDC)wParam,   RGB(0x99,0x99,0x66));    
  SetBkMode((HDC)wParam,   TRANSPARENT);   //文字的背景透明  
  hbrEdit   =CreateSolidBrush(RGB(0xee,0xee,0xc4));  
  return   (LRESULT)hbrEdit;   //返回自定义的Brush来填充Edit的背景颜色  
  break;Top

19 楼40Star(斯文、大方、有前途)回复于 2002-04-24 13:21:35 得分 0

忘看了,你说的100分呀!而且这不是很难,只不过大家都不用SDK罢了Top

20 楼rengo(攀梯)回复于 2002-04-24 13:41:35 得分 0

40Star(陪你去看--☆流星雨★)   :对不起,能给一个比较完整的程序吗,我还是没看懂Top

21 楼40Star(斯文、大方、有前途)回复于 2002-04-24 13:53:24 得分 0

//#define   WIN32_LEAN_AND_MEAN //   Exclude   rarely-used   stuff   from   Windows   headers  
   
  #include   <windows.h>  
   
  //   Global   Variables:  
  HINSTANCE   hInst;  
  HWND   hWnd,hEdit;  
  const   RECT   wndRect={0,0,250,160};   //   window   rectangle  
  char   editStr[100];  
  char   wndText[100];  
  //   Foward   declarations   of   functions   included   in   this   code   module:  
  LRESULT   CALLBACK WndProc(HWND,   UINT,   WPARAM,   LPARAM);  
  LRESULT   CALLBACK EditProc(HWND,   UINT,   WPARAM,   LPARAM);  
  WNDPROC   MYEditProc;//Owner   Draw   Edit    
   
  int   APIENTRY   WinMain(HINSTANCE   hInstance,  
                                            HINSTANCE   hPrevInstance,  
                                            LPSTR           lpCmdLine,  
                                            int               nCmdShow)  
  {  
    //   TODO:   Place   code   here.  
  MSG   msg;  
  int   sx,sy;  
   
  WNDCLASSEX   wcex;  
  wcex.cbSize   =   sizeof(WNDCLASSEX);    
  wcex.style =   CS_HREDRAW   |   CS_VREDRAW;  
  wcex.lpfnWndProc =   (WNDPROC)WndProc;  
  wcex.cbClsExtra =   0;  
  wcex.cbWndExtra =   0;  
  wcex.hInstance =   hInstance;  
  wcex.hIcon =   NULL;//LoadIcon(hInstance,   (LPCTSTR)IDI_FACE);  
  wcex.hCursor =   LoadCursor(NULL,   IDC_ARROW);  
  wcex.hbrBackground =   (HBRUSH)(COLOR_WINDOW+1);  
  wcex.lpszMenuName =   NULL;//(LPCSTR)IDC_TEMP_C;  
  wcex.lpszClassName =   "DrawEdit";//"szWindowClass;  
  wcex.hIconSm =   NULL;//LoadIcon(wcex.hInstance,   (LPCTSTR)IDI_SMALL);  
  RegisterClassEx(&wcex);  
   
  hInst   =   hInstance;  
  //窗口居中  
  sx=GetSystemMetrics(SM_CXSCREEN);  
  sy=GetSystemMetrics(SM_CYSCREEN);  
  //   Perform   application   initialization:  
  //|   WS_MINIMIZEBOX   |   WS_POPUPWINDOW   |   WS_CAPTION   |   WS_SYSMENU     |   WS_THICKFRAME     如果没有WS_THICKFRAME,就会没有窗口显示  
  //WS_CAPTION-显示窗口标题  
          hWnd   =   CreateWindow("DrawEdit",   "40Star",WS_OVERLAPPED   |   WS_SYSMENU,  
              (sx-(wndRect.right-wndRect.left))/2,   (sy-(wndRect.bottom   -   wndRect.top))/2,   wndRect.right-wndRect.left   ,   wndRect.bottom   -   wndRect.top   ,   NULL,   NULL,   hInstance,   NULL);  
   
          if   (!hWnd)  
          {  
                return   FALSE;  
          }  
   
          ShowWindow(hWnd,   nCmdShow);  
          UpdateWindow(hWnd);  
   
  //   Main   message   loop:  
  while   (GetMessage(&msg,   NULL,   0,   0))    
  {  
  TranslateMessage(&msg);  
  DispatchMessage(&msg);  
  }  
   
  return   msg.wParam;  
  }  
  //  
  //     FUNCTION:   WndProc(HWND,   unsigned,   WORD,   LONG)  
  //  
  //     PURPOSE:     Processes   messages   for   the   main   window.  
  //  
  //     WM_COMMAND -   process   the   application   menu  
  //     WM_PAINT -   Paint   the   main   window  
  //     WM_DESTROY -   post   a   quit   message   and   return  
  //  
  //  
  LRESULT   CALLBACK   WndProc(HWND   hWnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)  
  {  
  RECT   rt;  
  HBRUSH   hbr;  
   
  GetClientRect(hWnd,   &rt);  
   
  switch   (message)    
  {  
  case   WM_CREATE:  
  //给自己的edit加入消息处理过程  
  hEdit=CreateWindow("EDIT","OwnerDraw",WS_CHILD   |   WS_VISIBLE   |   ES_LEFT   |ES_OEMCONVERT,  
  15,(rt.bottom-rt.top-25)/2   ,150,25,hWnd,NULL,hInst,NULL);//  
   
  MYEditProc=(WNDPROC)GetWindowLong(hEdit,GWL_WNDPROC);  
  SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);  
   
   
  break;  
  case   WM_CTLCOLOREDIT:  
  SetTextColor((HDC)wParam,   RGB(0,0,0));    
  SetBkMode((HDC)wParam,   TRANSPARENT);   //文字的背景透明  
  hbr   =CreateSolidBrush(RGB(255,0,0));  
  return   (LRESULT)hbr;   //返回自定义的Brush来填充Edit的背景颜色  
   
  break;  
  case   WM_DESTROY:  
  PostQuitMessage(0);  
  break;  
  default:  
  return   DefWindowProc(hWnd,   message,   wParam,   lParam);  
        }  
        return   0;  
  }  
   
  //Owner   Draw   EditTop

22 楼njg_jh(糨糊)回复于 2002-04-24 13:57:51 得分 0

这样绝对可以  
  HBRUSH   CAsdDlg::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)    
  {  
  HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor);  
   
  if(pWnd->GetDlgCtrlID()==IDC_EDIT1)  
  {  
  pDC->SetBkMode(TRANSPARENT);  
                                  //此处设置字体的颜色  
  pDC->SetTextColor(RGB(76,248,84));  
   
  }  
   
  //   TODO:   Change   any   attributes   of   the   DC   here  
   
  //   TODO:   Return   a   different   brush   if   the   default   is   not   desired  
  return   hbr;  
  }  
  Top

23 楼40Star(斯文、大方、有前途)回复于 2002-04-24 15:00:08 得分 0

老大,看清题目,No   MFCTop

24 楼rengo(攀梯)回复于 2002-04-24 17:07:40 得分 0

40Star(陪你去看--☆流星雨★)   :你的EditProc函数只有申明,Link的时候会出现错误:Compiling...  
  Main.cpp  
  Linking...  
  Main.obj   :   error   LNK2001:   unresolved   external   symbol   "long   __stdcall   EditProc(struct   HWND__   *,unsigned   int,unsigned   int,long)"   (?EditProc@@YGJPAUHWND__@@IIJ@Z)  
  Debug/ChangeTextColor.exe   :   fatal   error   LNK1120:   1   unresolved   externals  
  Error   executing   link.exe.  
  Creating   browse   info   file...  
   
  ChangeTextColor.exe   -   2   error(s),   0   warning(s)  
  Top

25 楼rengo(攀梯)回复于 2002-04-24 17:16:22 得分 0

我把SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);这句去掉  
  再把SetTextColor((HDC)wParam,   RGB(0,0,0));该成SetTextColor((HDC)wParam,   RGB(255,0,0));字可以变红Top

26 楼hyc1980(???)回复于 2002-04-24 17:23:41 得分 0

hdc   =   ::GetDC(hwnd);Top

27 楼40Star(斯文、大方、有前途)回复于 2002-04-24 18:58:25 得分 0

我只给你贴了我的一个程序中的一部分,你直接运行肯定出错啊!Top

28 楼rengo(攀梯)回复于 2002-04-24 23:23:46 得分 0

我实在弄不明白了:  
  在上面40Star的程序里面的SetTextColor((HDC)wParam,   RGB(255,0,0));   可以设置Edit的文本颜色为红,而我用GetDC获得Edit的HDC后,再SetTextColor却一点反应也没有,我看了一下,WM_CTLCOLOREDIT消息会被响应好几十次,每次的lParam(即Edit的hWnd)是一样的,而wParam(即Edit的HDC)不同,而且和我用GetDC获得的也不同(至少我按了几十次F5也没看见相同的).还望那位高人能解答一下  
  其实我想做的是,在程序运行过程中随时改变Edit的文本颜色,比如按下某个按钮什么,Edit的文本就变成红色.而不是在开始改变,谁能帮忙写一个DEMO程序出来我可以再给100分.(40Star:对不起我现在还不能结贴,希望你能等等)Top

29 楼40Star(斯文、大方、有前途)回复于 2002-04-25 13:55:49 得分 20

服了你了,是这模样么!  
  ==============================================================  
  //#define   WIN32_LEAN_AND_MEAN //   Exclude   rarely-used   stuff   from   Windows   headers  
   
  #include   <windows.h>  
   
  //   Global   Variables:  
  HINSTANCE   hInst;  
  HWND   hWnd,hButton,hEdit;  
  const   RECT   wndRect={0,0,250,160};   //   window   rectangle  
  char   editStr[100];  
  char   wndText[100];  
  COLORREF   testColor;  
  //   Foward   declarations   of   functions   included   in   this   code   module:  
  LRESULT   CALLBACK WndProc(HWND,   UINT,   WPARAM,   LPARAM);  
   
   
  int   APIENTRY   WinMain(HINSTANCE   hInstance,  
                                            HINSTANCE   hPrevInstance,  
                                            LPSTR           lpCmdLine,  
                                            int               nCmdShow)  
  {  
    //   TODO:   Place   code   here.  
  MSG   msg;  
  int   sx,sy;  
   
  WNDCLASSEX   wcex;  
  wcex.cbSize   =   sizeof(WNDCLASSEX);  
  wcex.style =   CS_HREDRAW   |   CS_VREDRAW;  
  wcex.lpfnWndProc =   (WNDPROC)WndProc;  
  wcex.cbClsExtra =   0;  
  wcex.cbWndExtra =   0;  
  wcex.hInstance =   hInstance;  
  wcex.hIcon =   NULL;//LoadIcon(hInstance,   (LPCTSTR)IDI_FACE);  
  wcex.hCursor =   LoadCursor(NULL,   IDC_ARROW);  
  wcex.hbrBackground =   (HBRUSH)(COLOR_WINDOW+1);  
  wcex.lpszMenuName =   NULL;//(LPCSTR)IDC_TEMP_C;  
  wcex.lpszClassName =   "DrawEdit";//"szWindowClass;  
  wcex.hIconSm =   NULL;//LoadIcon(wcex.hInstance,   (LPCTSTR)IDI_SMALL);  
  RegisterClassEx(&wcex);  
   
  hInst   =   hInstance;  
  //窗口居中  
  sx=GetSystemMetrics(SM_CXSCREEN);  
  sy=GetSystemMetrics(SM_CYSCREEN);  
  //   Perform   application   initialization:  
  //|   WS_MINIMIZEBOX   |   WS_POPUPWINDOW   |   WS_CAPTION   |   WS_SYSMENU     |   WS_THICKFRAME     如果没有WS_THICKFRAME,就会没有窗口显示  
  //WS_CAPTION-显示窗口标题  
          hWnd   =   CreateWindow("DrawEdit",   "40Star",WS_OVERLAPPED   |   WS_SYSMENU,  
              (sx-(wndRect.right-wndRect.left))/2,   (sy-(wndRect.bottom   -   wndRect.top))/2,   wndRect.right-wndRect.left   ,   wndRect.bottom   -   wndRect.top   ,   NULL,   NULL,   hInstance,   NULL);  
   
          if   (!hWnd)  
          {  
                return   FALSE;  
          }  
   
          ShowWindow(hWnd,   nCmdShow);  
          UpdateWindow(hWnd);  
   
  //   Main   message   loop:  
  while   (GetMessage(&msg,   NULL,   0,   0))    
  {  
  TranslateMessage(&msg);  
  DispatchMessage(&msg);  
  }  
   
  return   msg.wParam;  
  }  
  //  
  ////////////////////////////////////////////////////////////////////////////////////////////  
  HBRUSH   SetEditColor(HWND   hWndOwner,HDC   hDCEdit,HWND   hWndEdit)  
  {  
  HBRUSH   hbr;  
          if(hWndEdit==hEdit)  
          {  
  SetTextColor(hDCEdit,testColor);  
  SetBkMode(hDCEdit,   TRANSPARENT);   //文字的背景透明  
  hbr   =CreateSolidBrush(RGB(0xee,0xee,0xc4));  
  return   hbr;  
          }  
          else  
  return   NULL;  
  }  
   
   
   
  //  
  //     FUNCTION:   WndProc(HWND,   unsigned,   WORD,   LONG)  
  //  
  //     PURPOSE:     Processes   messages   for   the   main   window.  
  //  
  //     WM_COMMAND -   process   the   application   menu  
  //     WM_PAINT -   Paint   the   main   window  
  //     WM_DESTROY -   post   a   quit   message   and   return  
  //  
  //  
  LRESULT   CALLBACK   WndProc(HWND   hWnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)  
  {  
  int   wmId,   wmEvent;  
  RECT   rt;  
   
  HDC     hDCEdit;  
          HWND   hWndEdit;  
   
  GetClientRect(hWnd,   &rt);  
   
  switch   (message)    
  {  
  case   WM_CREATE:  
  //给自己的edit加入消息处理过程  
  hEdit=CreateWindow("EDIT","OwnerDraw",WS_CHILD   |   WS_VISIBLE   |   ES_LEFT   |ES_OEMCONVERT,  
  15,(rt.bottom-rt.top-25)/2   ,150,25,hWnd,NULL,hInst,NULL);//我的按钮  
  hButton=CreateWindow("BUTTON","MAGIC",WS_CHILD   |   WS_VISIBLE   |   BS_RIGHTBUTTON,  
  0   ,0   ,30,25,hWnd,NULL,hInst,NULL);//我的按钮  
  testColor=RGB(255,0,0);  
   
   
  break;  
  case   WM_CTLCOLOREDIT:  
  hWndEdit=(HWND)lParam;  
  hDCEdit=(HDC)wParam;  
  return   (LRESULT)SetEditColor(hWnd,hDCEdit,hWndEdit);  
   
   
  break;  
  case   WM_COMMAND://单击按钮的处理(主要功能实现)  
  wmId         =   LOWORD(wParam);    
  wmEvent   =   HIWORD(wParam);    
  //Process   Button   Messages  
  switch   (wmEvent)  
  {  
  case   BN_CLICKED:  
        //得到Edit中的字符串  
        testColor=RGB(0,255,0);  
        SendMessage(hWnd,   WM_CTLCOLOREDIT,   0,   0);  
        SetFocus(hEdit);  
  }  
  break;  
  case   WM_DESTROY:  
  PostQuitMessage(0);  
  break;  
  default:  
  return   DefWindowProc(hWnd,   message,   wParam,   lParam);  
        }  
        return   0;  
  }  
  Top

30 楼soandor(sdk)回复于 2002-04-25 14:02:10 得分 0

本来,处理几个消息就可以了,如果你愿意这样的话,也可以:  
      HWND   hWnd;  
      HDC   hDC;  
      hWnd   =   GetDlgItem(hDlg,IDC_BUTTON1);  
      hDC   =   GetDC(hWnd);  
      SetTextColor(....  
  就行了Top

31 楼quanxiongwei(毛毛熊)回复于 2002-04-25 14:29:50 得分 0

to:40Star(陪你去看--☆流星雨★)   (     )  
  不愧是二星高手,向你学习Top

32 楼rengo(攀梯)回复于 2002-04-25 19:26:13 得分 0

谢谢Top

33 楼rengo(攀梯)回复于 2002-04-25 19:32:34 得分 0

我已经给分了,怎么没反应?Top

相关问题

  • Edit 控件如何让文本据右
  • Edit控件的m_str(CString),想在文本开头加文本******
  • EDIT控件中显示文本文件的问题!
  • 急急急!如何使Rich Edit控件中的文本滚屏?
  • 请问如何设置Edit控件的文本对齐方式
  • ※ Edit控件中的文本如何换行?
  • 请教:如何动态更改Edit控件的文本颜色?
  • 如何双击EDIT控件,就清空里面的文本?
  • 如何让edit控件显示的文本向右对齐?
  • 文本控件的问题

关键词

  • .net
  • c++builder
  • win32
  • 控件
  • 文本
  • mfc
  • 内存
  • idc
  • 消息
  • 文字

得分解答快速导航

  • 帖主:rengo
  • 40Star

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo