c#

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

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

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

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

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

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

  • [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)하기

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