一个对话框上有多个Edit,加载PNG图片后更新一个edit里的内容时,其它edit的数据会消失,有谁能告诉我这是什么原因造成的?

解决方案 »

  1.   

    附上代码。。更方便解决问题!!更新一个Edit 你用InvalidateRect() 刷新!!
      

  2.   

    BOOL  CMyEditCtrl::m_bIsCreated = FALSE;
    CKeysDlg* CMyEditCtrl::m_keydlg=NULL;
    Image * CMyEditCtrl::m_pImgNormal = NULL;
    Image * CMyEditCtrl::m_pImgFocus = NULL;
    HINSTANCE CMyEditCtrl::m_hInst = NULL;
    int CMyEditCtrl::nRef = 0;CMyEditCtrl::CMyEditCtrl()
    {
    nRef++;
    m_brHollow.CreateStockObject(HOLLOW_BRUSH);
    //LoadImages();
    SetImages();}CMyEditCtrl::~CMyEditCtrl()
    {
    if (--nRef < 1 && m_hInst != NULL)
    FreeLibrary(m_hInst);// 记着要释放
    }
    BEGIN_MESSAGE_MAP(CMyEditCtrl, CEdit)
    //{{AFX_MSG_MAP(CMyEditCtrl)
    ON_WM_CTLCOLOR_REFLECT()
    ON_WM_LBUTTONUP()
    ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
    //}}AFX_MSG_MAP
    ON_WM_ERASEBKGND()
    ON_CONTROL_REFLECT(EN_KILLFOCUS, &CMyEditCtrl::OnEnKillfocus)
    ON_WM_LBUTTONDOWN()
    ON_WM_DESTROY()
    ON_CONTROL_REFLECT(EN_SETFOCUS, &CMyEditCtrl::OnEnSetfocus)
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CMyEditCtrl message handlersHBRUSH CMyEditCtrl::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(244,244,244));
    return m_brHollow;
    }void CMyEditCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    //Invalidate();
    HWND hwnd=::GetFocus();
    int iID=::GetDlgCtrlID(hwnd);
    if(iID==IDC_EDIT1||iID==IDC_EDIT2||iID==IDC_EDIT3||iID==IDC_EDIT4||iID==IDC_EDIT5||iID==IDC_EDIT8||iID==IDC_EDIT14||iID==IDC_EDIT15||iID==IDC_EDIT16||iID==IDC_EDIT17||iID==IDC_EDIT11||iID==IDC_EDIT12||iID==IDC_EDIT13)
    {
    CKeysDlg dlg;
    dlg.SetOwnerEdit(this);
    }
    dlg.DoModal();
    }
    CEdit::OnLButtonUp(nFlags, point);
    }void CMyEditCtrl::OnChange() 
    {
    Invalidate();
    }BOOL CMyEditCtrl::OnEraseBkgnd(CDC* pDC) 
    {
    TRACE(_T("Erase Back\n"));

    pDC = GetDC();
    CDC cMemDC;
    cMemDC.CreateCompatibleDC(pDC); 
    CRect rect;
    GetClientRect(&rect);
    HBITMAP hMemBitmap = CreateCompatibleBitmap(pDC->GetSafeHdc(),
    rect.Width(),rect.Height());
    SelectObject(cMemDC, hMemBitmap);
    Gdiplus::Graphics graphics(cMemDC);
    graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    Point* pdestPoints = NULL;
    Point EditPoints[3] = {Point(rect.left, rect.top),Point(rect.right, rect.top),Point(rect.left, rect.bottom)};
    pdestPoints = EditPoints; if (::GetFocus() == m_hWnd)
    {
    graphics.DrawImage(m_pImgFocus, pdestPoints, 3);
    }
    else
    {
    graphics.DrawImage(m_pImgNormal, pdestPoints, 3);
    } BitBlt(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),
    cMemDC, 0,0,SRCCOPY);
    DeleteObject(hMemBitmap);
    DeleteDC(cMemDC);
    return CEdit::OnEraseBkgnd(pDC);
    //return TRUE; 
    }
    void CMyEditCtrl::PreSubclassWindow()
    {
    // TODO: Add your specialized code here and/or call the base class
    m_font.CreateFont( 20, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, 
    CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS,_T("宋体") );
    this->SetFont(&m_font);
    CEdit::PreSubclassWindow();
    }
    void CMyEditCtrl::OnEnKillfocus()
    {
    // TODO: Add your control notification handler code here Invalidate();
    }
    void CMyEditCtrl::OnLButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default
      CRect rect;
    GetClientRect(&rect);
    CEdit::OnLButtonDown(nFlags, point);
    }void CMyEditCtrl::OnEnSetfocus()
    {
    // TODO: Add your control notification handler code here
    HideCaret();}
    bool CMyEditCtrl::LoadImageFromResource(IN Image* &pImage,IN UINT nResID, IN LPCTSTR lpTyp)
    {
    if (pImage != NULL) 
    {
    return false;
    } HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp); // 查找资源
    if (hRsrc == NULL) 
    {
    return false;
    } HGLOBAL hImgData = ::LoadResource(NULL, hRsrc); // 加载资源
    if (hImgData == NULL)
    {
    ::FreeResource(hImgData);
    return false;
    } LPVOID lpVoid    = ::LockResource(hImgData);// 锁定内存中的指定资源
    LPSTREAM pStream = NULL;
    DWORD dwSize    = ::SizeofResource(m_hInst, hRsrc); //AfxGetResourceHandle()
    HGLOBAL hNew    = ::GlobalAlloc(GHND, dwSize);
    LPBYTE lpByte    = (LPBYTE)::GlobalLock(hNew);
    ::memcpy(lpByte, lpVoid, dwSize);
    ::GlobalUnlock(hNew); // 解除内存中的指定资源 HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);// 从指定内存创建流对象
    if ( ht != S_OK )
    {
    GlobalFree(hNew);
    }
    else
    {
    pImage = Gdiplus::Image::FromStream(pStream); // 加载图片
    GlobalFree(hNew);
    }
    ::FreeResource(hImgData); // 释放资源
    return true;
    }
    void CMyEditCtrl::SetImages()
    {
    LoadImageFromResource(m_pImgNormal, IDR_NOFOCUS_PNG, _T("png"));
    LoadImageFromResource(m_pImgFocus, IDR_FOCUS_PNG, _T("png"));

    }
      

  3.   

    CMyEdit 是一个类, 它有很多实例, 你程序中 区分 各个 实例了 吗 ;
    GetDlgCtlID();
      

  4.   

    我是直接继承了CMyedit,然后对编辑框添加变量!
      

  5.   

    每个Edit关联对应的一个CMyEditCtrl实例化的变量
    操作的时候只操作相应的控件变量