[c#] ListBox.SelctionMode = None이 작동하지 않는 문제의 해결

리스트 박스의 아이템을 클릭하면 파랗게 변한다. 이게 걸리적거려서 색이 변하지 않게 해야 할 때가 있는데 ListBox.DrawMode를 OwnerDrawFixed나 OwnerDrawVariable로 바꾸면 ListBox.SelectionMode = None이 되질 않고 클릭하는 거마다 다 파랗게 된다. 아래와 같이 하면 된다. 아예 새로 그려 버리는 거다.

c# SendMessage에 IntPtr은 굳이 쓸 필요가 없다

복잡하게 마셜링할 필요 없다. 문자열 보내는데 자꾸들 마셜링으로 코드를 복잡하게 하는 건 메떠드 선언을 잘 모르고 해서 그렇다. SendMessage의 레퍼런쓰를 보면 변수들의 타입이 제각각이다. Msg를 빼고는 결국 모두 포인터들인데 포인터라는 게 별 게 아니라 메모리상의 주소를 나타내는 정수다. 이런 걸 생각하지 못하고 IntPtr로 받으면 마셜링이라는 샛길로 빠져 헤매게 된다. string도 그렇다. 이거 자체가 포인터다. 따라서…

c#으로 c++ 헤더 속의 상수들 이용하기

c#을 이용하다 보면 윈도우즈 제어를 위해 c++ 메떠드를 써야 할 일들이 많다. 근데 레퍼런쓰에는 상수들의 이름과 설명만 나와 있고 그 값은 나와 있지 않은 경우들이 많다. c++ 개발 환경에서는 그냥 상수 이름만 입력하면 되니까 실제 16진수 값은 알 필요가 없지만 c#에서는 일일이 선언하고 초기화해 줘야 한다. c++ 상수들은 헤더 파일들 안에 담겨 있는데 이걸 보기…

[c#] 실수형을 반환하는 math.round와 숫자 타입의 형 변환

Rounds a value to the nearest integer or to the specified number of fractional digits.– Math.Round Method math.round는 분명히 정수를 반환하지만 이게 정수형으로 반환한다는 의미는 아니다. 이 메떠드는 정수를 double이나 decimal 같은 실수형으로 반환한다. 왜 이럴까? int, double, decimal에서 신뢰할 수 있는 자리수는 모두 다르기 때문이다. 더 구체적으로는 int의 그것이 제일 작아서 그렇다. 큰 자리수에…

c# ListBox 아이템의 문자열 정렬(align)하기

쎌의 문자열을 가운데에 두려면 번거롭지만 쎌 출력을 직접 제어해야 한다. 방법은 간단하다. 쎌과 문자열의 폭들을 각각 구한 뒤 이들의 차이를 반으로 나눈 지점에서부터 출력을 시작하면 된다. 그러나 구현을 하는 데에 있어서는 몇 가지 주의해야 할 것들이 있다. 우선 모든 단위들은 정수가 아니라 실수다. 따라서 정수로 구한 다음에 반올림을 하거나 형 변환을 하지 않도록 유의한다. 열이…

c# for와 foreach 성능 비교

foreach는 편하지만 느리다. 다섯 번 평균하니 for가 19, foreach가 24 나왔다. 그렇다고 for가 능사는 아니다. dictionary에서 루프를 돌리려면 foreach를 써야 한다.

[c#] 파일 존재 확인 방법 – File.Exists

파일을 읽으려 하는데 그 대상이 없으면 오류로 처리되어 멈춘다. try ~ catch 구문으로 예외 처리를 할 수 있지만 이 방법은 원인을 알 수 없거나 작동이 멈추는 상황을 절대적으로 막아야 하는 경우에만 최후의 수단으로 써야 한다. 특히 이 구문은 부하가 크기 때문에 루프에서는 이용하지 않는 게 좋다. 제일 좋은 방법은 File.Exists 메떠드를 이용하여 조건문으로 사전 처리를…