고백하자면 저는 10년 5월까지는 어플리케이션을 개발하기 위해서는 win32api를 쓰던 사람입니다. 그러나 군에서 뭔가 거대한 어플리케이션을 만들어야 하는데 몹시 노가다스러운 프로그램이었습니다. 개발 계획서를 살펴보니, '아.. 이걸 다이얼로그 박스로 하면 나는 죽겠구나..' 라는 생각이 들었습니다. 그래서 결국 저는 군대에서 꺼려하던 2가지를 모두 하게 되었습니다. 하나는 웹이고, 하나는 닷넷이지요. 둘 다 하게 되었습니다. 하하.

 저는 내부적으로 컨트롤 할 수 있는 상황을 좋아합니다. win32api를 좋아했던 이유도 제 맘대로 지지고 볶고 할 수 있었기 때문인데요. 하지만 사람이 편리함 앞에서는 한낮 미물이 되나 봅니다. 써보니 참 편하더군요 닷넷.. 으음..

 어쨌든 이번에 일이 있어서 PictureBox로 동적으로 무언가를 생성해야 하는 일이 있었습니다. 제가 군에서 만들었던 어플리케이션과 제가 만든 웹 페이지들은 특별한 요구가 없는 이상 '그림'이 없습니다. 저는 그림을 싫어하니까요. 못 그리는 데다가 예쁘게 꾸밀 미적 감각도 없습니다. 그러니까 안 넣어요. 저는 단색 조합이 좋으며, 넣어봤자 파스텔톤의 연녹색 같은 것 밖에 색을 넣지 않습니다. 그 외에는 저에겐 너무 무리한 요구입니다. 어려워요.

 어쨌든 제가 만들고 있는 건 현재 '초 허접' 맵 에디터입니다. 요 근래 독감도 들고, 악재가 겹쳐서 진도가 몹시 안 나가지만 그래도 하루에 순수 집중하는 시간으로는 3~4시간, 뻘 행위를 하면서 이걸 하고 있다는 위안으로 웹 서핑과 메신저를 하는 시간을 포함하면 6~7시간은 이걸 잡고 있는 것 같습니다. 

 저는 배치해놓은 컨트롤을 이용해서 지지고 볶는 건 자신 있습니다. 즉 노가다는 자신이 있습니다! 그러나 동적으로 그림을 넣어야 한다는 사실은 저를 몹시 힘들게 했습니다. 아오 힘들어. 하지만 뭐 동적으로 다른 컨트롤이야 몇 개 추가해 봤으니까 이런 일은 쉽지 않을까 싶더군요.

 우선 제가 만들고 있는 맵에디터(라고 부르기 부끄러운)의 스크린 샷입니다.


 초.. 허접한 그림의 퀄리티. 그러나 저는 분명히 저것을 그리기 위해 타블렛과 2시간을 씨름을 했습니다. 그 거대하고 비싼 타블렛으로 저런 그림을 그리려니 참으로 타블렛에게 미안한 생각 뿐이었습니다. 그 타블렛은 제 모니터 만했지요...

 음.. 이미지를 저렇게 이미지 위에 동적으로 할당을 해야 하는데, 저는 PictureBox 컨트롤을 이용해서 했습니다. 

우선 가장 큰 문제는 이것이었습니다. 

"이미지를 어떻게 동적으로 추가하지?"

이 부분에 대해서는 저번글에도 언급되는 실명으로 부르지 않아 부끄러운 다람군(-_-;) 이 도움을 주었습니다. 저는 win32api를 하듯 그냥 dc를 얻어서 뿌리면 되겠지! 라고 생각했지만 땡이더군요. 

일단 그래서 무작정 개체를 생성해서 띄워보기로 했습니다.

아. 안나와요. 뭐야 이거. -_-

그랬더니 다람군이 this.Controls.Add 라는 메서드를 호출해 보라고 하더군요. 하지만 역시 안나와요.

그래서 '안나와!'라고 했더니, 컨트롤 위에 추가할 꺼면 컨트롤 마다 저 메서드가 있을 것이라며 저에게 알려주었습니다.

오오 되더군요.

그래서 저의 해결 방식은 다음과 같았습니다. 

syntaxHighlighter를 지우고 이건 Windows Live Writer로 쓰는 것도 아니니 소스가 안 예쁜건 양해를 바랍니다 - -;

우선.... 그려야 할 것 들을 List 를 이용해 등록을 합니다. 맵 에디터다 보니까 화면에 표현을 할지 말지도 결정을 해야하고, 그 화면에 나올 것들만 출력해야 하므로 우선 리스트로 정리를 합니다.

PictureBox p = new PictureBox();
                    p.Left = el.m_coordinate.X - m_mapCoordinate.X - imageSize.X / 2;
                    p.Top = el.m_coordinate.Y - m_mapCoordinate.Y - imageSize.Y / 2;
                    p.Width = imageSize.X;
                    p.Height = imageSize.Y;

                    p.Image = image;
                    p.Visible = true;

                    p.BackColor = Color.Transparent;

                    p.Click += new EventHandler(clickObject);

                    p.Show();

                    m_drawingList.Add(p);

그리고 나서 아래 리스트에서 컨트롤에 등록을 해 줍니다.

foreach (PictureBox p in m_drawingList)
            {
                pictureBox1_map.Controls.Add(p);
            }


그렇게 했더니 위에와 같이 출력이 가능하게 되었습니다. 올레!

뭐 사실 블로그에 적는 이유는 나중에 똑같은 삽질을 할 때 찾아보자는 의도이지만, 뭐 어쨌든 그렇습니다.

저렇게 해서 해결을 봤습니다.

* 음.... 틱톡이란 주제로 글을 썼더니 투데이가 갑자기 급상승하는군요... ( - -); 다음부터 좀 이런 주제로 글을 써 볼까 생각 중입니다. 그러나 저의 게으름엔 자비가 없죠.

 
Posted by TY
,