none
如何取得經縮放後的原始座標 RRS feed

  • 一般討論

  • 我在自訂控制項中使用GDI繪製內容,並使用Graphics.BeginContainer使這個控制項可以隨意調整大小而內容也會跟者縮放

    而在上面也用DrawImage繪了一個圖片來當按鈕,圖片有兩張一個是一般狀態一個是滑鼠在上面時的狀態

    並使用MouseMove事件來判斷滑鼠指標使否在那張圖片上,由於座標是固定的,若該控制項使用時調整過大小座標就會跑掉,

    要如何算出原始做標經過縮放後的同樣位置的對應座標呢?

    2011年6月13日 上午 08:23

所有回覆

  • 您好

    您提到 [若該控制項使用時調整過大小座標就會跑掉],您是怎麼調整控制項大小? 是否能在調整控制項時,更新您的座標值?


    歡迎參觀我的Blog.NET菜鳥自救會
    2011年6月13日 上午 08:37
    版主
  • 您好

    您提到 [若該控制項使用時調整過大小座標就會跑掉],您是怎麼調整控制項大小? 是否能在調整控制項時,更新您的座標值?


    歡迎參觀我的Blog.NET菜鳥自救會

    您好:

    我是指在VisualStudio開發環境中調整控制項大小,我不想每調一下大小就要改控制項內的程式碼,判斷滑鼠是否在某區域的程式碼如下:

        int x, y;
        bool isHover = false;
        private void UserControl1_MouseMove(object sender, MouseEventArgs e)
        {
          x = e.X;
          y = e.Y;
          if (x > 192 && x < 215 && y < 25 && y > 0)
          {
            sound = soundStatus.demute_hover;
            isHover = true;
          }
          else
          {
            sound = soundStatus.demute;
            isHover = false;
          }
          this.Invalidate();
        }
    


    若把控制項拉大,原本希望對應的X Y座標範圍就會跑掉,是否可算出改變大小後對應原本大小的座標值

     

    2011年6月13日 上午 09:26
  • 詳閱 大二數學 線性代數

    高中也有教,可由參數式來推 座標轉換

    線性代數 是教矩陣解,可推到無窮維度


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年6月13日 下午 02:41
  • 您好

    您的程式碼中,192, 215, 25, 0 等數值,是否為控制項的左上與右下角的座標?

    if (x > 192 && x < 215 && y < 25 && y > 0)

    是否能換成從抓取控制項左上角座標,右下角座標為左上角座標跟控制項Width跟Height做運算取得?

    另外,座標可能會需要使用 PointToClient 或 PointToScreen 處理


    歡迎參觀我的Blog.NET菜鳥自救會
    2011年6月14日 上午 01:03
    版主
  •  /// <summary>
        /// 得到经度和纬度
        /// </summary>
        /// <param name="lat"></param>
        /// <param name="lng"></param>
        /// <returns></returns>
        public decimal[] GetLatLng(decimal lat, decimal lng)
        {
          int PX, PY;
          decimal? PX1, PY1;
          decimal? OX;
          decimal? OY;
          decimal[] LatLng = new decimal[] { lat, lng };
          //传入两个参数 ,经度和纬度 ,然后返回经过解析的经度和纬度
          try
          {
            DAL.DeviceinfoDataSetTableAdapters.deviceinfoAdapter da = new DAL.DeviceinfoDataSetTableAdapters.deviceinfoAdapter();
            da.P_GETLATLNG(lat, lng, out OX, out OY);
            OX = Convert.ToDecimal(OX);
            OY = Convert.ToDecimal(OY);
            if (OX != 0 && OY != 0)
            {
              Map.LatLongToPixelXY(Convert.ToDouble(lat), Convert.ToDouble(lng), 18, out PX, out PY);
    
              PX1 = PX + OX;
              PY1 = PY + OY;
              LatLng[0] = Convert.ToDecimal(Map.PixelYToLat(Convert.ToDouble(PY1), 18));
              LatLng[1] = Convert.ToDecimal(Map.PixelXToLng(Convert.ToDouble(PX1), 18));
            }
          }
          catch (Exception ex)
          {
            throw ex;
          }
          return LatLng;
        }
    

    2011年6月14日 上午 06:55
  • 相關既有討論:

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=%e5%ba%a7%e6%a8%99%e6%98%a0%e5%b0%84

     

    http://social.msdn.microsoft.com/Search/zh-TW?query=%E7%B8%AE%E6%94%BE%20%E5%BA%A7%E6%A8%99&refinement=112&resultsLang=zh-TW&beta=0&ac=8


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年6月14日 下午 12:08
  • 您好:

    那個區域是在左上角沒錯,不過我還是想知道如何用座標轉換的方式算出,因為假如以後碰到不是在邊緣的座標就沒轍了

    我知道可以用數學的方式算出,不過剛好我大學唯一被當的科目就是和數學有關的,所以希望有人能幫忙

    我看過既有討論都沒有我需要的,那個GetLatLng函式似乎和我的問題沒關係,謝謝各位。

    2011年6月14日 下午 01:19
  • ...

    這個不是人幫你就可以的,因為圖是你的,座標是你的,所以別人能提供給你的就是公式,剩下代公式的工作是你要做。

    要公式,隨便找就有。但是又以數學不佳為理由... 你應該考慮轉職了。

     

    靜態變數需要三個:參考點、圖框、檢視框

    動態變數要三個:MouseDown 的開始點、MouseMove/MouseUp 的結束點、選擇框

    以選擇框取代檢視框,再重繪檢視框,就可以達到縮放的目的。

    (開始點、結束點在目前檢視框之外,就是縮小,大部分適用中心點反算來縮小,放大一般用選擇框,也有用中心點反算)

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年6月14日 下午 02:24
  •    if (x > 192 && x < 215 && y < 25 && y > 0)
    

    既然 image 是你自己產生的, 你沒辦法動態取得座標嗎? 自己把上面的 192, 215, 25 跟 0 改一下吧!

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    2011年6月17日 下午 05:51
  • 您好

    您提到 [若該控制項使用時調整過大小座標就會跑掉],您是怎麼調整控制項大小? 是否能在調整控制項時,更新您的座標值?


    歡迎參觀我的Blog.NET菜鳥自救會

    您好:

    我是指在VisualStudio開發環境中調整控制項大小,我不想每調一下大小就要改控制項內的程式碼,判斷滑鼠是否在某區域的程式碼如下:

     int x, y;
     bool isHover = false;
     private void UserControl1_MouseMove(object sender, MouseEventArgs e)
     {
      x = e.X;
      y = e.Y;
      if (x > 192 && x < 215 && y < 25 && y > 0)
      {
      sound = soundStatus.demute_hover;
      isHover = true;
      }
      else
      {
      sound = soundStatus.demute;
      isHover = false;
      }
      this.Invalidate();
     }
    


    若把控制項拉大,原本希望對應的X Y座標範圍就會跑掉,是否可算出改變大小後對應原本大小的座標值

     

    你好:

    如果你只是要偵測滑鼠是否圖片上的話,你可以宣告兩個全域欄位紀錄X,Y座標直,畫圖跟滑鼠偵測的時候都使用這兩個欄位。

    如果你要畫在控制項上面,你可以在 Control.Paint 事件 底下透過 Control.CreateGraphics 方法 

    建立Graphics執行個體,直接用這個執行個體把圖片畫在控制項上面就好了。

     

    PS: 控制項的當前座標跟大小都可以在程式碼下面查到,程式碼裡面盡量避免帶入常數。

    2011年6月17日 下午 11:21
  • Hi,

    為何不再UserControl上放個Panel

    直接將Panel設為所要的大小並放置到要顯示的地方

    設定其Anchor屬性讓Panel能配合UserControl自動縮放

    而繪製的動作就改為繪製到Panel上面

     

    另外Button控制項也可以指定外觀圖片~可以考慮直接採用現成的元件


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2011年6月20日 下午 02:07
  • 用 Panel 有個缺點,例如這篇的狀況:

    [VB2005]PictureBox 的大小限制


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年6月21日 下午 12:41