• [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를 바꾸면 리스트 박스가 자동으로 계산을 하지 않기 때문에 매 아이템의 길이를 확인하고 이를 적용해 줘야 한다. 루프를 돌려 모든 아이템의 너비를 확인한 뒤 제일 큰 값을…

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

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

  • [프로그래밍] 매개변수, 인수, parameter, argument의 차이

    이들은 모두 수학적 개념이자 용어들인데 컴퓨터 프로그래밍에서는 좀 다르게, 더 간단한 의미로 쓰인다. parameter는 프로씨저로 입렵되는 값을 받아서 담아 두는 변수이다. 흔히 매개변수 또는 보조변수라고 번역한다. 3. (programming) An input variable of a function definition, that gets an actual value (argument) at execution time.– wiktionary argument는 함수로 넘겨지는 값이다. 위 예제에서 1과 2다. 독립변수, 독립변인,…

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

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