일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- android
- java
- C++
- winapi
- jni강좌
- 리눅스
- source
- it
- driver
- 프로그래밍
- NDK
- database
- gcc
- API
- 드라이버
- MFC
- Troubleshooting
- linux
- 안드로이드
- UI
- Visual C++
- jni
- C
- control
- kering
- Python
- sqlite3
- db
- Quiz
- 음악
- Today
- 36
- Total
- 585,138
목록PROGRAMMING/C C++ MFC (90)
JHB의 프로그래밍 삽질기
기본 참고https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md컴파일러는 visual studio code에서 기본 제공하지 않는다. mingw를 다운 받아서 하자. <<- 당연히 plugin에서 지원 할 줄 알았는데 -_-;제일 먼저 할 건.. mingw 설치하고, 환경 변수로 C:\MinGW를 MINGW_HOME으로 잡고 나서, c프로젝트의 설정을 아래 처럼 해주..
작게 시작한 프로젝트 규모가 점점 커지면서 리팩토링을 하게 됐는데크고 작은 실수가 몇개 있었다. 덕분에 엄청난 시행착오를 거쳐 오랜 시간걸렸다.몇가지 실수를 적어 보겠다.첫번째는 메세지 전달 부분에서의 의존성을 줄이지 못한 부분이다. 각 모듈을 DLL로 쪼개는 리팩토링을 감행 하였는데 여기서 각 DLL 간 의존성을 0으로 하고, 최대한 독립적으로 General 하게 코딩하려 했다.A DLL에서 B DLL로 메세지를 전달 하는 과정에서 상수값..
CRect의 생성자에 NULL을 넣어서 초기화 해주면 쓰레기 값이 들어간다.예를 들어CRect rt(NULL);하면 rt에는 막 -2349823 이런 쓰레기 값이 들어간다0으로 초기화 하는게 목적이라면 그냥CRect rt까지만 해주는게 제일 좋다.이 차이가 어디서 발생하냐면IsRectNull()과 IsRectEmpty() 의 성공 여부 때문이다.나는 당연히CRect rt(NULL)한 다음에 rt.IsRectNull() 하면 TRUE가 리턴될 줄 알았..
MFC DLL에서 class에 vector를 담아서 Export 하려 시도 하였다.처음에는 잘 되는 듯이 보였지만, class를 delete 하는 순간, 와장창 무너지기 시작했다.계속해서 dbgheap.c의 _CrtIsValidHeapPointer(const void * pUserData) 안에 있는HeapValidate( _crtheap, 0, pHdr(pUserData) ); 에서 FALSE을 리턴하여 ASSERT에 걸리게 되었다.계속 디버깅을 ..
Window환경에서 ffmpeg을 사용하기 위해 얼마나 삽질했던가... 아래는 ffmpeg shared library를 직접 컴파일 한것..(2012년 9월 16일 현재 최신 버전) + 에러나는 부분 조금 수정한 것.. int64니 뭐니 해서 에러 나는 헤더파일들을 좀 수정해줬다. 컴파일 하는건 msys, mingw등등 여러가지 써서 직접 했음.. 사용 법은.. C++에서 사용할때는 아래와 ..
리듬 액션 게임 자동 노트를 생성하면서.. bass24 라이브러리를 사용하였고, 그 중에서도 특히 bass_fx를 사용하였다. bass_fx는 bpm이나 beat등을 얻어오는데 사용하기 좋다. BASS_FX_BPM_BeatDecodeGet를 주력으로 사용했으며, http://www.bass.radio42.com/help/html/7799e7ea-d193-3521-02af-6a3f9a3d3833.htm 페이지에 자세히 나와있다. wav..
위 사진은 컴파일해서 실행시켰을 때 모습이고 아래는 Resource View에서 봤을 때 모습이다..Toolbar인데.. 잘못 생성을 해버리는 바람에 지우고 싶은데.. 도저히 지울 수가 없다.Delete키 누르면 그냥 그림이 쫙 지워지면서 위처럼 검정색 배경만 남는다.어떻게 지우냐면.. 그냥 툴바 클릭 후 드래그 해서 화면 밖으로 빼버리면 빠진다..하아.. UX가 이렇다니..ㅠㅠ
몇일째 고민했던가... 더블 버퍼링으로 화면 출력을 시켰는데도 계속 깜빡이는 것이었다. 나는 이것의 문제를 내부에 사용한 MoveWindow나 BitBlt로 옮기는 대상과 타겟의 가로 영역 너비가 너무 길어서 라고 생각했다. 문제는 그것이 아니였다.. '음악 재생'시 사용하는 '바'가 움직일 때 화면을 계속 리프레쉬하면서 보여주기 위해 타이머를 사용하였는데, 이때 타이머에서 Invalidate(FALSE); 를 해주는 것이 문제였다. 어짜피 계속해..
이 방법을 쓰면 child dialog도 투명하게 만들 수 있다. http://www.codeproject.com/Articles/9064/Yet-Another-Transparent-Static-Control
MFC에서 더블버퍼링 사용하기. 이걸 왜 지금까지 안올려놨었지 -.-?;; 일단 제일 중요한건 헤더 파일에 CBitmap m_Bitmap; 를 선언 하는 것. 이 비트맵에 객체를 생성하고 이것저것 해줄 것임. 우선 아래와 같이 Bitmap에 그림을 그려줌. void CDlgXXX::MakeMemBitmap(void) { CClientDC dc(this); //실제 dc CBitmap* pOldBmp; //oldbm..
오오 멋지당
GetWindowRect GetClientRect ScreenToClient MoveWindow....등등등... 항상 복잡하다.. 이제 SetWindowPos같은건 잘 안 쓰고 MoveWindow를 잘 쓰니깐 얘를 설명하면 0,0으로 이동 시키면 현재 프로그램의 최 좌측 상단에 달라 붙는 다는 것이다. 그리고 width랑 height까지 바꿔버리니까 주의해야 한다. GetWindowRect를 하면 현재 화면 전체에서의 컨트롤 위치를 가져온다. 이..
MFC로 짠 프로그램 아이콘 바꾸기는 참 간단하다. 그냥 프로젝트 솔더의 res경로에 있는 아이콘 파일을 대체시켜 주면 된다. 예를 들어 프로젝트에 사용중인 아이콘 파일 이름이 RoterIconWidget.ico 로 돼있다면, 그냥 쓰고싶은 아이콘 이름을 RoterIconWidget.ico로 바꿔서 저걸로 바꿔주면 된다. 참고로 Dialog에서는 아래와 같은 것을 써주면 Dialog의 아이콘을 바꿀 수 있다. HICON hIcon = L..
소스는 아래와 같음. Windows의 Temp 디렉토리를 가져와서 prefixstring을 붙인 새 tmp파일의 주소값을 리턴한다. CString CClassName::GetTempFilePath(LPCTSTR pszPrefixString) { CString strPath; if(GetTempPath(_MAX_PATH,strPath.GetBuffer(_MAX_PATH+1)) != 0) { strPath.ReleaseBuffer(); ..
DLL프로젝트가 여러개 있다. 예를 들어 A와 B 이렇게 두개가 있다. 둘다 resource.h가 있고, 각자의 rc파일이 있다. 그런데.. B에서 LoadString으로 String Table에 있는 것을 읽어오려했는데.. 오잉..? A에 있는 스트링 테이블 값을 참조한다. 우째 이런일이? 이를 해결하기 위해선 MFC Extension DLL로 DLL을 만든 경우, LoadString이나 LoadBitmap시에 어느 리소스에서 값을 가져오는지를 ..
그림을 넣고 그 아래에 가로로 스크롤바를 달아서 그림을 좌우로 스크롤 되게 할 경우 적당한 스크롤바의 인포는 다음과 같이 설정한다. int nScrollBarSize = m_nSize - DISPLAY_WIDTH + m_nSize/10; //스크롤바의 크기 때문에 이렇게 조금 빼줘야 한다. nScrollBarSize = nScrollBarSize>0?nScrollBarSize:0; SCROLLINFO si; si.fMask = SIF_A..
MFC 클래스 내부에 선언한 static 멤버 변수를 사용하려 하면 어떻게 해야할까? 일단 아무 생각 없이 선언해 놓고 사용을 하면 컴파일러는 링크 에러를 뿌려댄다. 그렇다면 어떻게 해야할까 클래스 헤더에 static int n; 이라는 값을 선언했다면 cpp 상단부에 다음과 같이 해줘야 한다. 변수형 클래스이름::변수이름 = 초기값; 예를 들어 클래스 이름이 Student고 int로 선언된 변수 이름이 TeacherName이면 cpp의 상단에&..
사용할 프로그램은 멀티 바이트로 작성하였고, DLL은 유니코드로 작성 하였는데, 프로그램에서 DLL을 불러서 사용하려고 하니 에러가 났다. 에러 내용은 다음과 같았다. error LNK2001: unresolved external symbol "__declspec(dllimport) public: int __thiscall StartCapture(class ATL::CStringT
이번에 프로그램 UI를 일본어로 바꿈에 있어서 상당한 난항에 처한적이 많다. 이것 저것 다 제쳐놓고, 우선 폰트 관련된 이슈만 보더라도 그렇다. 분명히 폰트 바꿔주었는데 출력이 안되는 경우이다. 우선 MS UI Gothic이라는 폰트를 사용했었는데 안나오길래 도대체 이건 무슨 신의 장난인가.. 싶었는데 LoadString 이후에 font를 SetFont 해주는 것과 SetFont 이후 LoadString 해주는 것에 차이가 있었다.. 즉 ..
아래 내용이 일부 틀려서 정정합니다. 20110719. 아래 처럼 할 경우 폰트가 변경 되는 것이 맞긴 한데, '일본어'등의 특수 문자들을 불러서 Insert하는 경우에 문제가 생긴다. 일본어를 지원하지 않는 폰트가 set돼있는 트리컨트롤에 일본어 String을 insert하려하면 항목이 깨져버린다. 그 이후에 font를 바꿔봤자 이미 삽입된 항목은 깨진 뒤다. 아래서 적은 NMCustomDraw는 삽입 된 뒤에 그려지는 듯 하다. 따라서 fo..
프로그램의 솔루션 디렉토리를 선택 하면 해당 프로그램에 들어간 소스의 라인 수를 계산하여 출력해 주는 프로그램. 현재 c, cpp, h, java, cs, py 확장자만 지원한다. 소스는 너무 간단해서.. 걍 대충 주석써서 올리겠음. void CCodeLineSearcherDlg::FindLine( int &nTotalLine, CString strPath ) { CFileFind finder; finder...
C, C++ 에서는 프로그램 실행시 명령 인자를 받을 때 argv를 통해서 쉽게 받아 올 수 있다. MFC에서는 어떻게 얻어올까? GetCommandLine(); 을 쓰면 얻어 올 수 있다. 백문이 불여일견. 한번 테스트 직접 해보시길. 그리고 아래는 인자를 쫙 얻어오는 예제 소스. 띄어쓰기(공백)이 제대로 분리 됐는지 확인 하기 위해 출력 시에 @를 시작과 끝에 붙여서 출력 시켰다. 파싱은 알아서 하면 됨. LPSTR pszArgv = GetCom..
Registry read, write. 레지스트리를 입력하거나 읽을려면 RegSetValueEX, RegQueryValueEx등을 써야하는데 들어가는 인자 셋팅하는게 귀찮다. 따라서 다음과 같이 쉽게 쓰도록 만들어주면 좋다. 우선 쓰기. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////..
멀티바이트와 유니코드간의 교환! 문제 : LoadString이 이상한 문자를 읽어와요 rc의 StringTable에 있는 스트링을 읽어 오려면 기본적으로 LoadString을 사용 한다. 이 LoadString은, rc파일의 인코딩이 한글(euc-kr, cp949)일 경우, 한글 윈도우에서 한글을 읽어 오는 것은 문제가 되지 않는다. 마찬가지로 인코딩이 일본어(shift_jis, cp932)일 경우, 일본 윈도우에서 일본어를 읽어 오는 것은 문제가 ..
우와.. 이번에 멀티바이트랑 유니코드랑 수 없이 교환시키는 작업을 하면서 인코딩에 대한 이해가 많이 는 것 같다.. 유니코드는 2바이트로 이 세상의 모든 언어를 표시 할 수 있는 그런 놈이다. 이건 알고 아래 글을 읽도록 하자 후후. 일단 UTF-8이 널리 쓰이는 이유에 대해 설명을 간략이 들여보자. UTF-8은 멀티바이트이다. 65536개의 문자를 사용하는 캐릭터셋은 유니코드의 캐릭터셋을 사용하지만 유니코드는 무조건 1글자에 2byte씩이다...
///////////////////////////////////////////////////////////////////////////// UNICODE PRIVATE FAQ 0.1 (2004.08.03) by redhotfrog@naver.com ---------------------------------------------------------------------------- A000 : character set, code..
현재 다루고 있는 프로그램은 캐릭터 표현에 있어서 멀티 바이트를 사용한다. 따라서 OS에 따라서 언어 인코딩 방식이 달라진다... 영어만 생각한다면 큰 문제가 없을텐데 일본어 버전 OS에서는 큰 문제가 발생 하더라. 특히 LoadString 매크로 함수에서 가장 큰 문제가 발생 한다. euc_kr로 인코딩 돼있는 리소스(.rc) 파일을 한글 윈도우에서 컴파일 하여 일본 os에서 실행 하는 경우 일본어가 들어있을 때, LoadString이 일본어를 ..
배열과 포인터가 동치라는 것은 이미 알고 있다. 예를 들어서 a[3]은 *(a+3) 이 되는 것이다. 하지만 다른 점은 배열은 포인터 상수로 선언 된다는 점이다. 즉 * const 이다. 따라서 int a[3]; int b[3]; 이 있을 때, a는 a[3]배열의 시작 주소를 나타내고 b 역시 b[3]배열의 시작 주소를 나타내지만 a = b; 는 할 수 없다. 왜냐면 const이기 때문에!! 해주고 싶다면 int a[3], int *b; ..
이중 포인터를 사용하는건 주로 포인터의 동적 배열을 나타내기 위해서 이다. 우선 아래와 같은 클래스가 하나 있다고 가정 해보자. class CTest { public: CTest() {} int a; }; 이녀석에 대한 포인터를 선언하고 객체 하나를 생성하려면 어떻게 해야할까? 다음과 같이 써주면 된다. CTest *pTest = new CTest; 이렇게 하면 pTest는 CTest의 객체를 참조한다. 근데..