推 cross0619:感動 總算有人回答了 非常感謝這位大大的指導 07/02 18:16
※ 引述《cross0619 ()》之銘言:
: 各位好 小弟我在網路上頭查到的方法有兩個
: 一.
: public partial class Form1 : Form
: {
: public Form1()
: {
: InitializeComponent();
: }
: [DllImport("Gdi32.dll")]
: public static extern int GetPixel(System.IntPtr hdc,int nXPos,
: int nYPos);
: private void Form1_MouseDown(object sender, MouseEventArgs e)
: {
: Graphics g = CreateGraphics();
: System.IntPtr hDC = g.GetHdc();
: int c = GetPixel(hDC, e.X, e.Y);
: }
: }
依此範例來看,若Form1有子控制項的話,必需註冊子控制項的MouseDown事件。
: 而且方法中提到需using System.Runtime.InteropServices;
: 二.
: public partial class Form1 : Form
: {
: public Form1()
: {
: InitializeComponent();
: }
: private void Form1_MouseDown(object sender, MouseEventArgs e)
: {
: int a = 0;
: a = this.GetChildAtPoint(new Point(e.X,e.Y)).ForeColor.ToArgb();
: }
: }
依範例來看的話,GetChildAtPoint如下
//
// 摘要:
// 擷取位於指定座標的子控制項。
//
// 參數:
// pt:
// System.Drawing.Point,包含您要尋找控制項之處的座標。座標以和控制項工作區左上角相對的位置表示。
//
// 傳回:
// 表示位於指定點上的控制項的 System.Windows.Forms.Control。
當Form1的MouseDown事件被觸發時,因為依所傳入參數而得到傳回null,也就是找不到Control
而此時null被當成參考物件,且物件的方法被呼叫時,CLR就會擲回NullReferenceException。
: 這兩個方法小弟我是完全不了解...第一次使用這個東西
: 第一個方法雖然可行 但是卻只能夠抓沒有被元件覆蓋到的座標
: 就是說 有元件的地方點了沒有用
: 第二個方法則是完全沒用 只要執行就會跑出"並未將物件參考設定為物件的執行個體"
: 究竟第二個方法是哪裡出問題呢 new一個Control來執行也不行(這方式感覺有點蠢...)
即使Control在Runtime是屬於Form1的子控制項,但還是要讓該控制項能觸發所需事件(ex. MouseDown)
這樣才能根據該控制項事件的觸發,執行事件內容(取得當時座標顏色)
: 第一個方法雖然可以使用 但我真正需要的是"某個座標的顏色"
: 請知道方法的大大們指導一下了
: 可以的話 也請順便解釋一下第一個方法到底是在寫什麼...完全看不懂
: 先謝過了
※ 編輯: ckiori 來自: 220.130.184.10 (07/01 10:42)