2013-02-28 3 views
2

Я посмотрел на этот вопрос, и хотя это помогло бы, но WndProc не срабатываетPass через событие мыши для управления под

Pass-through mouse events to parent control

Так у меня есть игровое поле, которое является пользовательским элементом управления с изображением коробка. Во время события mouseClick я делаю хит-тест, чтобы определить, какая часть платы была нажата, и поместите кусок в относительную область. Затем я создаю одну из частей игры и анимирую ее с края формы хоста до нужного места на доске. Таким образом, игровой кусок не является ребенком игрового поля

Это все работает отлично. Однако, если пользователь нажимает на кусок игры, mouseClick для доски под ним не вызывает события. Я вроде как получаю это, как кнопка под кнопкой.

Мой вопрос я могу «пройти через» клик события игрового части таким образом, только доски является «кликабельны»

public enum PieceColor 
{ 
    Blue=0, 
    Yellow, 
    Red, 
    Green 
} 

public class GamePiece : PictureBox 
{ 
    PieceColor _color; 
    public PieceColor Color { 
     get { 

      return _color; 
     } 
     set 
     { 
      _color = value; 

      if (_color == PieceColor.Blue) 
       this.Image = global::GameEntities.Properties.Resources.pieceBlue; 
     } 
    } 


    protected override void WndProc(ref Message m) 
    { 
     const int WM_NCHITTEST = 0x0084; 
     const int HTTRANSPARENT = (-1); 

     if (m.Msg == WM_NCHITTEST) //<-- this never fires 
     { 
      m.Result = (IntPtr)HTTRANSPARENT; 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 
+0

Ваш код в порядке, и он отлично работал, когда я его протестировал, передав событие MouseDown в форму. Трудно догадаться, почему у вас такая проблема. –

+0

спасибо, мне придется посмотреть на это сегодня вечером. – Mike

ответ

1

Для того, чтобы сделать свой контроль прозрачной для мыши событий щелчка, вы можете пройти все события click для соответствующего родительского элемента управления. Итак, сначала создайте интерфейс, который объявит метод HandleMouseClick.

interface IMouseClickable 
{ 
    void HandleMouseClick(object sender, MouseEventArgs e); 
} 

Применить этот интерфейс к родителю Control, так что вы можете передать этот Control в GamePiece. Это можно сделать с помощью конструктора, и вы можете сразу зарегистрировать родителя HandleMouseClick на GamePiece.

... 
public GamePiece(IMouseClickable parent) 
{ 
    MouseClick += parent.HandleMouseClick; 
} 
... 
+0

Интересное решение, интересно, могу ли я просто передать новый MouseEventHandler (game_MouseClick) без дополнительного интерфейса. Попробуем позже. – Mike

+0

В пропущенных аргументах координаты местоположения щелчка мыши относительно элемента управления. Так будет ли это не просто проходить через, но с координатами, то неверными? –

Смежные вопросы