Visual C ++

时间:2015-06-11 15:57:34

标签: c++ visual-c++ visual-studio-2013 bitmap dialog

我正在尝试将位图图像(.bmp)添加到visual studio c ++中的主对话框的背景中。我创建了一个关闭按钮,通常效果很好,但在放置背景图像后,当我按下关闭按钮时,我收到此错误:

  

调试断言失败。

     
    
      

文件:c:\ program files(x86)\ microsoft visual       studio12.0 \ vc \ atlmfc \ include \ atlwin.h

    
         

行:3604表达式:m_hWnd == 0

         
      

有关程序如何导致断言失败的信息,       请参阅Visual C ++ documentmantation断言。

    
  
     

中止重试忽略

用于加载位图图像定义的类。 部首:

#if !defined(AFX_PICTUREWINDOW_H__44323373_9E89_11D3_A393_00C0DFC59237__INCLUDED_)
#define AFX_PICTUREWINDOW_H__44323373_9E89_11D3_A393_00C0DFC59237__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <atlbase.h>
#include <atlwin.h>

class CPictureWindow : public CWindowImpl<CPictureWindow>
{
public:
    typedef enum HandlerTypeEnum
    {
        ClientPaint = WM_PAINT,
        BackGroundPaint = WM_ERASEBKGND
    } HandlerTypeEnum;

    CPictureWindow()
    {
        m_nMessageHandler = ClientPaint;
    };
    virtual ~CPictureWindow()
    {
    };

    BEGIN_MSG_MAP(CPictureWindow)
        MESSAGE_HANDLER(WM_PAINT, OnPaint)
        MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkGnd)
    END_MSG_MAP()

    virtual BOOL Load(LPCTSTR szFileName)
    {
        BOOL bResult = FALSE;
        Close();
        if (szFileName)
        {
            OFSTRUCT of;
            HANDLE hFile = NULL;;
            if ((hFile = (HANDLE)OpenFile((LPCSTR)szFileName, &of, OF_READ | OF_SHARE_COMPAT)) != (HANDLE)HFILE_ERROR)
            {
                DWORD dwHighWord = NULL, dwSizeLow = GetFileSize(hFile, &dwHighWord);
                DWORD dwFileSize = dwSizeLow;
                HRESULT hResult = NULL;
                if (HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize))
                if (void* pvData = GlobalLock(hGlobal))
                {
                    DWORD dwReadBytes = NULL;
                    BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwReadBytes, NULL);
                    GlobalUnlock(hGlobal);
                    if (bRead)
                    {
                        CComPtr<IStream> spStream;
                        _ASSERTE(dwFileSize == dwReadBytes);
                        if (SUCCEEDED(CreateStreamOnHGlobal(hGlobal, TRUE, &spStream)))
                        if (SUCCEEDED(hResult = OleLoadPicture(spStream, 0, FALSE, IID_IPicture, (void**)&m_spPicture)))
                            bResult = TRUE;
                    }
                }
                CloseHandle(hFile);
            }
        }
        Invalidate();
        return bResult;
    }

    HandlerTypeEnum m_nMessageHandler;

protected:

    inline virtual BOOL IsHandlerMessage(UINT uMsg)
    {
        return m_nMessageHandler == (HandlerTypeEnum)uMsg;
    }

    void PutPicture(IPicture* pPicture, HDC hDC, RECT rPicture)
    {
        OLE_XSIZE_HIMETRIC nWidth = NULL; OLE_YSIZE_HIMETRIC nHeight = NULL;
        pPicture->get_Width(&nWidth); pPicture->get_Height(&nHeight);
        pPicture->Render(hDC, rPicture.left, rPicture.top, rPicture.right - rPicture.left, rPicture.bottom - rPicture.top, 0, nHeight, nWidth, -nHeight, NULL);
    };

    LRESULT OnEraseBkGnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        if (IsHandlerMessage(uMsg))
        {
            if (m_spPicture)
            {
                BeginPaint(NULL);
                RECT r; GetClientRect(&r);
                HDC hDC = GetDC();
                HWND hWndChild = GetWindow(GW_CHILD);
                while (::IsWindow(hWndChild))
                {
                    if (::IsWindowVisible(hWndChild))
                    {
                        RECT rChild; ::GetWindowRect(hWndChild, &rChild);
                        ScreenToClient(&rChild);
                        ExcludeClipRect(hDC, rChild.left, rChild.top, rChild.right, rChild.bottom);
                    }
                    hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
                }
                PutPicture(m_spPicture, hDC, r);
                ReleaseDC(hDC);
                EndPaint(NULL);
                return TRUE;
            }
        }
        bHandled = FALSE;
        return FALSE;
    };

    LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        if (IsHandlerMessage(uMsg))
        {
            if (m_spPicture)
            {
                BeginPaint(NULL);
                RECT r; GetClientRect(&r);
                HDC hDC = GetDC();
                PutPicture(m_spPicture, hDC, r);
                ReleaseDC(hDC);
                EndPaint(NULL);
            }
        }
        bHandled = FALSE;
        return NULL;
    };

    void Close()
    {
        m_spPicture = NULL;
    }

    //Attributes
    CComPtr<IPicture> m_spPicture;
};

#endif 

并在.Cpp文件的DoDataExchange中:

objPictureWindow.SubclassWindow(m_hWnd);
    objPictureWindow.m_nMessageHandler = CPictureWindow::BackGroundPaint;
    objPictureWindow.Load((LPCTSTR)"D:\\bitmap2.bmp");

此位图的大小约为2Mb。但是我将其调整为500Kb,但在按下关闭按钮关闭此对话框后又出现了同样的错误。

通过遵循此错误,编译器向我显示以下行:

template <class TBase, class TWinTraits>
BOOL CWindowImplBaseT< TBase, TWinTraits >::SubclassWindow(_In_ HWND hWnd)
{
    ATLASSUME(m_hWnd == NULL);
    ATLASSERT(::IsWindow(hWnd));

0 个答案:

没有答案