MFC中如何使用OnPaint保持窗口中的内容在移动时不变
我遇到的问题是这样的:我要用CDC类在对话框中不断地绘制一些图形,并在过程中保持对话框中的内容在移动时不变。当前对话框中的图形是不确定的,因此我想有没有什么拷屏函数能将当...
我遇到的问题是这样的:
我要用CDC类在对话框中不断地绘制一些图形,并在过程中保持对话框中的内容在移动时不变。
当前对话框中的图形是不确定的,因此我想有没有什么拷屏函数能将当前对话框的内容整个获取,并用OnPaint维护显示?
第一次用MFC,一些术语不了解,问题描述得通俗了些。
希望各位高手能给出大致的写法,本人第一次接触MFC。
void CDisplayDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
m_DispManager.Draw();
}
else
{
是不是在这里进行一些操作???
CDialog::OnPaint();
}
}
谢谢~~
请问“小趴皮”,双缓冲有什么需要注意的吗?我按照
http://hi.baidu.com/krispan/blog/item/44c59ee9d339153ab90e2d70.html
写的。但是对话框始终保持底色不变。这是为什么?
我的意思是说无论我绘制什么都没有显示,对话框始终是空的。 展开
我要用CDC类在对话框中不断地绘制一些图形,并在过程中保持对话框中的内容在移动时不变。
当前对话框中的图形是不确定的,因此我想有没有什么拷屏函数能将当前对话框的内容整个获取,并用OnPaint维护显示?
第一次用MFC,一些术语不了解,问题描述得通俗了些。
希望各位高手能给出大致的写法,本人第一次接触MFC。
void CDisplayDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
m_DispManager.Draw();
}
else
{
是不是在这里进行一些操作???
CDialog::OnPaint();
}
}
谢谢~~
请问“小趴皮”,双缓冲有什么需要注意的吗?我按照
http://hi.baidu.com/krispan/blog/item/44c59ee9d339153ab90e2d70.html
写的。但是对话框始终保持底色不变。这是为什么?
我的意思是说无论我绘制什么都没有显示,对话框始终是空的。 展开
展开全部
使用双缓冲绘图,将你的图形画到一个内存DC中,然后再贴到对话框DC中就可以了。
请上网搜一下双缓冲绘图的相关内容。
改变对话框颜色,使用其他颜色的画刷填充背景就行了啊。
用FillRect函数
你看的哪个列子有错误:
去掉DrawSomething()函数中的
Invalidate();
OnPaint是重绘函数,Invalidate()是发送重绘消息,在重绘函数里再发送重绘消息,下面的dc.BitBlt...就不执行了,相当于没有把内存DC的内容贴到对话框DC中,所以就什么也没有了。
如果你要在其他操作时绘图,比如在按下一个按钮时,而不是在OnPaint函数里时,就要加上Invalidate()让窗口重绘。
请上网搜一下双缓冲绘图的相关内容。
改变对话框颜色,使用其他颜色的画刷填充背景就行了啊。
用FillRect函数
你看的哪个列子有错误:
去掉DrawSomething()函数中的
Invalidate();
OnPaint是重绘函数,Invalidate()是发送重绘消息,在重绘函数里再发送重绘消息,下面的dc.BitBlt...就不执行了,相当于没有把内存DC的内容贴到对话框DC中,所以就什么也没有了。
如果你要在其他操作时绘图,比如在按下一个按钮时,而不是在OnPaint函数里时,就要加上Invalidate()让窗口重绘。
展开全部
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
m_DispManager.Draw();
}
else
{
是不是在这里进行一些操作???
CDialog::OnPaint();
}
全删了后直接在里面用
CPaintDC dc(this);
然后绘制
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
m_DispManager.Draw();
}
else
{
是不是在这里进行一些操作???
CDialog::OnPaint();
}
全删了后直接在里面用
CPaintDC dc(this);
然后绘制
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这个问题跟和OnPaint无关,而是你应该把那些要变的变量放到头文件去作为全局变量.
这样OnPaint每次才会画出你想要的效果来.否则你要是定义局部变量每次绘制都一样的.
这样OnPaint每次才会画出你想要的效果来.否则你要是定义局部变量每次绘制都一样的.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
小趴皮 现在厉害了啊 ↖(^ω^)↗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把你的自定义函数里面的坐标换成相对窗口坐标看看,我记得有个全局函数是可以直接转换坐标的。找找看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询