源代碼: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