如何改变Edit控件的文本颜色,不涉及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




