不使用MFC的那些DC类,只用api如何改变一个控件的颜色,不要第三方控件???

eastnofail 2004-12-28 09:34:27
HDC hDC = GetDC(Handle);
..........
..........
...全文
200 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
eastnofail 2005-01-04
  • 打赏
  • 举报
回复
up
eastnofail 2004-12-31
  • 打赏
  • 举报
回复
不行啊
eastnofail 2004-12-30
  • 打赏
  • 举报
回复
试试
hongtog 2004-12-29
  • 打赏
  • 举报
回复
有两种方法。其一,可以在父类中指定控件的颜色,或者利用MFC4.0 新的消息反射在
控件类中指定颜色。当控件需要重新着色时,工作框调用父窗口(通常是对话框)的
CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属性。例如,
下述代码将对话中的所有编辑控件文本颜色改为红色:
HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)
{
HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor );
//Draw red text for all edit controls .
if (nCtlColor= = CTLCOLOR_EDIT )
pDC —> SetTextColor (RGB (255 , 0 , 0 , ) ) ;
return hbr ;
}
然而,由于每个父窗口必须处理通知消息并指定每个控件的绘画属性,所以,这种方法
不是完全的面向对象的方法。控件处理该消息并指定_____绘画属性更合情合理。消息反射允
许用户这样做。通知消息首先发送给父窗口,如果父窗口没有处理则发送给控件。创建
一个定制彩色列表框控件必须遵循下述步骤。
首先,使用ClassWizard 创建一个CListBox 的派生类并为该类添加下述数据成员。
class CMyListBox ; publilc CListBox
{

private:
COLORREF m_clrFor ; // foreground color
COLORREF m_clrBack ; //background color
Cbrush m_brush ; //background brush

} ;
其次,在类的构造函数中,初始化数据中。
CMyListBox : : CMyListBox ()
{
//Initialize data members .
m_clrFore =RGB (255 , 255 , 0) ; // yellow text
m_clrBack=RGB (0 , 0 , 255) ; // blue background
m_brush . CreateSolidBrush (m _clrBack );
}
最后,使用ClassWizard 处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新的绘画
属性。
HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )
{
pDC—>SetTextColor (m_clrFore);
pDC—>SetBkColor (m_clrBack);
return (HBRUSH) m_brush.GetSafeHandle ()
}
现在,控件可以自己决定如何绘画,与父窗口无关。
eastnofail 2004-12-29
  • 打赏
  • 举报
回复
那位老兄能把完整的代码贴上来啊,我也知道用hdc,但是具体怎么用啊???
guangsan 2004-12-29
  • 打赏
  • 举报
回复
改变按钮颜色,好像用OnCtrlColor最快最省心了
hchinside 2004-12-29
  • 打赏
  • 举报
回复
那就直接用HDC.
eastnofail 2004-12-29
  • 打赏
  • 举报
回复
to crystal521(水晶泪):
因为我要改变一个按钮的颜色,但是我的工程里面不能使用mfc
Mr-Chen 2004-12-29
  • 打赏
  • 举报
回复
hdc = GetDC(GetDlgItem(hwnd,IDC_INSTALL));
hmemdc=CreateCompatibleDC(hdc);
m_hbrush=CreateSolidBrush(RGB(200,0,0));
SelectObject(hmemdc,m_hbrush);
SetBkColor(hmemdc,RGB(200,0,0));
Mr-Chen 2004-12-29
  • 打赏
  • 举报
回复
应该响应以下消息
WM_CTLCOLORBTN:
WM_CTLCOLORLISTBOX:
WM_CTLCOLOREDIT:
WM_CTLCOLORSCROLLBAR:
WM_CTLCOLORSTATIC:
WM_CTLCOLORDLG:
eastnofail 2004-12-29
  • 打赏
  • 举报
回复
to tonyswe(tong) :谢谢你的代码
不过你的代码我也会,但是我不想要有mfc类来实现的
hushuangyan74 2004-12-28
  • 打赏
  • 举报
回复
先得到控件的句柄:用HWND hWnd=GetDlgItem(IDC_CONTROLID);
然后得到控件的设备环境句柄:HDC hDC=GetDC(hWnd);
然后就可以改变控件的属性了(包括颜色了);
产生画刷句柄:HBRUSH,然后用SelectObject();函数的参数要查MSDN,
bobob 2004-12-28
  • 打赏
  • 举报
回复
mfc就是对api的封装
比如CDC的成员函数,CDC::Function1(参数1,参数2)一般就是api函数Function1(hDC,参数1,参数2)
chetian2000 2004-12-28
  • 打赏
  • 举报
回复
用CDC不行吗?
Mr-Chen 2004-12-28
  • 打赏
  • 举报
回复
不用DC改变颜色那你就不要用控件了,直接画一个控件。
不过和用dc有什么区别呢?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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