源代碼:http://download.csdn.net/detail/nuptboyzhb/3961688
l 對話框
1.“插入”->“資源”->“對話框”
2.對話框屬性如下:

輕按兩下對話框,建立對話框類。取名:LineParameter
3.在LineParameter.h頭檔案中添加#include "resource.h",否則:會報錯:IDD_DIALOG4未定義
4.為LineParameter類增加如下成員變量:
int m_colorR;
int m_colorG;
int m_colorB;
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);
my_cvpoint1=cvPoint(point.x,point.y);
Invalidate();//重繪
break;