와이걸로 3일을 고생했다.아무리 검색해도 안나와서 정말 삽질이 심했다. 삽질 결과를 공유한다. 2차원 배열에 담긴 데이터를 보여주는 TTGridView를 만들었다.쉽게 그냥 ColumnCount와 RowCount 만큼의 행열을 만들어서 데이터를 보여주는 간단한 유저 컨트롤이다. 그런데... attribute로 값을 넘기고 싶은데... 아무리 검색해도 그냥 user control의 cs 파일 내에 property 만들면 된다고 하는데..안되더라 public int ColumnCount { get; set; }public int RowCount { get; set; }일단 선언 자체는 위처럼 했고.. 진짜 별의 별.. 의존성 프로퍼티니 뭐니 다 시도했는데가장 큰 문제는생성자에서 ColumnCount와 Row..
WPF를 처음 접하면서 제일 어려운 개념이 바로 '바인딩'이다.이제 개념을 차근차근 알아가는 중인데... 여러가지 실험을 해봤고 그 결과를 여기에 올린다. 우선 MainWindow.cs 파일에 아래와 같이 ObservableCollection 두개(멤버변수와 프로퍼티)를 두었다.public ObservableCollection collections;public ObservableCollection Collections { get { return collections; } set { collections = value; } } 그리고 item을 아래와 같이 추가했다.public MainWindow(){ InitializeComponent(); collections = new ObservableCollect..
2012년 7월 23일 판올림 2010년 5월 4일 재수정 합니다. 제목은 거창한데... 사실.. 나도 정확히 모른다. 이글을 보는 사람들은 말할것이다. 처음 보시는 분은 정확한 사용법을 알려준다고 해놓고선 웬 낚시글이나.. 그리고 나를 잘아는 사람들은 아니 댁처럼 잘쓰는 사람이? 모른다고 그러면? 사실.. 말해서.. 우리나라 같은경우 쓰는게 다 일룰적이고 알고리즘 적으로 한눈에 보면 아 뭐하는 옵션이다라고 알수있지만.. 사실.. 우리나라에서 한발자국만 나가보면.. 기본에서 나오는것을 완전 무시한 for문을 돌리고 있는데도 잘만 먹는 즉 우리에게 아직 혹은 전문적으로 않알려진 숨겨진 방법들이 많지만.. 우리는 그 기본에 기본도 모르고 있다. 물론 외국 사이트 가면 알고리즘 적으로 고급적인 for 사용법을..
CRect의 생성자에 NULL을 넣어서 초기화 해주면 쓰레기 값이 들어간다. 예를 들어 CRect rt(NULL); 하면 rt에는 막 -2349823 이런 쓰레기 값이 들어간다 0으로 초기화 하는게 목적이라면 그냥 CRect rt 까지만 해주는게 제일 좋다. 이 차이가 어디서 발생하냐면 IsRectNull()과 IsRectEmpty() 의 성공 여부 때문이다. 나는 당연히 CRect rt(NULL) 한 다음에 rt.IsRectNull() 하면 TRUE가 리턴될 줄 알았다. 그런데 아니더라. IsRectNull()은 해당 CRect가 0으로 초기화 돼있는지를 검사하기 때문이다. 하지만 쓰레기 값이 들어있으니 rt(NULL)로 초기화 했다면 IsRectNull()로 FALSE가 나오는 것이다. 안전하게 rt..
MFC DLL에서 class에 vector를 담아서 Export 하려 시도 하였다. 처음에는 잘 되는 듯이 보였지만, class를 delete 하는 순간, 와장창 무너지기 시작했다. 계속해서 dbgheap.c의 _CrtIsValidHeapPointer(const void * pUserData) 안에 있는 HeapValidate( _crtheap, 0, pHdr(pUserData) ); 에서 FALSE을 리턴하여 ASSERT에 걸리게 되었다. 계속 디버깅을 해보니, vector의 소멸을 제대로 하지 못하고 있었다. vector의 소멸자를 따라가 보니 dbgheap.c의 _crtheap이 caller의 heap을 가리키고 있는 것이 보였다. 아니, 애당초 call stack의 소멸 지점이 callee 인 d..
몇일째 고민했던가... 더블 버퍼링으로 화면 출력을 시켰는데도 계속 깜빡이는 것이었다. 나는 이것의 문제를 내부에 사용한 MoveWindow나 BitBlt로 옮기는 대상과 타겟의 가로 영역 너비가 너무 길어서 라고 생각했다. 문제는 그것이 아니였다.. '음악 재생'시 사용하는 '바'가 움직일 때 화면을 계속 리프레쉬하면서 보여주기 위해 타이머를 사용하였는데, 이때 타이머에서 Invalidate(FALSE); 를 해주는 것이 문제였다. 어짜피 계속해서 Invalidate가 들어오고 있기 때문에 다른 곳에서는 이걸 해줄 필요가 없는데, 나는 MouseMove등에서도 계속해서 Invalidate를 호출해 주고 있었다. 그러니 마우스를 움직일때마다 엄청나게 호출되는 Invalidate덕분에 깜빡거렸던 것이다....
- Total
- Today
- Yesterday
- 프로그래밍
- gcc
- linux
- 드라이버
- 음악
- C
- java
- db
- C++
- MFC
- source
- driver
- jni강좌
- jni
- Python
- Visual C++
- Cloud
- algorithm
- kering
- 리눅스
- Troubleshooting
- NDK
- 안드로이드
- winapi
- Quiz
- API
- android
- database
- it
- AWS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |