你会吗?(一定给分100)

时间:2022-06-29 19:04:12
我从CEdit 继承新类CMyEdit
请问怎么样处理:
  当得到焦点时Edit的背景色变成蓝色
  失去焦点时Edit的背景色变成白色?
把过程写下来,我运行出来的一定给分!

8 个解决方案

#1


这个难道没人会吗?

#2


这个问题还没搞定吗?其实我不能帮你写整个过程,只能告诉你方法,否则你也太不劳而获了.
1. 改变背景色的画刷在OnctlColor(),你必须重载它,其实这一点你也知道;此外,你须设置一布尔变量,每当获得焦点与失去焦点时,你必须要使这个函数起作用,即重绘,而且画刷是不同的颜色.
2. 实在不行,你就把对象的属性设置为自己绘制,这样你不得不自己绘背景,我想更麻烦

#3


我做了一个demo,把你的email给我,我给你发过出.

#4


头文件中定义各变量:

HBRUSH m_hBlueBrush;
HBRUSH m_hWhiteBrush;

BOOL flag;

CWnd* pCurWnd;

对话框OnInitDialog()中创建刷子,变量初始化:
m_hBlueBrush = CreateSolidBrush(RGB(0,0,255));
m_hWhiteBrush = CreateSolidBrush(RGB(255,255,255));

flag = FALSE;
pCurWnd = GetDlgItem(IDC_EDIT1);

SetTimer(100,100,NULL);//设置定时器

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

if (pWnd->GetDlgCtrlID() == IDC_EDIT1)
{
if (flag)
{
return m_hBlueBrush;
}
else
{
return m_hWhiteBrush;
}
}

return hbr;
}

BOOL CDlgDlg::DestroyWindow() 
{
// TODO: Add your specialized code here and/or call the base class
if (m_hBlueBrush)
{
DeleteObject(m_hBlueBrush);
m_hBlueBrush = NULL;
}

if (m_hWhiteBrush)
{
DeleteObject(m_hWhiteBrush);
m_hWhiteBrush = NULL;
}

KillTimer(100);

return CDialog::DestroyWindow();
}

void CDlgDlg::OnTimer(UINT nIDEvent) 
{
if (pCurWnd == (this->GetFocus()))
{
flag = TRUE;
}
else
{
flag = FALSE;
}

pCurWnd->InvalidateRect(NULL);
pCurWnd->UpdateWindow();

CDialog::OnTimer(nIDEvent);
}

#5


怎么还不给我消息,我的电话:(010)65057801-2208

#6


呵呵。 大家说得对,hand一下

#7


同意legerwu(Leger),应该比 freelybird(阿愚) 做的容易些。
但 freelybird(阿愚) 的也可以实现。

#8


legerwu(leger)做得不够优美,效率也不高,应该子类化.我已实现,很简单的,不超过8条语句

#1


这个难道没人会吗?

#2


这个问题还没搞定吗?其实我不能帮你写整个过程,只能告诉你方法,否则你也太不劳而获了.
1. 改变背景色的画刷在OnctlColor(),你必须重载它,其实这一点你也知道;此外,你须设置一布尔变量,每当获得焦点与失去焦点时,你必须要使这个函数起作用,即重绘,而且画刷是不同的颜色.
2. 实在不行,你就把对象的属性设置为自己绘制,这样你不得不自己绘背景,我想更麻烦

#3


我做了一个demo,把你的email给我,我给你发过出.

#4


头文件中定义各变量:

HBRUSH m_hBlueBrush;
HBRUSH m_hWhiteBrush;

BOOL flag;

CWnd* pCurWnd;

对话框OnInitDialog()中创建刷子,变量初始化:
m_hBlueBrush = CreateSolidBrush(RGB(0,0,255));
m_hWhiteBrush = CreateSolidBrush(RGB(255,255,255));

flag = FALSE;
pCurWnd = GetDlgItem(IDC_EDIT1);

SetTimer(100,100,NULL);//设置定时器

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

if (pWnd->GetDlgCtrlID() == IDC_EDIT1)
{
if (flag)
{
return m_hBlueBrush;
}
else
{
return m_hWhiteBrush;
}
}

return hbr;
}

BOOL CDlgDlg::DestroyWindow() 
{
// TODO: Add your specialized code here and/or call the base class
if (m_hBlueBrush)
{
DeleteObject(m_hBlueBrush);
m_hBlueBrush = NULL;
}

if (m_hWhiteBrush)
{
DeleteObject(m_hWhiteBrush);
m_hWhiteBrush = NULL;
}

KillTimer(100);

return CDialog::DestroyWindow();
}

void CDlgDlg::OnTimer(UINT nIDEvent) 
{
if (pCurWnd == (this->GetFocus()))
{
flag = TRUE;
}
else
{
flag = FALSE;
}

pCurWnd->InvalidateRect(NULL);
pCurWnd->UpdateWindow();

CDialog::OnTimer(nIDEvent);
}

#5


怎么还不给我消息,我的电话:(010)65057801-2208

#6


呵呵。 大家说得对,hand一下

#7


同意legerwu(Leger),应该比 freelybird(阿愚) 做的容易些。
但 freelybird(阿愚) 的也可以实现。

#8


legerwu(leger)做得不够优美,效率也不高,应该子类化.我已实现,很简单的,不超过8条语句