解决方案 »

  1.   

    派生CStatic,在OnPaint中绘图,至于调整大小,你自己需要处理WM_LBUTTONDOWN/WM_LBUTTONUP/WM_MOUSEMOVE
    消息。
      

  2.   

    "画一个矩形框"
    橡皮筋类(CRectTracker)
      

  3.   

    我可以在上面画一个矩形框,但是每次画矩形框时加载的图片就不见了,这该怎么办呢?代码是我从网上找的:
    加载代码:
    void C界面5Dlg::OnBnClickedButtonImg()
    {
    CString m_strPicPath;
    CFileDialog dlg(true,_T("*.bmp"),NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,
    _T("image file(*.bmp;*.jpg)|*.bmp;*.jpg|All Files(*.*)|*.*|"),NULL);//弹出选择图片对话框
    dlg.m_ofn.lpstrTitle=_T("open Image");
    if(dlg.DoModal()!=IDOK) return ;
    m_strPicPath = dlg.GetPathName();
    m_strPicPath.Replace(_T("//"),_T("////"));
    TheImage=cvLoadImage((CT2CA)m_strPicPath,1);
    if(TheImage!=NULL)
    {
    ShowImage(TheImage,IDC_SHOWIMG);
    }
    else
    {
    MessageBox("所选文件不是图片格式","提示");
    }// TODO: 在此添加控件通知处理程序代码
    }画矩形框代码:void C界面5Dlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    int nIn; //定义一个鼠标的点击值;
    nIn=m_tracker.HitTest(point); //看看点到了哪了 CRect Prect1; //定义图片的矩形
    CRect Trect; //定义橡皮筋框的矩形
    CRect Prect; //图片矩形框 GetDlgItem(IDC_SHOWIMG)->GetWindowRect(&Prect1); //得到图片的矩//形大小 ScreenToClient(&Prect1); //将图片框的绝对矩形大小 //判断是否在图片框内,不处理不在图片框内的点击
    if (point.x<Prect1.left||point.x>Prect1.right||point.y<Prect1.top||point.y>Prect1.bottom)
    return; m_tracker.SetCursor(this,nFlags); //改变鼠标的形状
    if(nIn<0) //不在四边形区域内;
    {
    Invalidate(true);
    m_tracker.TrackRubberBand(this,point,false); //不在矩形框内则画橡皮///筋框
    GetDlgItem(IDC_SHOWIMG)->GetWindowRect(&Prect); //得到图片框的//矩形
    ScreenToClient(&Prect); 
    Trect=m_tracker.m_rect; //得到画好的橡皮筋框 //调整大小
    Trect.top=(Trect.top<Prect.top?Prect.top:Trect.top);
    Trect.left=(Trect.left<Prect.left?Prect.left:Trect.left); 
    Trect.bottom=(Trect.bottom>Prect.bottom?Prect.bottom:Trect.bottom);
    Trect.right=(Trect.right>Prect.right?Prect.right:Trect.right); m_tracker.m_rect.SetRect(Trect.left,Trect.top,Trect.right,Trect.bottom); //画出调整好的矩形框 CClientDC dc(this);
    m_tracker.Draw(&dc); //画好矩形框 }
    else 
    //在四边形区域内:
    {
    Invalidate(); //重画界面 CClientDC dc(this);
    GetDlgItem(IDC_SHOWIMG)->GetWindowRect(&Prect); 
    ClipCursor(&Prect); //api函数,将鼠标限制在图片框内 m_tracker.Draw(&dc);
    m_tracker.Track(this,point,false); ScreenToClient(&Prect);  Trect=m_tracker.m_rect; //得到画好的橡皮筋框 //调整矩形框的位置
    if (Trect.top<Prect.top)
    {//超出图片框顶部的位置
    Trect.bottom=Prect.top-Trect.top+Trect.bottom;
    Trect.top=Prect.top;
    }
    if (Trect.bottom>Prect.bottom)
    {//超出底部的位置
    Trect.top=Prect.bottom-Trect.bottom+Trect.top;
    Trect.bottom=Prect.bottom;
    }
    if (Trect.right>Prect.right)
    {//超出右边
    Trect.left=Prect.right-Trect.right+Trect.left;
    Trect.right=Prect.right;
    }
    if (Trect.left<Prect.left)
    {//超出左边
    Trect.right=Prect.left-Trect.left+Trect.right;
    Trect.left=Prect.left;
    }
    //设置矩形框大小
    m_tracker.m_rect.SetRect(Trect.left,Trect.top,Trect.right,Trect.bottom);  m_tracker.Draw(&dc);
    // Track()是CRectTracker中最富魅力的函数。它时时的改变调用者的m_rect;
    ClipCursor(NULL); //释放对鼠标的限制
    }
    CRect AbsRect;
    AbsRect.left=abs(Trect.left-Prect.left);
    AbsRect.right=abs(Trect.right-Prect.right);
    AbsRect.top=abs(Trect.top-Prect.top);
    AbsRect.bottom=abs(Trect.bottom-Prect.bottom);
    /*
    CRect rect;
    GetDlgItem(IDC_SHOWIMG)->GetClientRect(rect);
    GetDlgItem(IDC_SHOWIMG)->ClientToScreen(rect);
    ClientToScreen(&point); if(rect.PtInRect(point))
    {
    SetCapture();
    m_bCaptured = TRUE; GetDlgItem(IDC_SHOWIMG)->Invalidate(); //消除上一次绘制的矩形
    GetDlgItem(IDC_SHOWIMG)->ScreenToClient(&point);
    m_endPos = m_startPos = point;
    }// TODO: 在此添加消息处理程序代码和/或调用默认值
    */ CDialogEx::OnLButtonDown(nFlags, point);
    }
     请大神指教!!
      

  4.   

    我知道问题是出在了两句
    Invalidate(); //重画界面
    上了,要是把这两句话删除的话,就可以一直显示图片了,但是调整矩形框大小和重新画矩形框时原先的矩形框就不会删除了,就越来越多的矩形框了。
    怎样做可以一直显示图片又可以删除上一个矩形框,只保留最后一个矩形框呢?
      

  5.   

    “想要截取其中的一部分进行处理”
    其中的一部分 就是  橡皮筋类 的 大小。
    当用户 停止 橡皮筋类 操作时, 就可以 进行 处理了 , 即 m_tracker.TrackRubberBand(this,point,false); 
    结束时,
      

  6.   

    我程序没变,在OnCtlColor里面有输入了在picture控件上显示图片的语句就可以使图片和矩形框一起显示了。
    但是在用cvSetImageROI扣取出矩形框中的内容时明显失真了,是图片显示程序有问题吗?我自己写了一个在控件中显示图片的程序,然后调用的,程序如下:
    void CJishu::ShowImage(IplImage* img, UINT ID)
    {
    CDC* pDC=GetDlgItem(ID)->GetDC();
    HDC hDC=pDC->GetSafeHdc();
    CRect rect;
    GetDlgItem(ID)->GetClientRect(&rect);
    SetRect(rect,rect.left,rect.top,rect.right,rect.bottom);

    CvvImage cimg;
    cimg.CopyOf(img);
    cimg.DrawToHDC(hDC,&rect);
    ReleaseDC(pDC);
    }
    用这个函数显示时,控件有多大,图片就在多大的范围内显示。
    请问是哪的问题呢?
      

  7.   

    "控件有多大" 是 rect 表示的, 不是 矩形框 。
      

  8.   

    CRect rect;
    GetDlgItem(ID)->GetClientRect(&rect);
    SetRect(rect,rect.left,rect.top,rect.right,rect.bottom);不是 rect 要取 橡皮筋类 当前的 rect
      

  9.   

    删除 debug ,release 等 目录, 只要 源 代码。
      

  10.   

    怎么只有一个5dlg.cpp了?
    工程呢?
    工程打包。
      

  11.   


    不好意思哈,我又传了一份,不知道这样可不可以。
    另外我想再问一个问题,在基于对话框的MFC中,怎样把模态对话框中的edit control中输入的内容显示到另一个对话框中static text中呢?谢谢啦。
      

  12.   

    “把模态对话框中的edit control中输入的内容显示到另一个对话框中static text中呢”
    1. 这个 Edit 要 关联 为 Value(如CString) ,不能是 Control。
    2. 模态对话框 关闭 后 这个 edit 值 还在。 通过 dlg.yourEdit 可以 得到。
    3. 同理 另一个对话框中static text 也要 是 Value
    4. 在另一个对话框 DoModule 前 ,把 youeEdit 给 yourText 。即:
    dlg.2.m_text=dlg1.m_Edit;
    dlg2.DoModule();
      

  13.   

    下载了,可惜编译不了,我是vc6
    用到 opencv
    类名还含汉字!
    帮不了你。
    Sorry
      

  14.   

    可以参考:
    "PartialBitmap.zip" 0 分
      

  15.   

    我不明白您的意思啊??那个意思是不是rect的值,你要取大一点,或者用缩放图片啊。
      

  16.   

    可以参考:
    "PartialBitmap.zip" 0 分
    http://download.csdn.net/detail/schlafenhamster/4526898
    void CPartialBitmapView::OnButtonSave() 
    {
    // TODO: Add your command handler code here
    SavePartialBmp(m_Tracker.m_rect.left,m_Tracker.m_rect.top,m_Tracker.m_rect.right,
    m_Tracker.m_rect.bottom);
    }
      

  17.   

    请下载:
    http://download.csdn.net/detail/schlafenhamster/4526898
    vc6 的
      

  18.   

    多谢你了,抠图的那个是我的ShowImage函数有一些问题,后来改进了一下,发现凑合着能用了,但是还有一些小毛病,不过可以实现想要的结果了,多谢您的指导了哈。