乙個支援各種交叉等形狀工業控制管道控制項的實現

2021-04-19 07:51:09 字數 2690 閱讀 6701

乙個支援各種交叉等形狀工業控制管道控制項的實現

關鍵字 管道 工控 組態 控制項

介紹

工業控制系統程式設計過程中,在模擬現場等環境系統中,管道控制項是乙個非常重要並且非常有用的控制項。很多任務業組態軟體能夠利用他的圖形庫製作出來非常漂亮的三維現場畫面,這樣給程式注入了很多的生機。而在個人編寫的工業程式中,由於沒有圖形庫等支援,那麼顯示就顯得非常的單調。如果我們可以加入此類控制項的支援,則會使得我們的程式變得更加的專業。

正文

現在網路上也有一部分提供了管道控制項的程式設計方法,不過基本上都是比較粗糙,效果不理想,而且在管道實體經常有各種的交叉等形狀,而網路上面幾乎找不到那種支援各種形狀的管道控制項(一般就提供了橫向和縱向兩種形狀的支援)。利用這些控制項完成的介面中,當那些複雜的拐角等區域就會顯得非常的彆扭。在分析和收集這些資訊的基礎上,我對管道等進行了一些控制項的開發,完成了各種拐角等交叉形狀的 編寫。希望我的這些經驗對從事這個方面或者尋求相關資訊的人有幫助。

首先是管道控制項的實現。管道就是一種圓形的裝置,從外觀上看我們大致可以看到是一種中間向兩邊變暗的過程。在我的另一篇文章「乙個工業控制管道流動控制項的實現」中採用了漸變的方法實現了實體的繪製。那個適合於簡單的管道的實現。比如橫向和縱向等。但是在複雜的控制項實現中,這種方法實現拐角等是非常的麻煩,所以我們不採用這種方法。

我們在windows的畫圖程式中可以做這樣的試驗,我們用畫刷採用不同的顏色繪製一些不同顏色的直線,當我們的顏色採用一種顏色向另外一種顏色漸變的時候就會產生視覺上的一種「凹凸」的效果。由於管道一般是黑白顏色,我們這裡可以用黑白的大致漸變顏色進行繪製,顯示效果見下:大致可以看出,用這種不同的顏色進行一些區域的繪製就可以形成那種視覺效果上的管道的繪製。

上圖所示的我們可以得到是一種能夠類似橫向管道的控制項繪製的方法,那麼同樣道理,我們可以這樣得到縱向管道的控制項的繪製方法。當時在拐角的實現中,我們要進行一些別的處理。很多時候我們看到一些師傅進行實體連線的時候,當進行管道拐角的時候,需要將兩根管道在介面處進行鞋45度的切割,然後就實現了不同管道的交叉了。我們可以這種方法進行交叉的處理就可以了。相信可以見後面的**實現。

通過對管道的分析,大致可以得到管道的一些通用的形狀,大概氛圍下面11種情況,左上的拐角、右上的拐角、右下的拐角、左下的拐角、豎向、橫向、**交叉、左邊交叉、頂邊交叉、上部交叉、底邊交叉。通過設定控制項的屬性進行不同形狀的繪製工作。我們可以在這裡進行形狀的大致抽象

//管道的形狀

typedef enum _pipeface

pipeface;

下面就是我們管道的繪製工作了,觸發wm_paint訊息完成繪製工作。
void cpipectrl::onpaint() 

}

下面是關於管道的詳細繪製方法**,屬於這個控制項繪製的核心部分
void cpipectrl::drawhorizontal(cdc *pdc, rect &rectclient)

}void cpipectrl::drawvertical(cdc *pdc, rect &rectclient)

}void cpipectrl::drawcornerlefttop(cdc *pdc, rect &rectclient)

}void cpipectrl::drawcornerrightbottom(cdc *pdc, rect &rectclient)

}void cpipectrl::drawcornerrighttop(cdc *pdc, rect &rectclient)

}void cpipectrl::drawcornerleftbottom(cdc *pdc, rect &rectclient)

}void cpipectrl::drawcrosscenter(cdc *pdc, rect &rectclient)

//繪製豎向

for (i=0; i<=sectcount / 2; i++) }

void cpipectrl::drawcrosstop(cdc *pdc, rect &rectclient)

//繪製豎向

int xleft = xcenter - sectcount * nsectwidth / 2;

for (i=0; i<=sectcount / 2; i++) }

void cpipectrl::drawcrossright(cdc *pdc, rect &rectclient)

//繪製橫向

int ytop = ycenter - sectcount * nsectwidth / 2;

for (i=0; i<=sectcount / 2; i++) }

void cpipectrl::drawcrossbottom(cdc *pdc, rect &rectclient)

//繪製豎向

int xleft = xcenter - sectcount * nsectwidth / 2;

for (i=0; i<=sectcount / 2; i++) }

void cpipectrl::drawcrossleft(cdc *pdc, rect &rectclient)

//繪製橫向

int ytop = ycenter - sectcount * nsectwidth / 2;

for (i=0; i<=sectcount / 2; i++)

}

到這裡,我們的定義的各種形狀就繪製完畢了,編譯控制項執行,我們可以看到下面的效果:

抽象乙個形狀類

阮寶同學期待著暑假來臨,知道c 不好好複習麻煩不小。沒有多型性,那就不叫物件導向,老師不划重點也能猜到。嘿嘿,自己做個經典題,怎麼變題也不怕。老濕,再難的題還有木有?輸入四個數,前兩個是矩形的長和寬,後兩個是三角形的底邊長和高。分兩行輸出兩個數,第乙個是矩形的面積,第二個是三角形的面積。3.5 6....

乙個交叉表

乙個交叉表.用字段明做為值 原表資料為 欄位1 欄位2 欄位3 a1 b1 c1 a2 b2 c2 變換後 col1 col2 col3 欄位1 a1 a2 欄位2 b1 b2 欄位3 c1 c2 createtabletablename 欄位1varchar 100 欄位2varchar 100 ...

等乙個人,等乙個故事

埋下一座城 關了所有燈。你的夕陽 我的容顏 誰的三分之一年。搖曳在筆尖的舞姿 是聚光燈下最濃烈的一抹豔紅。我目送沿海的日落 緊抱乙個醉生夢死的枕頭 遊不出回憶卻學不會放手 怎麼走。用一根火柴燒一座蜃樓 借這場大雨讓自己逃走。躲在萬劫不復的街頭 微笑參透覆水難收。睫毛下的傷城路過了誰的風景誰的心。當掉...