C#.NET Q&A

윈폼은 MS에서 버리는 기술인가요? 호비스 평점: 없음 조회: 1006
안녕하세요.
플래시와 자바개발을 주로 해왔던 개발자입니다.
오늘 가입하고 처음으로 인사드립니다. ^^

C#이란 언어에 매료된지 이제 2년정도 되어 가는데요.
그동안 C#은 다른언어에 비해 참 많은 편의성을 제공하는구나 하며 생각해 왔습니다.
물론 자연스럽게 가장경쟁이 되는 자바라는 언어와도 비교가 되었구요.
개인적인 입장에서의 자바와 씨샵의 장단점을 매우 많이 저울질 해보기도 하였습니다.

거두하고...

자바언어를 조금아는 상태에서 C#의 기초가 되는 책을 2권정도 읽고
예전에 비주얼베이직을 한적이 있어서 닷넷의 윈폼(System.Window.Form)에
관심이 많아졌습니다. 그래서 이런저런 유틸프로그램들을 만들어보고 있지요.
BathCopy(파일카피매니저프로그램), FlashPlayer Log분석 프로그램, XML작성도우미 프로그램 등...
실무환경에서 꼭좀 만들어 사용해 보려고 했던 프로그램들 이었습니다.
VC++로 Win32 api를 조합하여 만드는것보단 생산석이 높고
메모리관리를 편리하게 해주는 CLR의 도움을 받아 쓸만한 프로그램들을 만들어 보려고 했습니다.
그런데 제가 잘 사용을 못해서 그런건지 아니면 윈폼이라는 닷넷의 기술자체가
잘 사용되지 않아서 그런지 버그가 많은거 같더군요.

예를들어 RichTextBox의 경우 다수의 줄에 해당하는 텍스트들을 Text속성으로 넣어주고
Clear()를 하면 스크롤바의 잔상이 남아있습니다.
또 ListBox와 ListView의 경우 8만여건의 Item을 넣으면 스크롤바가 오작동하는 버그도 있더군요.
아 개인적으로 참 실망스러운... ㅠㅠ
Java의 Swing보단 완성도가 떨어지는걸 느꼈습니다.
물론 WPF를 사용해 보는것도 좋겠지만 저는 예전 비주얼베이직 스타일의 컨트롤기반
어플리케이션을 만들어보고 싶어서 윈폼을 시작하였습니다.

정말 윈폼은 윈32기반의 api인터럽트와 훅을 사용하지 않고서는
Paint.NET FlashDevelop과 같은 프로그램을 만들수 없는건가요?

ps: 정말 그리하다면 Win32 API부터 다시 공부를 해야겠습니다.

태그 : 닷넷, 윈폼
작성자 정보
호비스
Level 16
 [EXP.26/70]

메일:  비공개

글등록 +12 180 덧글등록 +3 96
자기소개
Flash, JavaScript, Java, C# 안녕하세요.
글 공유하기 |
  tweet facebook
2013-03-04 오후 2:17:50
나도한마디
사용자
Lookvv            [2013-03-05]
Level 45
 [EXP.98/100]
RichTextBox인 경우는 clear 시 undo데이타를 지워주지 못한다고 하네요. 그래서 clear() 호출시 ClearUndo() 까지 해주어야 합니다. 이 사이트를 참조하세요: http://blogs.lessthandot.com/index.php/DesktopDev/MSTech/winforms-richtextbox-and-a-memoryleak
사용자
Lookvv            [2013-03-05]
Level 45
 [EXP.98/100]
listbox는 update시 그렇다는 말인가요? 업데이트시 BeginUpdate 와 EndUpdate 사용하셨나요?
사용자
호비스            [2013-03-05]
Level 16
 [EXP.26/70]
lookvv님 덧글 정말 감사드립니다.
혼자 독학으로 공부하면서 문제점을 해결하려고 하니 참 힘드내요 ㅋ
첫번째 RichTextBox의 경우 말씀하신데로 ClearUndo를 사용해 보도록 하겠습니다.
조언 감사드리구요.

ListBox는 문제가 되는 예제샘플을 밑에 보여드리도록 하겠습니다.
물론 제가 C#은 초보인지라 잘못 작성하였을수도 있습니다.


private void Form1_Load(object sender, EventArgs e)
{
this.listBox1.BeginUpdate();
for (int i = 0; i < 80000; i++)
this.listBox1.Items.Add("아이템 " + i.ToString());
this.listBox1.EndUpdate();
}

이렇게 안에 추가되는 아이템의 개수가 약 8만개정도가 넘으면
스크롤바가 오작동하는 버그가 있는것 같습니다. (PC사양이나 환경에 따라 다를수 있음)
하여 데이터를 한번에 넣어도 이런현상이 발생하는게 해서

List<string> t_list = new List<string>();
for (int i = 0; i < 80000; i++)
t_list.Add("아이템입니다.");
this.listBox1.DataSource = null;
this.listBox1.DataSource = t_list;

하여도 같은 현상이 나타났습니다.
(스크롤 바를 쭉 내리면 처음 아이템들이 노출되면서 스크롤(Thumb)이 위로 올라가는 문제)

이거 버그인가요 아니면 Win32 인터럽트를 이용하여 조정을 해야 하나요?

지금 이 문제 때문에 WPF를 사용해 보려고 검토중에 있습니다.
저는 WinForm이 C#이라는 언어와 VisualBasic이라는 객체지향 언어의 위해
Win32 API를 고도로 추상화한 기술이라고 생각을 했었는데
제 예상은 보기좋게 어긋나 버렸내요. ㅠㅠ
Java의 Swing처럼 거의 모든 컨트롤의 세밀한(스크롤바의 위치, 색상...) 부분을
추상화된 API단에서 모두 제공해 줄줄 알았는데 Win32 인터럽트를 사용하지 않고서는
좀 최적화된 윈도우 어플을 개발하기가 쉽지 않겠다는 벽에 붙이쳐 버린거죠 ㅋ

여튼 답변 정말 감사드리구요. 위체 버그사항 한번 확인해 보셔요.
감사합니다.

참고로 어제 저는 민을 해보다가 WPF를 사용해 보려고 검토중에 있습니다.
사용자
Lookvv            [2013-03-05]
Level 45
 [EXP.98/100]
검색해보니 winform의 listbox는 스크롤링할때 16비트 메시지를 이용한다고 하네요. 그래서 listbox에서 65536 개 이상을 보여주는 것은 피하는게 좋구요. 또한, listbox에서 몇 만개의 데이타를 한꺼번에 보여주는 프로그램은 별로 좋지 않죠. winform팀도 그 정도는 예상하지 못했고 또한 권장하지도 않고요.

또다른 사람은 os가 vista 인 경우에 위의 문제가 발생하는 경우도 있다고 합니다.

아무튼 대용량의 데이타를 한꺼번에 보여줄려면 listview 나 DataGridView의 virtual mode를 알아보세요.
사용자
호비스            [2013-03-05]
Level 16
 [EXP.26/70]
Lookvv님 감사드립니다.
덕분에 많은걸 배워갑니다 ^^
사용자
xenon            [2013-03-05]
Level 52
 [EXP.203/250]
8만개의 아이템을 listbox에 넣는다라...
WPF로 하면 아마 성능상에서는 훨씬 떨어질겁니다.
사용자
호비스            [2013-03-05]
Level 16
 [EXP.26/70]
먼저 답변 감사드립니다.

제가 테스트를 해본결과
WPF에 ListBox에 AddItem을 해본결과
10만여건의 아이템을 등록해도 오히려 Winform보다
좋은 퍼포먼스를 보여주는거 같았습니다.
물론 실제로 사용하는 경우에 따라 달라질 경우도 있겠지만요.

여튼 계속해서 테스트 해보고 좋은 정보가 발생하면 글 올리도록 하겠습니다.
C#선배님들 감사합니다. ^^
글리스트
쓰레드 질문드려요[5]+7 파일첨부 일라이자
C# 고수님들, 후배가 소켓통신 관련 문의 드립니다. [13]+8  아힘들다
채팅 질문입니다.[1]+1  거저먹네
프로그램 설치경로 알아오기[2]  손뎅
트리뷰 노드에 정보를 넣어서 관리 하려면 어떤 방법을 쓰는게 좋을까여?[5]  버섯먹은나
c#입문자인데....정말간단한 질문하나 드리겟씁니다[2]  훈스남훈남조으다
Windows 7 이상의 운영체제의 닷넷 배포율???[1]+1  호비스
new 질문입니다.[4]+1  일라이자
64Bit에서 컴파일한 exe를 32Bit XP 에서 실행하려면 어떻게 해야하나요 ? [2]  Dejavu
C# 에서 태블릿PC 접근 방법 질문입니다.[1]  시험모드
 ★현재글->   윈폼은 MS에서 버리는 기술인가요?[4]+3  호비스
progress bar질문입니다.[1]+1  일라이자
C# .Net 2.0에서 폴더를 압축하는 방법 문의[1]  Dr.GT
VS 2010 - 해당 프로젝트 에러 메시지 안뜨도록 할 수 있나요?[1]  이십사
용어가 너무 혼동돼요[1]  이유진
게시 오류 질문좀요[2]  버섯먹은나
폼 간의 포커스 이동에 관한 질문입니다.[1]  deeps
(FileSystemWatcher를 이용한)원격 폴더 감시  sjoowon
폼 강제종료 후 자동 재시작관련 질문드립니다 ㅠ[1]  나이스에요
[RE] 폼 강제종료 후 자동 재시작관련 질문드립니다 ㅠ  용가라
이벤트핸들러 질문입니다  훈스남훈남조으다