2014-01-07 67 views
4

這個問題有點奇怪,但我會盡力解釋所有事情。C# - Windows窗體 - 強制重畫,就好像屏幕窗口已經移動

我在自動化窗口重新繪製的特定事件時遇到了問題。基本上,我試圖讓畫面事件觸發,就好像窗口已經被移動,而其中的一些內容是屏幕外的(例如,因爲窗口的尺寸太大而不適合在屏幕上)。

我試過使用Invalidate(),Update()Refresh()以及this.Invalidate(new Rectangle(0, 0, Width, Height));。但是沒有一個產生我期待的效果。

目前,我在Paint事件中測試的情況是,PaintEventArgs ClipRectangle屬性的WidthHeight都大於零。當應用程序被啓動,並且當所有的前述方法中運行,則隨後的PaintEventArgs的ClipRectangle具有零的所有值:

{ClipRectangle = {X=0,Y=0,Width=0,Height=0}} 

然而,當我手動拖動窗口(同時還有一部分是關閉屏幕)和油漆事件將觸發ClipRectangle具有這些值:

{ClipRectangle = {X=0,Y=0,Width=1356,Height=1636}} 

所示出的寬度和高度是該窗口的全部尺寸。

我假設在兩種情況下的區別在於,在後者中,因爲某些窗口不在屏幕上,所以必須重新繪製所有窗口,以便將之前未在屏幕上的內容解釋爲帳戶;雖然,但我不完全確定這些不同情況的確切原因。不幸的是,通過我所有瘋狂的嘗試,我的程序只在Paint事件發生在這些特定情況下才起作用。有沒有人知道有什麼辦法來強制這樣的事件發生(最好不管窗口是否實際在屏幕外)?只要能夠可靠地工作,我就不在乎解決方案是多麼怪異或奇怪。

+0

您是否嘗試過使用過載'的Invalidate(矩形,布爾)'通知窗口也重繪其子元素,然後調用'更新()'後? – Matt

+0

這似乎不工作。 –

+0

你想在代碼中做到這一點?如果我創建了一個新窗體並單擊了一個調用窗體上的Invalidate(),然後Update(更新)的按鈕,Paint事件就會被觸發,其大小與窗體的大小相同。 – Matt

回答

0

嘗試在OnPaint功能添加此:

if (e.ClipRectangle.Width < 200 || e.ClipRectangle.Height<200) 
{ 
    this.Refresh(); 
} 
else 
{ 
    //your paint code 
}