我想做一个文本框,或者图片框里读入一张图片,有一个路径选择按钮,一个路径编辑框。

解决方案 »

  1.   

    BmpProgCtrl.cpp:
    CBmpProgCtrl::CBmpProgCtrl()
    {
    m_nLower = 1;
    m_nUpper = 100;
    m_nStep = 1;
    m_nPos = 0;
    pDCBack = new CDC;
    bmpBack.LoadBitmap(IDB_BACK);
    }CBmpProgCtrl::~CBmpProgCtrl()
    {
    delete pDCBack;
    }BEGIN_MESSAGE_MAP(CBmpProgCtrl, CStatic)
    //{{AFX_MSG_MAP(CBmpProgCtrl)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CBmpProgCtrl メッセージ ハンドラvoid CBmpProgCtrl::OnPaint() 
    {
    m_length = (float)m_nPos/(m_nUpper-m_nLower);
    CPaintDC dc(this);  // 描画用のデバイス コンテキスト

    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
    GetClientRect(&m_rect);
    pDCBack->CreateCompatibleDC(&dc);
    bmpBack.GetBitmap(&bmback);
    pDCBack->SelectObject(bmpBack);
    dc.StretchBlt(0,0,m_rect.Width(),m_rect.Height(),pDCBack,0,0,bmback.bmWidth,bmback.bmHeight,SRCCOPY);
    pDCBack->DeleteDC();
    // 描画用メッセージとして CStatic::OnPaint() を呼び出してはいけません
    }///
    可以直接读取图片。void CNyuRyokuDlg::OnInputFileBtn() 
    {
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    static char BASED_CODE szFilter[]="All Files(*.*)|*.*||";
    //
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY 
    | OFN_OVERWRITEPROMPT,szFilter,NULL);
    if(dlg.DoModal() == IDOK)
    {
    //
    CFile file;
    file.Open(dlg.GetPathName(),CFile::modeRead);
    CEdit * pEdit = (CEdit*)GetDlgItem(IDC_INPUT_PATH_EDT);
    pEdit->SetWindowText(file.GetFilePath());
    file.Close();
    }
    }
    //可以得到打开文件的路径。但是怎么用按钮单击事件打开图片呢?
      

  2.   

    用OnDraw(),还是OnPaint()呢?请提示一下。谢谢?
      

  3.   

    不是,是我自己程序里面的东西,非常急。连着日文都出来了。赫赫。
    我有两个方案,1:
    用picturebox装载图片:
    继承一个cview的类。用ondraw().
    void CpicView::OnDraw(CDC* pDC)
    {
    CDocument* pDoc = GetDocument();
    // TODO: この位置に描画用のコードを追加してください IPicture *pPic; 
    IStream *pStm; 

    CFileStatus fstatus; 
    CFile file; 
    LONG cb; 

    if (file.Open("c:/test.jpg",CFile::modeRead)&&file.GetStatus("c:/test.jpg", 
    fstatus)&& 
    ((cb = 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); 
    GlobalUnlock(hGlobal); 
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); 

    if(SUCCEEDED(OleLoadPicture(pStm,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; 
    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)))
    AfxMessageBox("Failed To Render The picture!");
    pPic->Release();

    else 
    AfxMessageBox("Error Loading Picture From Stream!"); 



    else 
    AfxMessageBox("Can't Open Image File!");}//
    以上代码在sdi容器里面可以装载图片。
    但是怎么和图片框关联呢?
    方案2:
    用静态文本框装载图片:
    继承一个静态的类CStatic.类名:CBmpProgCtrlvoid CBmpProgCtrl::OnPaint() 
    {
    m_length = (float)m_nPos/(m_nUpper-m_nLower);
    CPaintDC dc(this);  // 描画用のデバイス コンテキスト

    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
    GetClientRect(&m_rect);
    pDCBack->CreateCompatibleDC(&dc);
    bmpBack.GetBitmap(&bmback);
    pDCBack->SelectObject(bmpBack);
    dc.StretchBlt(0,0,m_rect.Width(),m_rect.Height(),pDCBack,0,0,bmback.bmWidth,bmback.bmHeight,SRCCOPY);
    pDCBack->DeleteDC();
    // 描画用メッセージとして CStatic::OnPaint() を呼び出してはいけません
    }
    可以在界面启动就装载图片。可是还是不知道怎么相应button事件,请各位详细赐教。十分感激!!!
      

  4.   

    void CNyuRyokuDlg::OnInputFileBtn() 
    {
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    static char BASED_CODE szFilter[]="All Files(*.*)|*.*||";
    //
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY 
    | OFN_OVERWRITEPROMPT,szFilter,NULL);
    if(dlg.DoModal() == IDOK)
    {
    //
    CFile file;
    file.Open(dlg.GetPathName(),CFile::modeRead);
    CEdit * pEdit = (CEdit*)GetDlgItem(IDC_INPUT_PATH_EDT);
    pEdit->SetWindowText(file.GetFilePath());
    m_Path = file.GetFilePath();
    file.Close();
    }
    }
      

  5.   

    void CKiriDasuDlg::OnPaint() 
    {
    // CPaintDC dc(this); // 描画用のデバイス コンテキスト

    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください

    // 描画用メッセージとして CDialog::OnPaint() を呼び出してはいけません HBITMAP hBitmap;
    BITMAP BM;
    CDC MemDC;
    CClientDC ClientDC(this);
    MemDC.CreateCompatibleDC(&ClientDC);
    hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),m_Path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    MemDC.SelectObject(&hBitmap);
    ::GetObject(hBitmap,sizeof(BM),&BM);
    //使用格式与方法一同
    //ClientDC.BitBlt(0,0,BM.bmWidth,BM.bmHeight,&MemDC,0,0,SRCCOPY);
    //
    CStatic *pStatic = (CStatic *)GetDlgItem(IDC_KIRIDASU_IMG) ;
        pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
    int nLength = m_Path.GetLength();
    char* sz=new char(nLength);
    sz=m_Path.GetBuffer(0);
        pStatic->SetBitmap(hBitmap);
    }