以前也问个,但没有满意答案我用的是 vs2008 新建一个CDialog project 然后在OnPaint里面画一张图片(Bmp Jpeg Png),做为程序客户区的背景程序界面大小为 600*750,有兴趣的可以试下已经使用了双缓冲了,请不要直接回答使用双缓冲,如果你使用双缓冲解决了此问题,可以把你的代码分享下吗
然后程序运行 用别的程序,在我的程序界面上面晃动的时候,我的程序界面会花掉如果在OnPaint里面我用 GetDC 得到的cdc去画图,可以解决上面的问题但是新问题出来了..所有控件不能正常显示,鼠标放在控件区域,才显示,移开又看不到了.相关代码如下 CPaintDC dc(this);
CDC* pDC=GetDC();
Graphics g(dc.m_hDC);//用这个,就出现我说的,程序界面花掉
Graphics g(pDC->m_hDC);//用这个呢,就出现控件不能正常显示
g.DrawImage(m_bkJpeg,0,m_Pic_top.GetImageSize().cy+m_Pic_Button.GetImageSize().cy);
ReleaseDC(pDC);
然后程序运行 用别的程序,在我的程序界面上面晃动的时候,我的程序界面会花掉如果在OnPaint里面我用 GetDC 得到的cdc去画图,可以解决上面的问题但是新问题出来了..所有控件不能正常显示,鼠标放在控件区域,才显示,移开又看不到了.相关代码如下 CPaintDC dc(this);
CDC* pDC=GetDC();
Graphics g(dc.m_hDC);//用这个,就出现我说的,程序界面花掉
Graphics g(pDC->m_hDC);//用这个呢,就出现控件不能正常显示
g.DrawImage(m_bkJpeg,0,m_Pic_top.GetImageSize().cy+m_Pic_Button.GetImageSize().cy);
ReleaseDC(pDC);
class CTestDlg : public CDialog
{
// 构造
public:
CTestDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据
enum { IDD = IDD_TEST_DIALOG }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
CBitmap m_bmpBack; // 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};void CTestDlg::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
{
CPaintDC dc(this);
CDC MemDC;
BITMAP bm;
CRect rect; MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&m_bmpBack); // m_bmpBack在OnInitDialog时Load。
GetClientRect(&rect);
m_bmpBack.GetBitmap(&bm);
dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), &MemDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
MemDC.DeleteDC();
}
}BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)
{
return TRUE; // 防止闪烁。
}新建的工程,没有动任何其它代码。测试通过,没有任何问题(包括闪烁、花掉、控件被遮盖之类)。
这样的绘图建议你在要进行绘图的区域放一个STATIC,
再从CSTATIC类继承一个新类,在这个新类中的ONPAINT进行绘图,
应该会好一些。
比如:OnPaint时无效区域是{a,b,c,d},那么你应该把BMP的{a,b,c,d}画到Dialog的{a,b,c,d}上去
BOOL CdddsdsdswDlg::OnEraseBkgnd(CDC* pDC)
{
// CDialog::OnEraseBkgnd(pDC); // TODO: 在此添加消息处理程序代码和/或调用默认值
RECT rc;
GetClientRect(&rc); pDC->FillSolidRect(&rc, RGB(200, 210, 180)); return TRUE;
}