1.1.3-學習Opencv與MFC混合編程之---畫圖工具 經過對話框進行工具的參數設置 畫曲線 繪圖校訂

源代碼:http://download.csdn.net/detail/nuptboyzhb/3961688web

l 對話框函數

1.「插入」->「資源」->「對話框」spa

2.對話框屬性以下:.net


雙擊對話框,創建對話框類。取名:LineParametercode

3.在LineParameter.h頭文件中添加#include "resource.h",不然:會報錯:IDD_DIALOG4未定義orm

4.爲LineParameter類增長以下成員變量:對象

       int m_colorR;blog

       int m_colorG;ip

       int m_colorB;ci

       int m_PenWidth;

5.在構造函數中,初始化變量:

LineParameter::LineParameter(CWnd*pParent /*=NULL*/)

       : CDialog(LineParameter::IDD, pParent)

{

       //{{AFX_DATA_INIT(LineParameter)

              // NOTE: the ClassWizard will addmember initialization here

       //}}AFX_DATA_INIT

       //初始化數據

       m_colorB=0;

       m_colorG=0;

       m_colorR=0;

       m_PenWidth=1;

}

6.在數據交換函數裏,交換成員變量與相應控件的數據:

voidLineParameter::DoDataExchange(CDataExchange* pDX)

{

       CDialog::DoDataExchange(pDX);

       //{{AFX_DATA_MAP(LineParameter)

              // NOTE: the ClassWizard will addDDX and DDV calls here

       DDX_Text(pDX, IDC_COLOR_R,m_colorR);

    DDV_MinMaxInt(pDX,m_colorR, 0, 255);

       DDX_Text(pDX, IDC_COLOR_G,m_colorG);

    DDV_MinMaxInt(pDX,m_colorG, 0, 255);

       DDX_Text(pDX, IDC_COLOR_B,m_colorB);

    DDV_MinMaxInt(pDX,m_colorB, 0, 255);

       DDX_Text(pDX, IDC_WIDTH, m_PenWidth);

       DDV_MinMaxInt(pDX, m_PenWidth, 1, 50);

       //}}AFX_DATA_MAP

}

7.爲確認按鍵添加消息處理函數:

voidLineParameter::OnOK()

{

       // TODO: Add extra validation here

       UpdateData(TRUE);  // 把控件上的數據寫入成員變量

      

       if ((m_colorR>=0&&m_colorR<=255)&&(m_colorG>=0&&m_colorG<=255)&&(m_colorB>=0&&m_colorB<=255))

       {

              CDialog::OnOK();  // 關閉對話框

       }

       else

       {

              MessageBox("請輸入0-255之間的數字", "錯誤提示", MB_ICONEXCLAMATION | MB_OK);

       }

}

l 使用對話框

1.    在CXXXXXXView類中增長成員變量,並在構造函數中進行初始化;

int m_LineWidth;

int m_ColorB;

int m_ColorG;

int m_ColorR;

2.    分別在‘直線’,‘圓’,‘矩形’菜單項的消息處理函數裏添加LineParameter對話框對象;並將對話框輸入的數據傳遞給相應的成員變量:

      LineParameter dlg;

       if(dlg.DoModal() != IDOK)

       {

              return;

       }

       m_ColorR=dlg.m_colorR;

       m_ColorG=dlg.m_colorG;

       m_ColorB=dlg.m_colorB;

       m_LineWidth=dlg.m_PenWidth;

       //刪除對話框

       deletedlg;

3.    修改OnMouseMove消息處理函數,將CXXXXView類的相應成員變量值賦值於畫圖所需的參數,(RGB顏色和線寬)



畫圖準肯定的校訂問題:

問題的提出:

運行結果代表:鼠標按下的點,與圖像上顯示的點有較大的差距。而鼠標移動時的點,和圖像上的點徹底一致。所以考慮將第一次鼠標移動後的點做爲畫線的起始點:

1.    添加CXXXXView成員變量,OnMouseMoveFlag,用於記錄鼠標移動的次數。在構造函數裏將其初始化爲0;

2.    每次運行OnMouseMove消息處理函數,該標誌加一。

3.    當OnMouseMoveFlag的時候,將此時的點,保存到起始點:

my_cvpoint1=cvPoint(point.x,point.y);

4.    爲防止OnMouseMoveFlag增長過快而溢出,在此後的語句中將其賦值爲3,:OnMouseMoveFlag=3;

5.    在每次鼠標按下和鼠標擡起時均初始化該變量

OnMouseMoveFlag=0;


畫曲線

1.    增長‘曲線’菜單項;設置相應的屬性,添加類嚮導,編輯消息響應函數:

voidCCVMFCView::OnMyDrawCurve()

{

// TODO: Add your command handler code here

my_draw_flag=4;

LineParameter dlg;

if (dlg.DoModal() != IDOK)

{

           return;

}

m_ColorR=dlg.m_colorR;

m_ColorG=dlg.m_colorG;

m_ColorB=dlg.m_colorB;

m_LineWidth=dlg.m_PenWidth;

//刪除對話框

 deletedlg;

}

2.    修改OnMouseMove消息處理函數。增長case 4:的消息處理:

case 4://當選擇畫曲線時

                    cvFlip(workImg);

                    cvLine(workImg,my_cvpoint1,iner_point,cvScalar(colorB,colorG,colorR),thickness);

                    cvFlip(workImg);

                    my_cvpoint1=cvPoint(point.x,point.y);

                    Invalidate();//重繪

                    break;


 

from:http://blog.csdn.net/nupt123456789/article/details/7100150

相關文章
相關標籤/搜索