none
폼 바깥쪽 그리기 RRS feed

  • 질문

  • [DllImport("USER32.DLL")]
            public static extern IntPtr GetDC(IntPtr
    hWnd);
            [DllImport("USER32.DLL")]
            public static extern
    IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);

     public void draw()
            {
                Rectangle bb = new
    Rectangle(this.Left, this.Top - 10, this.Width, 10);
                IntPtr
    desktopPtr = GetDC(IntPtr.Zero);
                Graphics g =
    Graphics.FromHdc(desktopPtr);
                g.FillRectangle(new
    SolidBrush(Color.Black),bb);
                ReleaseDC(this.Handle,
    desktopPtr);
            }

    이렇게 폼 바깥쪽에 상자를 그렸는데요. GetDC로 얻은 걸로 그리면 무효화해서 다시그리는건  폼쪽만 되더라구요.

    원래는 폼과같이 바깥쪽에 만든 상자도 같이 움직이게 할려는 목적었습니다. 하지만  움직여도 기존에 그려졌던 상자는 그대로

    남아있고 새로 그려집니다.  어떻게 해야 한번 그린 상자를 같이 움직일수 있을까요?

    2016년 1월 17일 일요일 오전 9:43

모든 응답

  • [DllImport("USER32.DLL")]
            public static extern IntPtr GetDC(IntPtr
    hWnd);
            [DllImport("USER32.DLL")]
            public static extern
    IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);

     public void draw()
            {
                Rectangle bb = new
    Rectangle(this.Left, this.Top - 10, this.Width, 10);
                IntPtr
    desktopPtr = GetDC(IntPtr.Zero);
                Graphics g =
    Graphics.FromHdc(desktopPtr);
                g.FillRectangle(new
    SolidBrush(Color.Black),bb);
                ReleaseDC(this.Handle,
    desktopPtr);
            }

    이렇게 폼 바깥쪽에 상자를 그렸는데요. GetDC로 얻은 걸로 그리면 무효화해서 다시그리는건  폼쪽만 되더라구요.

    원래는 폼과같이 바깥쪽에 만든 상자도 같이 움직이게 할려는 목적었습니다. 하지만  움직여도 기존에 그려졌던 상자는 그대로

    남아있고 새로 그려집니다.  어떻게 해야 한번 그린 상자를 같이 움직일수 있을까요?

    안녕하세요.

    소스중에 보면,

    Rectangle bb = new Rectangle(this.Left, this.Top - 10, this.Width, 10);

    bb 로 새로운 상자객체를 생성하셨는데, 이 bb 를 어딘가 넣어두셔야 할것 같습니다.

    각 상자들은 고유의 인스턴스를 가지고, 접근가능한 주소를 가지고 있습니다.

    그런데, 이 bb 를 매번 새롭게 생성하고 계시므로 마지막에 생성된 bb 에 대해서만 접근이 가능하시겠죠.

    public 선언으로 object 배열구조체에 bb 를 생성하면 매번 넣어두는식으로 하면,

    생성되어있는 객체에 원하는 타이밍에 접근이 가능합니다.


    프로그램 개발에는 정답이 없다.

    • 답변으로 제안됨 Sungman KOMVP 2016년 1월 18일 월요일 오전 1:08
    2016년 1월 18일 월요일 오전 1:08
  • 답변 감사드립니다.^^

    배열구조체를 어떤식으로 만들어야할지 모르겠습니다. ㅜㅜ 가능하시다면 소스를 적어주시면 감사하겠습니다.

    2016년 1월 18일 월요일 오전 2:33
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            [DllImport("USER32.DLL")]
            public static extern IntPtr GetDC(IntPtr hWnd);
            [DllImport("USER32.DLL")]
            public static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);
    
             public void draw()
            {
                Rectangle bb = new Rectangle(this.Left, this.Top, this.Width, 10);
                aa.Add(bb);
    
                IntPtr desktopPtr = GetDC(IntPtr.Zero);
                Graphics g = Graphics.FromHdc(desktopPtr);
    
                for (int i = 0; i <= aa.Count - 1; i++)
                {
                    aa[i] = new Rectangle(aa[i].Left, aa[i].Top - 100, aa[i].Width, 10);
                    g.FillRectangle(new SolidBrush(Color.Black), aa[i]);
                }
    
                ReleaseDC(this.Handle, desktopPtr);
            }
    
            public Form1()
            {
                InitializeComponent();
            }
    
            List<Rectangle> aa = new List<Rectangle>();
    
            private void Form1_Load(object sender, EventArgs e)
            {
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                draw();
            }
        }
    }
    

    요런식으로 한번 해보세요.

    동작확인은 했습니다.

    시간이 없어서 초기화에 대해서는 만들지 않았는데

    담겨있는 객체 전부를 버튼 클릭시에 전부다 다시 생성하도록 하였습니다.

    담겨있는게 1 부터 5 까지라면, 

    1

    12

    123

    1234 를 찍어내도록 해두었는데, 위의 소스를 보시면 어느정도 감이 오실껍니다.

    만약에 누른 상태에서 현재 1234 를 뿌려야한다면, for 문 직전에 현재 화면상의 사각형을 전부 클리어하는 처리를 하면 됩니다.

    동작확인은 하였으니 참고하세요 ^^



    프로그램 개발에는 정답이 없다.

    • 답변으로 제안됨 Sungman KOMVP 2016년 1월 18일 월요일 오전 7:55
    2016년 1월 18일 월요일 오전 7:55