网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
VC++创建个性的对话框之MFC篇
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
(pDC);
}

m_brBkgnd是个CBrush,在此之前已经初始化过了,关键代码是最后返回TRUE,而不是默认的调用基类函数,返回TRUE意在告诉Windows:“我已经画过背景了,你不要再画了”。现在来看看运行的效果:

图.3 重画背景的效果

使用位图作为对话框的背景也不难,就是在整个客户区画一个位图背景,

第二步:改变控件的颜色

看起来不如刚才效果好,控件文字的颜色和背景色都没有改变,这是因为我们还没有处理WM_CTLCOLOR消息。WM_CTLCOLOR是Windows的控件向其父窗口发送最频繁的通知消息之一,例如,许多控件发送WM_CTLCOLOR消息给父窗口,让父窗口提供画刷来画自己的背景。MFC的窗口类对这个通知消息特殊对待,如果父窗口没有处理这个通知消息,MFC的窗口类就根据WM_CTLCOLOR通知消息的来源将这个WM_CTLCOLOR消息发送回控件,让控件自己处理,这就是所谓的“消息反射”,不仅是WM_CTLCOLOR,MFC对很多通知消息都做了反射,不过我们今天的例子没有使用“消息反射”,我们在控件的父窗口,也就是对话框窗口处理这个通知消息。还有一点需要说明的是,WM_CTLCOLOR消息是16位的Windows平台的消息,在32位的Windows平台上取而代之的是一系列更明确的通知消息:

WM_CTLCOLORBTN 按钮控件
WM_CTLCOLORDLG 对话框
WM_CTLCOLOREDIT 编辑控件
WM_CTLCOLORLISTBOX 列表框控件
WM_CTLCOLORSCROLLBAR 滚动条控件
WM_CTLCOLORSTATIC 静态文本控件

MFC为了兼容性考虑,仍旧使用OnCtlColor响应这些消息,但是通过参数nCtlColor来具体的区分他们。在这个函数中,我们可以通过改变pDC参数的属性来改变控件的绘制,并返回相应的画刷句柄给控件,控件使用这个画刷画自己的背景。下面是我们修改后的OnCtlColor函数:

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

pDC->SetTextColor(m_clrText);
pDC->SetBkMode(TRANSPARENT);

return (HBRUSH)m_brBkgnd; //因为CBrush类实现了HBRUSH类型转换操作符

// return hbr;
}

图.4 就是这段代码的效果,在这里我们不分“青红皂白”,向所有的控件返回我们自己的画刷,看起来不错,Edit控件的文字颜色也改了,但是好像多行Edit控件有了麻烦,看来需要对多行Edit控件特殊对待。

图.4 重载OnCtlColor之后的效果

对于多行Edit控件特殊处理,如下所示,上面的问题解决了:

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

if(pWnd->GetDlgCtrlID() == IDC_EDIT_MULTI_LINE) //IDC_EDIT_MULTI_LINE是多行Edir控件的ID
{
pDC->SetTextColor(m_clrText);
return hbr;
}
else
{
pDC->SetTextColor(m_clrText);
pDC->SetBkMode(TRANSPARENT);

return (HBRUSH)m_brBkgnd;
}
}

上面的代码解决了IDC_EDIT_MULTI_LINE的问题,但是对每个多行Edit控件都要判断ID,下面的方法可以一劳永逸地解决多行编辑控件的问题:

HBRUSH CCustDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
TCHAR szClassName[64];

::GetClassName(pWnd->GetSafeHwnd(),szClassName,64);
if(lstrcmpi(szClassName,_T("Edit")) == 0) //是Edit 控件
{
DWORD dwStyle = pWnd->GetStyle();
if((dwStyle & ES_MULTILINE) == ES_MULTILINE) //多行edit控件
{
pDC->SetTextColor(m_clrText);
return hbr;
}
else
{
pDC->SetTextColor(m_clrText);
pDC->SetBkMode(TRANSPARENT);

return (HBRUSH)m_brBkgnd;
}
}
else //不是编辑控件
  • 上一篇资讯: 在VC++中操作OFFICE(Word)
  • 下一篇资讯: 使用MFC的数组类
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号