2.几个处理函数的理解和比较:(OnInitDialog,OnPaint等)以及对话框生成和关闭。

本文介绍了MFC中OnInitDialog用于初始化对话框,OnPaint处理窗口重绘,OnCtlColor则涉及控件颜色定制。理解这些函数的工作原理对于对话框的动态显示和定制至关重要。通过链接资源深入探讨了OnPaint和OnCtlColor的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般在OnInitDialog中进行初始化操作。

一般情况下,窗口局部被遮挡后又切到前台时,被遮挡的部分要重绘,onpaint此时被触发,用户可以在发生重绘时绘制自己的图形,
而且此事件每个可呈现的控件都有。

想永久显示那肯定是写到OnPaint中

如果你想即时显示,那就什么时候想显示什么时候画一下(只要能获得当前dc进行绘制就可以显示),过后update掉,界面一刷新就没了。

关于OnPaint函数的工作原理:https://blog.youkuaiyun.com/foreverhuylee/article/details/21889025

OnPaint()函数的作用原理https://www.cnblogs.com/BeyondTechnology/archive/2011/03/25/1995942.html

OnCtlColor函数


当要画出一个子控件时,框架就调用这个成员函数。多数控件将这个消息发送到它们的父窗口(通常是一个对话框),为使用正确的颜色画出控件而准备 pDC
要改变文本的颜色,使用要求的红、绿、蓝色值( RGB)调用 SetTextColor成员函数。
要改变单行编辑控件的背景颜色,在CTLCOLOR_EDIT和CTLCOLOR_MSGBOX消息代码中设置刷子句柄,并在响应CTLCOLOR_EDIT的代码中调用 CDC:: SetBkColor函数。
不会为下拉 组合框中的 列表框调用 OnCtlColor函数,因为下拉列表框实际上是组合框的子窗口,而不是窗口的子窗口。要改变下拉列表框的颜色,创建一个 CcomboBox,在 重载OnCtlColor中的nCtlColor参数中检查CTLCOLOR_LISTBOX。在这个处理函数中,为设置文本的背景必须使用SetBkColor成员函数。

OnCtlColor函数的用法:https://blog.youkuaiyun.com/foreverhuylee/article/details/21943483

MFC 消息之WM_CTLCOLOR和OnCtlColor消息的使用方法总结:https://blog.youkuaiyun.com/createdsign/article/details/18984145


PreTranslateMessage:百度百科的讲解。

PreSubclassWindow的作用:https://blog.youkuaiyun.com/milanleon/article/details/22794441


以下内容整理自博客,因为整理的杂乱,忘记所属博主地址了。请见谅


关于控件重绘函数/消息OnPaint,OnDraw,OnDrawItem,DrawItem的区别

我们一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。

 

1.     OnPaint: WM_PAINT

OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。

消息函数,接受到WM_PAINT消息时,首先调用的是onpaint(),onpaint()再调用ondraw()

OnPaint()->OnDraw();

 

2.OnDraw:虚函数,需要重载

OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC成的程序代码时,在视图类只有OnDraw没有OnPaint的原因。

OnDraw()是CView类的成员,它不响应消息,不过它通过OnPaint()来调用OnDraw()。OnDraw()是虚函数,需要被重载。

 

3.OnDrawItem:  WM_DRAWITEM

子控件有自画属性且控件需重画时,父窗口会调用该函数

在具有Owner Draw属性的控件需要重画的时候,就会激发OnDrawItem

当自画子按钮控件、组合框控件、列表框控件或菜单的可视部分需要被画出时调用这个函数

OnDrawItem()->DrawItem();

 

4.DrawItem: 虚函数,需要重载

如果使用DrawItem来自画控件,需要给控件加上自画样式,然后

重载该控件类的自画函数(DrawItem)函数,如果该控件的父窗口提供了ON_WM_DRAWITEM

消息映射宏,并重载了OnDrawItem函数,则重画消息会由父窗口处理,父窗口调用基类的OnDrawItem来调用派生的子控件的DrawItem函数.

 

确保消息映射中不能有:ON_WM_PAINT(也可以直接在OnPaint中绘制)、‘

ON_WM_DRAWITEM 消息,否则DrawItem函数不会被调用

DrawItem而非OnDrawItem。OnDrawItem是ON_WM_DRAWITEM消息的处理函数,

是处理子控件发送过来的自绘消息的。

 

比较:

OnPaint和OnDrawItem

不在一个范畴内,他是WM_PAINT的响应函数,凡是基于CWnd的类都有OnPaint事件发生,就是说凡是窗口都有WM_PAINT事件发生。

OnDrawItem和DrawItem

OnDrawItem()是CWnd类的成员,负责响应WM_DRAWITEM消息。当子控件有自绘属性并且需要重绘它时,父窗口就调用OnDrawItem()。

 

DrawItem()是虚函数,需要在子控件类重载它。它是通过父窗口调用OnDrawItem()函数来调用子控件的DrawItem()。

OnPaint和OnDrawItem

OnPaint()和OnDrawItem()的范畴不同,OnPaint()可以画整个窗口,而OnDrawItem()只能画窗口中的子控件。


对话框的生成:

CRankDlg m_rank;

m_rank.DoModal();

当dlg.DoModal()后,显示一个模态对话框,此时DoModal()函数并不返回,直到用户关闭此对话框时,DoModal才返回。如果用户点击了确定按钮,那么DoModal()函数就返回IDOK。IDOK是一个宏。

确定按钮代码:

void CSettingDlg::OnBnClickedButtonOk()
{
// TODO: 在此添加控件通知处理程序代码
CDialog::OnOK();

}

取消按钮代码:

void CSettingDlg::OnBnClickedCancel()
{
CDialogEx::OnCancel();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值