none
MFC 中 gdi 绘图后,缩小再还原窗口,图片消失 RRS feed

  • 问题

  •  求助,在mfc的一个 group box内

    1,定义一个按钮事件,点击后在 group box内绘图(gdi+ Graphics drawimage ),绘制成功

    2,缩小对话框,再放大对话框,图片消失

    3,在 onpaint中重新绘制,或者使用InvalidateRect( &client, 1),或者在SC_RESTORE中绘制,重复步骤2,仍然会出现这个问题






    • 已编辑 阿D 2015年4月8日 2:44
    2015年3月27日 3:42

答案

  • 谢谢,已经解决了,原因是我在初始化gdi前调用了绘图(逻辑控制错误)。但是遇到一个新问题。

    1,在ToolDialog中调用gdi初始化后,再在当前ToolDialog中绘图,没有问题

    2,在ToolApp::InitInstance()中调用gdi初始化后,再在ToolDialog中绘图,显示的图片在ToolDialog窗口外面了

    3,在ToolDialog中调用gdi初始化后,异步启动ShowDialog, 在ShowDialog中绘图,无法显示图片(gdi draw显示ok),重新再ShowDialog中初始化gdi,仍然无法显示图片

    4,换用COM组件,可以在ToolDialog绘图,但是在ToolDialog中异步启动的ShowDialog中,也无法绘图,下面是com的绘图代码

    CString msg;
    std::string& image_file = m_video_info->m_screenshot;
    if (-1 != _access(image_file.c_str(), 0))
    {
    IPicture *pPic;
    IStream *pStm;
    CFileStatus fstatus;
    CFile file;
    HDC *pDC;
    CDC *dc;
    dc = GetDlgItem(IDC_STATIC_CUT)->GetDC();
    pDC = &(dc->m_hDC);

    LONG cb;
    if (file.Open(image_file.c_str(), CFile::modeRead) && file.GetStatus(image_file.c_str(), fstatus) && ((cb = (LONG)fstatus.m_size) != -1))
    {
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
    LPVOID pvData = NULL;
    if (hGlobal != NULL)
    {
    if ((pvData = GlobalLock(hGlobal)) != NULL)
    {
    //file.ReadHuge(pvData, cb);
    file.Read(pvData, cb);
    GlobalUnlock(hGlobal);
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
    if (SUCCEEDED(OleLoadPicture(pStm, (LONG)fstatus.m_size, TRUE, IID_IPicture, (LPVOID*)&pPic)))
    {
    OLE_XSIZE_HIMETRIC hmWidth;
    OLE_YSIZE_HIMETRIC hmHeight;
    pPic->get_Width(&hmWidth);
    pPic->get_Height(&hmHeight);
    double fX, fY;
    CRect rect;
    GetDlgItem(IDC_STATIC_CUT)->GetClientRect(rect);
    fX=rect.Width();
    fY=rect.Height();

    //fX =(double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
    //fY =(double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);


    if (FAILED(pPic->Render(*pDC, 0, 0, (DWORD)fX, (DWORD)fY, 0, hmHeight, hmWidth, -hmHeight, NULL)))
    {
    msg.Format(_T("显示图像 [%s] 失败"), image_file.c_str());
    AfxMessageBox(msg);
    }
    pPic->Release();
    }
    else
    {
    msg.Format(_T("加载图像 [%s] 失败"), image_file.c_str());
    AfxMessageBox(msg);
    }
    }
    GlobalFree(hGlobal);
    }
    }
    else
    {
    msg.Format(_T("打开图像 [%s] 失败"), image_file.c_str());
    AfxMessageBox(msg);
    }
    ReleaseDC(dc);
    }
    else
    {
    msg.Format(_T("找不到 [%s] 文件"), image_file.c_str());
    AfxMessageBox(msg);
    }



    • 已编辑 阿D 2015年4月8日 9:05
    • 已标记为答案 Shu 2017 2015年4月9日 10:05
    2015年4月8日 2:36

全部回复

  • 请给点代码看看, 我做了一个小测试直接子啊OnPaint函数里往Group box里绘图是没有问题的,最小化后再最大化后,绘的图仍然显示。 请让我们看看那你怎么绘图的代码,还有按钮事件怎么处理的。

    再问问你有试过用picture control 吗。下面是我直接在group box里绘图的代码,你可以看看。

    void CMFCGroupBoxTestDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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);
    	}
    	else
    	{
    		
    			HWND hgroup = GetDlgItem(IDC_GROUPBOX)->m_hWnd;
    			HDC hdc = ::GetDC(hgroup);
    			
    			Gdiplus::Graphics graphics(hdc);
    			Gdiplus::Pen pen(Gdiplus::Color(255, 0, 0, 255));
    			Gdiplus::SolidBrush brush(Gdiplus::Color(255, 0, 0, 255));
    			Gdiplus::FontFamily fontfm(L"宋体");
    			Gdiplus::Font font(&fontfm, 24, Gdiplus::FontStyleRegular, Gdiplus::UnitPixel);
    			CRect rt;
    			::GetClientRect(hgroup, &rt);
    			Gdiplus::PointF pointF(rt.Width() / 2, rt.Height() / 2);
    			graphics.DrawString(L"GDI+ Test", -1, &font, pointF, &brush);
    			graphics.ReleaseHDC(hdc);
    			
    		
    		CDialogEx::OnPaint();
    	}
    }



    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年3月28日 9:11
  • 一般的,如果您是想在Group Box中绘图的话,那么您应该重写CStatic类,在OnPaint响应函数中绘图。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2015年3月30日 3:28
    版主
  • 谢谢,已经解决了,原因是我在初始化gdi前调用了绘图(逻辑控制错误)。但是遇到一个新问题。

    1,在ToolDialog中调用gdi初始化后,再在当前ToolDialog中绘图,没有问题

    2,在ToolApp::InitInstance()中调用gdi初始化后,再在ToolDialog中绘图,显示的图片在ToolDialog窗口外面了

    3,在ToolDialog中调用gdi初始化后,异步启动ShowDialog, 在ShowDialog中绘图,无法显示图片(gdi draw显示ok),重新再ShowDialog中初始化gdi,仍然无法显示图片

    4,换用COM组件,可以在ToolDialog绘图,但是在ToolDialog中异步启动的ShowDialog中,也无法绘图,下面是com的绘图代码

    CString msg;
    std::string& image_file = m_video_info->m_screenshot;
    if (-1 != _access(image_file.c_str(), 0))
    {
    IPicture *pPic;
    IStream *pStm;
    CFileStatus fstatus;
    CFile file;
    HDC *pDC;
    CDC *dc;
    dc = GetDlgItem(IDC_STATIC_CUT)->GetDC();
    pDC = &(dc->m_hDC);

    LONG cb;
    if (file.Open(image_file.c_str(), CFile::modeRead) && file.GetStatus(image_file.c_str(), fstatus) && ((cb = (LONG)fstatus.m_size) != -1))
    {
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
    LPVOID pvData = NULL;
    if (hGlobal != NULL)
    {
    if ((pvData = GlobalLock(hGlobal)) != NULL)
    {
    //file.ReadHuge(pvData, cb);
    file.Read(pvData, cb);
    GlobalUnlock(hGlobal);
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
    if (SUCCEEDED(OleLoadPicture(pStm, (LONG)fstatus.m_size, TRUE, IID_IPicture, (LPVOID*)&pPic)))
    {
    OLE_XSIZE_HIMETRIC hmWidth;
    OLE_YSIZE_HIMETRIC hmHeight;
    pPic->get_Width(&hmWidth);
    pPic->get_Height(&hmHeight);
    double fX, fY;
    CRect rect;
    GetDlgItem(IDC_STATIC_CUT)->GetClientRect(rect);
    fX=rect.Width();
    fY=rect.Height();

    //fX =(double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
    //fY =(double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);


    if (FAILED(pPic->Render(*pDC, 0, 0, (DWORD)fX, (DWORD)fY, 0, hmHeight, hmWidth, -hmHeight, NULL)))
    {
    msg.Format(_T("显示图像 [%s] 失败"), image_file.c_str());
    AfxMessageBox(msg);
    }
    pPic->Release();
    }
    else
    {
    msg.Format(_T("加载图像 [%s] 失败"), image_file.c_str());
    AfxMessageBox(msg);
    }
    }
    GlobalFree(hGlobal);
    }
    }
    else
    {
    msg.Format(_T("打开图像 [%s] 失败"), image_file.c_str());
    AfxMessageBox(msg);
    }
    ReleaseDC(dc);
    }
    else
    {
    msg.Format(_T("找不到 [%s] 文件"), image_file.c_str());
    AfxMessageBox(msg);
    }



    • 已编辑 阿D 2015年4月8日 9:05
    • 已标记为答案 Shu 2017 2015年4月9日 10:05
    2015年4月8日 2:36
  • 新问题请重新开新帖,我将关掉这个帖子,因为初始的问题已解决。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年4月9日 10:05