需要的變量定義
private double RowDown;//鼠標按下時的行坐標
private double ColDown;//鼠標按下時的列坐標
HTuple Hmposition_Row, Hmposition_Col;
HObject himg;
HWindow hwin;
bool bMouseDown = false;
HTuple imgwidth, imgheight;
窗體加載事件讀取本地圖片,並適應Halcon控件大小
private void Form1_Load(object sender, EventArgs e)
{
hwin = hWindowControl1.HalconWindow;
HOperatorSet.ReadImage(out himg, AppDomain.CurrentDomain.BaseDirectory + "TP.bmp");
HOperatorSet.GetImageSize(himg, out imgwidth, out imgheight);
HOperatorSet.SetPart(hwin, 0, 0, imgheight, imgwidth);
HOperatorSet.DispObj(himg, hwin);
}
鼠標移動事件,實現圖像的平移(這里和鼠標右鍵按下松開事件配合實現)
private void hWindowControl1_HMouseMove(object sender, HMouseEventArgs e)
{
try
{
HTuple Hbutton_state, Hpixelgraval;
HTuple row1, col1, row2, col2; //Row, Column, Button;
HOperatorSet.GetMposition(hwin, out Hmposition_Row, out Hmposition_Col, out Hbutton_state);
if (Hmposition_Col < 0)
{
Hmposition_Col = 0;
}
if (Hmposition_Col > imgwidth - 1)
{
Hmposition_Col = imgwidth - 1;
}
if (Hmposition_Row < 0)
{
Hmposition_Row = 0;
}
if (Hmposition_Row > imgheight - 1)
{
Hmposition_Row = imgheight - 1;
}
HOperatorSet.GetGrayval(himg, Hmposition_Row, Hmposition_Col, out Hpixelgraval);
// toolStripStatusLabel7.Text = "(" + Hmposition_Row.ToString() + "," + Hmposition_Col.ToString() + ")=" + Hpixelgraval.ToString();
if (bMouseDown)
{
double RowMove = Hmposition_Row - RowDown; //鼠標彈起時的行坐標減去按下時的行坐標,得到行坐標的移動值
double ColMove = Hmposition_Col - ColDown;//鼠標彈起時的列坐標減去按下時的列坐標,得到列坐標的移動值
HOperatorSet.GetPart(hwin, out row1, out col1, out row2, out col2);//得到當前的窗口坐標
HOperatorSet.SetPart(hwin, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);//這里可能有些不好理解。以左上角原點為參考點
HOperatorSet.ClearWindow(hwin);
if (imgheight != null)
{
HOperatorSet.SetSystem("flush_graphic", "true");
HOperatorSet.DispObj(himg, hwin);
HOperatorSet.SetSystem("flush_graphic", "false");
}
else
{
MessageBox.Show("請加載一張圖片");
}
}
}
catch { }
}
鼠標滾輪事件,通過滾輪實現圖像的放大縮小
private void hWindowControl1_HMouseWheel(object sender, HMouseEventArgs e)
{
try
{
HTuple Zoom, Row, Col, Button;
HTuple Row0, Column0, Row00, Column00, Ht, Wt, r1, c1, r2, c2;
if (e.Delta > 0)
{
Zoom = 1.5;
}
else
{
Zoom = 0.5;
}
HOperatorSet.GetMposition(hwin, out Row, out Col, out Button);
HOperatorSet.GetPart(hwin, out Row0, out Column0, out Row00, out Column00);
Ht = Row00 - Row0;
Wt = Column00 - Column0;
if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)//普通版halcon能處理的圖像最大尺寸是32K*32K。如果無限縮小原圖像,導致顯示的圖像超出限制,則會造成程序崩潰
{
r1 = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));
c1 = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));
r2 = r1 + (Ht / Zoom);
c2 = c1 + (Wt / Zoom);
HOperatorSet.SetPart(hwin, r1, c1, r2, c2);
HOperatorSet.ClearWindow(hwin);
HOperatorSet.SetSystem("flush_graphic", "true");
HOperatorSet.DispObj(himg, hwin);
HOperatorSet.SetSystem("flush_graphic", "false");
}
}
catch { }
}
鼠標松開事件
private void hWindowControl1_HMouseUp(object sender, HMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
bMouseDown = false;
}
}
鼠標按下事件
private void hWindowControl1_HMouseDown(object sender, HMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
bMouseDown = true;
HTuple Row, Column, Button;
HOperatorSet.GetMposition(hwin, out Row, out Column, out Button);
RowDown = Row; //鼠標按下時的行坐標
ColDown = Column; //鼠標按下時的列坐標
}
}
縮放后通過按鈕的點擊事件恢復圖像到適應Halcon控件的狀態
private void button1_Click(object sender, EventArgs e)
{
HOperatorSet.GetImageSize(himg, out imgwidth, out imgheight);
HOperatorSet.SetPart(hwin, 0, 0, imgheight - 1, imgheight - 1);
hwin.DispObj(himg);
}
界面: