2015-11-19 69 views
1

我已經使用這個代碼嵌入到Monogame Windows窗體:鼠標不工作Monogame Winforms中

private IntPtr drawSurface; 
    private Control gameForm; 

    public MapEditor(MainWindow window) 
    { 
     graphics = new GraphicsDeviceManager(this); 
     Content.RootDirectory = "Content"; 

     this.drawSurface = window.pcbViewport.Handle; 
     graphics.PreparingDeviceSettings += new EventHandler<PreparingDeviceSettingsEventArgs>(graphics_PreparingDeviceSettings); 
     Mouse.WindowHandle = drawSurface; 
     gameForm = Control.FromHandle(this.Window.Handle); 
     gameForm.VisibleChanged += new EventHandler(gameForm_VisibleChanged); 
    } 

    private void gameForm_VisibleChanged(object sender, EventArgs e) 
    { 
     if (gameForm.Visible) 
     { 
      gameForm.Visible = false; 
     } 
    } 

    private void graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e) 
    { 
     e.GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle = drawSurface; 
    } 

現在,用來工作的代碼...我認爲。這已經有一段時間了,代碼在另一臺老版本的計算機上,所以我似乎記得現在在Monogame之前的工作。無論如何,問題在於鼠標輸入不起作用!鍵盤和遊戲手柄輸入工作正常,但鼠標輸入根本沒有註冊。我已經嘗試過,發現如果我取出VisibleChanged事件,它可以工作,但它也顯示GameWindow以及窗體(它不需要在PictureBox中繪製它)

I' m知道我可以把GameWindow放在一個Control中,如果需要的話我會這樣做,但我試圖看看是否有解決方案來讓現有的代碼再次工作。

+0

爲什麼你需要將它設置爲隱形?鼠標輸入指向鼠標下方的窗口(在典型情況下),但如果不可見,則無法接收該鼠標輸入。 – MicroVirus

+0

如何以及在哪裏創建Game實例/表單實例?正如@微軟病毒所寫,隱藏一個WinForms'Control'將阻止它接收鼠標輸入。另外,我假定'Map​​Editor'是從'Game'派生的? – Groo

+0

它是不可見的,因爲它呈現給winform內的一個picturebox。如果它是可見的,那麼你有兩個窗口,GameWindow和Winform中的窗口!如果你不能重新分配鼠標控制,這是一個問題。遊戲實例與Winform一起創建並分配給Winform。 – mikelomaxxx14

回答

1

與您的問題方法是,在MonoGame設置Mouse.WindowHandle什麼也不做(二傳手此屬性是空的,如果你look at the source code)。

這意味着您的Game始終綁定到其默認窗口(您隱藏的窗口),並且該窗口之外的所有鼠標輸入都將被忽略。如果你不隱藏它,你會看到點擊原始窗口可以正確創建鼠標事件。另一方面,繪圖正確地完成了圖片框。鍵盤事件不被屏幕區域過濾,所以它們的工作沒有問題。

我的看法是,這是不是你應該如何託管XNA/MonoGame Windows窗體裏面,而是考慮如何實現GraphicsDeviceControl類,它應該從System.Windows.Forms.Control繼承,並提供通過使用XNA繪製自己的能力框架GraphicsDevice。該方法在this article(XNA 4,但可以輕鬆移植到MonoGame)中進行了解釋。

如果你想使用你使用的是現在的辦法,唯一的事情,你可以做的是結賬MonoGame源代碼,並發現GameWindow Windows窗體的執行(即WinFormsGameWindow,這是一個內部類)。由於Mouse.GetState()僅返回GameWindow.MouseState,因此可以實例化您自己的GameWindow將允許您獲取通過篩選出的事件的窗口。或者,如果您要更改MonoGame代碼,那麼您還可以添加一個Game構造函數重載,它將從一開始就接受Control句柄。


諷刺的是,裏面有這個二傳手留下「只對XNA兼容性」,像扔一個編譯時錯誤的註釋是相對於時間的人就會失去調試這是一個大問題。 :-D

+0

嗯,我希望能夠輕鬆修復,但是我知道從XNA到Monogame的轉換肯定會遇到一些問題!感謝您提供簡潔的回答和建議。第一個選項實際上是我的選擇,另外兩個選項也是可行的,但我寧願讓Monogame成爲單人遊戲,我的代碼以更「適當」的方式做事。不能相信,儘管他們留下了死代碼沒有一個評論或例外......該死的程序員! – mikelomaxxx14