MFC C++初学,一个工程下有2个类,都有ONPAINT函数,那么在对话窗中绘制矩形应该用哪个类的ONPAINT函数?
ONPAINT函数到底是在什么时候响应的?如果几个类都有ONPAINT,那么在对话框中相应矩形应该是用哪个类的ONPAINT?voidCMyDlgOpenGLDlg::O...
ONPAINT函数到底是在什么时候响应的?如果几个类都有ONPAINT,那么在对话框中相应矩形应该是用哪个类的ONPAINT?
void CMyDlgOpenGLDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
*************************************************
void COpenGL::OnPaint()
{
//CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
//调用OpenGL绘图函数进行图形绘制
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存
s += 0.005;
if (s>1.0)
s = 0.1;
step = step + 1.0;
if (step > 360.0)
step = step - 360.0;
glPushMatrix();
glScalef(s, s, s);//放大缩小
glRotatef(step, 0.0, 1.0, 0.0);//旋转各个角度
glRotatef(step, 0.0, 0.0, 1.0);
glRotatef(step, 1.0, 0.0, 0.0);
DrawColorBox();
auxWireTeapot(.6); // 绘制茶壶
glPopMatrix();
glFlush();
SwapBuffers(hdc);
// Do not call CWnd::OnPaint() for painting messages
}
****************************************************
比如说这两个同一个工程下的类的ONPAINT,如果我要画矩形究竟是哪个在类的ONPAINT上写代码,还有
BOOL CMyDlgOpenGLDlg::OnInitDialog()这个函数也可以画矩形,究竟是怎么回事?
{
CDialogEx::OnInitDialog();
.....
// TODO: 在此添加额外的初始化代码
CRect rect(7, 7, 600, 600); //定义OpenGL 绘图窗口的矩形大小
//创建COpenGL类对象
m_pDisplay->Create(NULL, //缺省的窗口
......return true;}谢谢阿 展开
void CMyDlgOpenGLDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
*************************************************
void COpenGL::OnPaint()
{
//CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
//调用OpenGL绘图函数进行图形绘制
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存
s += 0.005;
if (s>1.0)
s = 0.1;
step = step + 1.0;
if (step > 360.0)
step = step - 360.0;
glPushMatrix();
glScalef(s, s, s);//放大缩小
glRotatef(step, 0.0, 1.0, 0.0);//旋转各个角度
glRotatef(step, 0.0, 0.0, 1.0);
glRotatef(step, 1.0, 0.0, 0.0);
DrawColorBox();
auxWireTeapot(.6); // 绘制茶壶
glPopMatrix();
glFlush();
SwapBuffers(hdc);
// Do not call CWnd::OnPaint() for painting messages
}
****************************************************
比如说这两个同一个工程下的类的ONPAINT,如果我要画矩形究竟是哪个在类的ONPAINT上写代码,还有
BOOL CMyDlgOpenGLDlg::OnInitDialog()这个函数也可以画矩形,究竟是怎么回事?
{
CDialogEx::OnInitDialog();
.....
// TODO: 在此添加额外的初始化代码
CRect rect(7, 7, 600, 600); //定义OpenGL 绘图窗口的矩形大小
//创建COpenGL类对象
m_pDisplay->Create(NULL, //缺省的窗口
......return true;}谢谢阿 展开
1个回答
展开全部
onpaint 就是系统认为需要重新绘制该图形时调用。例如某个窗口从被遮挡到不被遮挡,那么这个位置就得重绘的时候就会调用onpaint。调用的可能性有很多,例如最大最小化等。有多个onpaint就可以理解为多个地方会重绘,两者可以是相互独立互不影响的。你想在哪一个地方重绘就在哪一个地方写。至于在初始化画是可以的,不过你尝试让他被遮挡(例如其他窗口),或者最小化再还原,就会发现画的东西没了。
追问
我的问题是,为什么在对话框类的ONPAINT是空的,但是在自定义类里写的ONPAINT却能在对话框中显示
追答
“对话框的onpaint为空”这句不能理解。函数体完整啊
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询