2013-07-11 3 views
0

В настоящее время я изучаю C# и выбрал в качестве проекта для написания простого элемента управления цветом; однако ситуация существенно изменилась с тех пор, как я в последний раз смотрел на код, и я столкнулся с этой проблемой.Как правильно получить управляемые привязанные координаты, относящиеся к управлению для сравнения мыши?

Я использую событие Mousedown для управления координатами мыши как точку - это работает нормально и возвращает именно то, что я ожидаю, - координаты мыши относительно моего элемента управления; однако, когда я пытаюсь выполнить проверку против местоположения элемента управления, мне возвращается значение как точка, показывающая позицию моего элемента управления относительно формы, которая в некоторых случаях координаты мыши будут за пределами границ, потому что их значения будут меньше, чем относительная начальная позиция элемента управления IE, я нажимаю на пиксель 1,1 в элементе управления - положение мыши равно 1,1, но поскольку элемент управления расположен на 9,9 относительно формы, местоположение мыши меньше границ контроля - я абсолютно не знаю, как это исправить, я пытался разобраться с PointToClient и PointToScreen безрезультатно, поскольку они, похоже, придумывают диковинные ценности, кто-то может помочь мне, это сводит меня с ума.

+0

Пример вашего кода поможет :) – RedEyedMonster

ответ

0

Мне удалось разобраться с этим, поэтому я подумал, что отправлю ответ, и он может с надеждой помочь кому-то другому. У меня возникли проблемы с получением значений Point, которые были относительно одного и того же происхождения пикселей: это отсортировало его.

private void ColourPicker_MouseDown(object sender, MouseEventArgs e) 
{ // Probably being paranoid but I am worried about scaling issues, this.Location 
    // would return the same result as this mess but may not handle 
    // scaling <I haven't checked> 
    Point ControlCoord = this.PointToClient(this.PointToScreen(this.Location)); 
    int ControlXStartPosition = ControlCoord.X; 
    int ControlYStartPosition = ControlCoord.Y; 
    int ControlXCalculatedWidth = ((RectangleColumnsCount + 1) * WidthPerBlock) + ControlXStartPosition; 
    int ControlYCalculatedHeight = ((RectangleRowsCount + 1) * HeightPerBlock) + ControlYStartPosition; 

    // Ensure that the mouse coordinates are comparible to the control coordinates for boundry checks. 
    Point ControlRelitiveMouseCoord = this.ParentForm.PointToClient(this.PointToScreen(e.Location)); 
    int ControlRelitiveMouseXcoord = ControlRelitiveMouseCoord.X; 
    int ControlRelitiveMouseYcoord = ControlRelitiveMouseCoord.Y; 

    // Zero Relitive coordinates are used for caluculating the selected block location 
    int ZeroRelitiveXMouseCoord = e.X; 
    int ZeroRelitiveYMouseCoord = e.Y; 

    // Ensure we are in the CALCULATED boundries of the control as the control maybe bigger than the painted area on 
    // the design time form and we don't want to use unpaited area in our calculations. 
    if((ControlRelitiveMouseXcoord > ControlXStartPosition) && (ControlRelitiveMouseXcoord < ControlXCalculatedWidth)) 
    { 
     if((ControlRelitiveMouseYcoord > ControlYStartPosition) && (ControlRelitiveMouseYcoord < ControlYCalculatedHeight)) 
     { 
      SetEvaluatedColourFromPosition(ZeroRelitiveXMouseCoord, ZeroRelitiveYMouseCoord); 
     } 
    } 
    }