IMovePointFeedBack殘影問題

2021-07-04 03:39:25 字數 2862 閱讀 3026

問題描述:

專案需要使用imovepointfeedback來模擬要素編輯過程中的捕捉行為,在檢視沒有改變的情況下,捕捉的行為很好,但是使用zoom in/out去改變地圖的比例尺的時候,imovepointfeedback會在dc上殘留在上乙個地圖比例尺下的位置,如圖所示:

問題分析:

這個問題其實普遍存在於arcgis engine中的**feedback型別的介面中,之前在使用ilinefeedback進行橡皮筋的繪製的時候也遇到過這個「殘影」的問題,根據以往使用gdi繪圖的經驗知道這肯定是缺少一次重繪。因為這種類似橡皮筋的行為一般都是呼叫windows底層的setrop更改繪製模式為xor,這樣要擦除上一條記錄只要在原來線的位置上再重新繪製一遍,則可擦除上一條線,於是自己在.net中extern了如下幾個函式,模擬ae的ilinefeedback的行為自己寫了乙個類解決了這個問題,但是當我試圖自己在去寫乙個imovepointfeedback的時候發現這兩者的行文不能很好的相容,因而只能放棄,根據google的搜尋結果可以發現這個問題被作為乙個bug在gisstack上進行了上報,但是在arcmap中的捕捉行為卻不存在這個問題,自己便開始懷疑可能是自己對介面的理解不完全造成的,在查閱了開發文件後發現豈是**feedback類都存在refresh方法,我估計這個方法應該就是針對這個問題的,接著我就在tool的refresh(int hdc)中呼叫了相應的refresh方法,發現這個問題得到了很好的解決,而且從重繪的間隙發現它的解決方案肯定和我寫的feedback的解決方案是一樣的,也就是在重繪完成後多繪製一次,以消除「殘影」。

public class gdi

public void endgdi()

public intptr createpen(

penstyles fnpenstyle, // pen style

int nwidth, // pen width

int crcolor // pen color

)public bool deleteobject(intptr hobject)

public intptr selectobject(

intptr hgdiobj // handle to object

)public void moveto(int x, int y)

public void lineto(int x, int y)

public int setrop2(drawingmode fndrawmode)

[system.runtime.interopservices.dllimportattribute(

"gdi32.dll")]

private static extern int setrop2(

intptr hdc, // handle of device context

drawingmode fndrawmode // drawing mode

);[system.runtime.interopservices.dllimportattribute(

"gdi32.dll")]

private static extern bool movetoex(

intptr hdc, // handle to device context

int x, // x-coordinate of new current position

int y, // y-coordinate of new current position

int oldp// pointer to old current position

);[system.runtime.interopservices.dllimportattribute(

"gdi32.dll")]

private static extern bool lineto(

intptr hdc, // device context handle

int nxend, // x-coordinate of line's ending point

int nyend // y-coordinate of line's ending point

);[system.runtime.interopservices.dllimportattribute(

"gdi32.dll")]

private static extern intptr createpen(

penstyles fnpenstyle, // pen style

int nwidth, // pen width

int crcolor // pen color

);[system.runtime.interopservices.dllimportattribute(

"gdi32.dll")]

private static extern bool deleteobject(intptr hobject // handle to graphic object

);[system.runtime.interopservices.dllimportattribute(

"gdi32.dll")]

private static extern intptr selectobject(

intptr hdc, // handle to device context

intptr hgdiobj // handle to object

);public static int rgb(int r, int g, int b)

}

如下圖是解決「殘影」後的捕捉效果,如果有更好的方案請告知我:

數碼管殘影

數碼管為什麼會出現影子?消影的原理是什麼?1 殘影現象 數碼管的不應該亮的段,似乎有微微的發亮,這種現象叫做殘影,這種現象嚴重影響了我們的視覺效果。2 殘影出現的原因 殘影的出現,只發生在動態掃瞄的設計電路中,主要問題是軟體設計者考慮不足引起的。1 狀態跳轉出現的中間狀態 舉個簡單例子,我們在數碼管...

C 仙人球的殘影

在美麗的hdu,有一名大三的同學,他的速度是眾所周知的,跑100公尺僅僅用了2秒47,在他跑步過程中會留下殘影的哎,大家很想知道他是誰了吧,他叫仙人球,既然名字這樣了,於是他的思想是單一的,他總是喜歡從一點出發,經過3次轉折 每次向右轉90 回到出發點,而且呢,他每次轉折前總是跑相同長度的路程,所以...

仙人球的殘影 HDU 2153

problem description 在美麗的hdu,有一名大三的同學,他的速度是眾所周知的,跑100公尺僅僅用了2秒47,在他跑步過程中會留下殘影的哎,大家很想知道他是誰了吧,他叫仙人球,既然名字這樣了,於是他的思想是單一的,他總是喜歡從一點出發,經過3次轉折 每次向右轉90 回到出發點,而且呢...