비주얼 스튜디오 윈도우즈 폼즈 dpi-unaware 알림 끄기

디스플레이 패널이 클수록 더 많은 픽셀들이 구현된다. 예를 들어 작은 모니터에서 100 * 100 픽셀의 크기로 만들어진 객체는 더 큰 모니터에서는 상대적으로 더 작게 보인다. 이 문제를 해결하기 위해 윈도우즈는 자동으로 배율scale을 바꾼다. 이 설정은 윈도우즈의 디스플레이 설정 창에서 확인할 수 있다. 특정 배율 환경에서 윈도우즈 폼즈 앱을 만들면 다른 배율에서 다르게 보일 수 있다….

[c#] 클래쓰를 직렬화하여 파일로 저장하기

밸류 타입 데이터를 메모리나 파일에 저장할 경우에는 그냥 순서대로 write하거나 시작 메모리 주소와 전체 크기를 지정하여 한꺼번에 write하면 되지만 레퍼런쓰 타입은 이렇게 하면 주소만 저장된다. 이런 문제를 피하기 이해 저장할 데이터를 바이트의 형태로 나열하는 걸 serialize한다고 한다. 델파이와 달리 .네트에는 씨리얼라이즈하기에 편한 클래쓰들이 준비되어 있다. 최근까지는 BinaryFormatter가 많이 이용되었지만 마이크로쏘프트는 이걸 이제는 이용하지 말고 XmlSerializer나…

[c#] goto를 써야 할 때

흔히들 goto는 가급적 쓰지 말라고 한다. 나도 좋아하지는 않는다. 레퍼런쓰는 아래와 같은 경우 완전히 빠져나오고 메떠드를 분리하는 걸 권한다. When you work with nested loops, consider refactoring separate loops into separate methods. That may lead to a simpler, more readable code without the goto statement.– Jump statements – break, continue, return, and goto 그러나 늘…

[c#] 정적 멤버가 정적이지 않은 멤버에 접근할 수 없는 이유

정적 메떠드와 프라퍼티는 static 선언이 되지 않은 필드와 이벤트에 접근할 수 없다. 정적 멤버는 프로그램이 실행될 때 로드되는데 이때 정적이지 않은 멤버는 로드되지 않은 상태이기 때문이다. If your class contains static fields, provide a static constructor that initializes them when the class is loaded.– Static Classes and Static Class Members (C# Programming Guide) 참고로 여기에서…

[c#] 클래쓰 인스턴쓰를 IntPtr로 변환하기

c# 프로그래밍만 할 때에는 이럴 일이 없는데 c++이나 델파이로 만든 dll을 이용한다면 클래쓰나 구조체를 포인터로 넘겨줘야 하는 경우들이 많다. 포인터는 메모리의 주소를 나타내는 결국 정수다. 특정 객체가 위치해 있는 메모리상의 위치와 그 크기만 안다면 어디에서부터 어디까지 그대로 넘겨서 데이터를 전송할 수 있다. 정수 두 개만 제어하면 되니까 아마도 대부분의 경우 정수 두 개보다는 훨씬 크기가…

c#과 델파이의 정수 나누기 결과 차이

델파이의 경우 단순하다. 무엇을 무엇으로 나누던 그 결과를 그대로 반환한다. 예를 들어 1/2를 정수 변수에 반환하려 하면 오류로 처리된다. 그러나 c#에서는 복잡하다. 정수를 정수로 나누면 정수 즉 몫만 반환한다. For the operands of integer types, the result of the / operator is of an integer type and equals the quotient of the two operands rounded…

[c#] ListBox.SelectionMode를 none으로 하면 DataSource 오작동

리스트박스의 쎌렉션 모드는 one이 기본값이다. 이대로 출력을 하면 늘 아이템 하나가 파랗게 선택되어 있는데 아이템을 선택할 일 없이 그저 출력만 하는 게 목적이라면 이게 걸리적거린다. 이걸 없애려고 none으로 바꾸면 DataSource가 작동을 하지 않아 내용이 바뀌어도 출력이 되질 않는다. 오래된 오류이지만 수정되지 않고 있다. 리스트박스 대신 ItemsControl을 쓰면 되지만 아래와 같이 하는 게 더 간단하다.

[c#] ListBox 아이템의 색 설정하기

리스트 박스 아이템의 색을 설정하려면 DrawMode를 바꿔야 한다. 이걸 바꾸면 직접 제어하겠다는 거다. 크기도 바꿀 수 있다. 이럴 땐 variable로 선택한다. 아래 예제는 특정 아이템을 골라서 색을 바꾸는 거다. 다 그린 다음에 리스트 박스에서 루프를 돌리는 거보다 리스트에 담을 때 표시를 하는 게 좋다. 눈에 보이지 않는 탭 문자를 아이템의 끝에 붙여서 색을 다르게 할 아이템을 구별했다.

[c#] ListBox의 수평 스크롤바가 보이지 않는 문제의 해결

아이템 출력 색을 바꾸거나 하기 위해 ListBox.DrawMode를 normal 아닌 거로 변경하면 HorizontalScrollbar를 true로 해도 보이지 않는다. 이럴 땐 HorizontalExtent를 설정해 줘야 한다. HorizontalExtent는 스크롤바를 적용할 폭을 설정하는 거다. DrawMode를 바꾸면 리스트 박스가 자동으로 계산을 하지 않기 때문에 매 아이템의 길이를 확인하고 이를 적용해 줘야 한다. 루프를 돌려 모든 아이템의 너비를 확인한 뒤 제일 큰 값을…