一般在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函数
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();
}