none
可以繪圖在螢幕上嗎?(不是Form、PictrureBox...) RRS feed

  • 問題

  •  

    我要想要繪圖,把圖畫在螢幕的最前端

     

    我要畫的只是一張小圖,我想要讓這張小圖把目前螢幕上所顯示的畫面的一部份給覆蓋掉...

     

    這要怎麼做?  用WinAPI嗎?

    2007年10月29日 下午 12:30

解答

  • 可以,用 API 抓 DesktopWindow 的 hDC 畫在上面。

     

    但是各自的軟體皆會自動維護螢幕,你畫上去的東西維持不了多久,滑鼠經過也會消除,不如做一個小的無邊框視窗蓋上去。

     

    2007年10月29日 下午 02:32
    版主
  • HI  邦:

     

    根據 連大   所說 

    我寫了一個 範例 給你 參考看看  ︿︿ 

     

    程式碼區塊

     

    Public Class Form1

        Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As IntPtr) As IntPtr
        Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As IntPtr


        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            ' Get a handle to the desktop window
            Dim hdc As IntPtr = GetDC(IntPtr.Zero)


            Dim SG As Graphics


            SG = Graphics.FromHdc(hdc)

            ' Create solid brush.
            Dim blueBrush As New SolidBrush(Color.Blue)

            ' Create rectangle.
            Dim rect As New Rectangle(0, 0, 200, 200)

            ' Fill rectangle to screen.
            SG.FillRectangle(blueBrush, rect)

     

            SG.Dispose()

     

            ReleaseDC(IntPtr.Zero, hdc)

     

        End Sub
    End Class

     

     

    2007年10月30日 上午 02:14
  • GetDC

    http://msdn2.microsoft.com/en-us/library/ms533241.aspx

     

    IntPtr.Zero 代表:

    Handle to the window whose DC is to be retrieved. If this value is NULL, GetDC retrieves the DC for the entire screen.

     

    另外一種包裝法,取得螢幕上指定位置的 hDC:

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=32

    2007年10月30日 上午 11:49
    版主

所有回覆

  • 可以,用 API 抓 DesktopWindow 的 hDC 畫在上面。

     

    但是各自的軟體皆會自動維護螢幕,你畫上去的東西維持不了多久,滑鼠經過也會消除,不如做一個小的無邊框視窗蓋上去。

     

    2007年10月29日 下午 02:32
    版主
  • HI  邦:

     

    根據 連大   所說 

    我寫了一個 範例 給你 參考看看  ︿︿ 

     

    程式碼區塊

     

    Public Class Form1

        Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As IntPtr) As IntPtr
        Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As IntPtr


        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            ' Get a handle to the desktop window
            Dim hdc As IntPtr = GetDC(IntPtr.Zero)


            Dim SG As Graphics


            SG = Graphics.FromHdc(hdc)

            ' Create solid brush.
            Dim blueBrush As New SolidBrush(Color.Blue)

            ' Create rectangle.
            Dim rect As New Rectangle(0, 0, 200, 200)

            ' Fill rectangle to screen.
            SG.FillRectangle(blueBrush, rect)

     

            SG.Dispose()

     

            ReleaseDC(IntPtr.Zero, hdc)

     

        End Sub
    End Class

     

     

    2007年10月30日 上午 02:14
  •  cmf 寫信:

    HI  邦:

     

    根據 連大   所說 

    我寫了一個 範例 給你 參考看看  ︿︿ 

     

    程式碼區塊

     

    Public Class Form1

        Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As IntPtr) As IntPtr
        Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As IntPtr


        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            ' Get a handle to the desktop window
            Dim hdc As IntPtr = GetDC(IntPtr.Zero)


            Dim SG As Graphics


            SG = Graphics.FromHdc(hdc)

            ' Create solid brush.
            Dim blueBrush As New SolidBrush(Color.Blue)

            ' Create rectangle.
            Dim rect As New Rectangle(0, 0, 200, 200)

            ' Fill rectangle to screen.
            SG.FillRectangle(blueBrush, rect)

     

            SG.Dispose()

     

            ReleaseDC(IntPtr.Zero, hdc)

     

        End Sub
    End Class

     

     

     

    請問          Dim hdc As IntPtr = GetDC(IntPtr.Zero)   這行是什麼意思?   GetDC 傳入的  IntPtr.Zero <<< 這表示什麼     MSDN的說明我有看沒有懂

     

    GetDC 這個涵式可以取得任何作用中程式的hdc嗎?  如果可以的話,要如何取得呢?

    2007年10月30日 上午 11:44
  • GetDC

    http://msdn2.microsoft.com/en-us/library/ms533241.aspx

     

    IntPtr.Zero 代表:

    Handle to the window whose DC is to be retrieved. If this value is NULL, GetDC retrieves the DC for the entire screen.

     

    另外一種包裝法,取得螢幕上指定位置的 hDC:

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=32

    2007年10月30日 上午 11:49
    版主
  •  璉璉 寫信:

    可以,用 API 抓 DesktopWindow 的 hDC 畫在上面。

     

    但是各自的軟體皆會自動維護螢幕,你畫上去的東西維持不了多久,滑鼠經過也會消除,不如做一個小的無邊框視窗蓋上去。

     

     

    的確,我去取得hdc來畫,畫上去的圖案一下子就被清掉了,所以我用了Timer (也試過無窮迴圈+doevents  但迴圈吃CPU),每隔1毫秒畫一次,但是被我畫的軟體畫面refresh的速度之快....我畫上去的圖變成一閃一閃的,有時候還看不到!

     

     

    關於璉大大的方法─做一個無邊框的視窗蓋上去

    這樣一來,當我滑鼠不小心點到那個無邊框式窗的話,focus不就跑過去了嗎?  我不想要focus跑到那個視窗去,0.1毫秒都不行...

     

     

    請問還有別的方法可以解決嗎?     沒有的話也沒關係...

    2007年10月30日 下午 01:55