일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
목록MFC (38)
JHB의 프로그래밍 삽질기
작게 시작한 프로젝트 규모가 점점 커지면서 리팩토링을 하게 됐는데크고 작은 실수가 몇개 있었다. 덕분에 엄청난 시행착오를 거쳐 오랜 시간걸렸다.몇가지 실수를 적어 보겠다.첫번째는 메세지 전달 부분에서의 의존성을 줄이지 못한 부분이다. 각 모듈을 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에 걸리게 되었다.계속 디버깅을 ..
몇일째 고민했던가... 더블 버퍼링으로 화면 출력을 시켰는데도 계속 깜빡이는 것이었다. 나는 이것의 문제를 내부에 사용한 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등을 써야하는데 들어가는 인자 셋팅하는게 귀찮다. 따라서 다음과 같이 쉽게 쓰도록 만들어주면 좋다. 우선 쓰기. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////..
1. 대화상자에 세로 스크롤바를 붙이자. 2. 스크롤 바에 컨트롤 변수를 추가한다. CScrollBar m_ctrVScroll; 3. 스크롤 바 초기화 // 스크롤 바 의 사용영역 설정. m_ctrVScroll.SetS..
슬라이더 컨트롤(Slider Control) 1. 대화상자에 슬라이더을 붙이자. 2. 슬라이더 컨트롤의 컨트롤 변수 추가 CSliderCtrl m_ctrSlider; 3. 슬라이더 컨트롤 설정 // 사..
MFC에서 보면 아래와 같은 소스 코드가 있다. #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // _DEBUG 이것에 대해 엄청난 궁금증이 있었지만 그려러니 하고 넘어갔었다. 그러던 중 우연치않게 이 용도를 알았다. 프로그래밍하던중 종료시에 "Detected memory le..
MFC에서는 메세지와 함수를 연결시켜주는 메세지맵이라고 있다. BEGIN_MESSAGE_MAP(자기클래스, 부모클래스) ... ... END_MESSAGE_MAP() 으로 된다. 들어가는건 이것 저것 많다. ON_NOTIFY ex) ON_NOTIFY(NM_RCLICK, IDC_DB_TREE, OnNMRclickDbTree) ON_MESSAGE ex) ON_MESSAGE(WM_USER_C..
Visual Studio 2005를 쓰는데, Add Variable을 하는 과정에 다음과 같은 오류가 났다. Error: The Extender Provider failed to return an Extender for this object 이 경우 프로젝트 폴더에 있는 *.ncb 파일을 지워 주면 된다. 아 vs2005의 인텔리젼스여어어어어어 ㅠㅠ
디버깅 중에 블포가 자동으로 해제가 되는 경우가 있다. 디버깅 중 소스코드 내용 바꾸면 생기는 일인데 가끔씩 버그로 그럴 때도 있다. 그럴땐 아래의 옵션을 체크 해제 해준다. Tool->Option->Debugging->General->Require source files to exactly match the original version
보통 MFC에서 이제 view에 사용할 소스 파일의 h와 cpp가 있을 때 이제 해당 뷰에서 사용할 컨트롤 및 클래스들을 사용할 때에 include를 cpp 파일에다가 한다. 헤더 파일에 인클루드 했다가는 무진장 꼬여서 애먹는다 -.-;; 차라리 사용할 클래스들을 그때 그때 cpp에 include하는게 편하다. 그렇다면 멤버 변수로 외부 클래스를 선언 할려면 어떻게 해야하는가 class의 헤더에 외부 클래스의 h가 include 되어 있지..
MFC 클래스간 통신 SDI 형태 1. MainFrame 얻기 - CMainFrame *pFrame = (CmainFrame *) AfxGetMainWnd(); 2. App 포인터 얻기 - CTestApp *pApp = (CtestApp *) AfxGetApp(); 3. Document 포인터 얻기 - CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); CTestDoc *pDoc = (CTestDoc *)pF..
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=829244&ref=829244 나는 분기문을 좀 싫어한다 -.-;; 뭔가 소스가 길어지는 느낌이라서.. 예를 들어 단순히 form열기 같은 것을 하는데 switch문으로 길게 늘리는게 뭔가 안깔끔해 보인다. switch(nIndex) case..
void func1() { int a = 3; ::SendMessage(hWnd,WM_MESSAGE,(WPARAM)&a,lParam); std::cout << "COMPLETE" << std::endl; } void func2() { int a = 3; ::PostMessage(hWnd,WM_MESSAGE,(WPARAM)&a,lParam); std::c..
CButton을 상속 받은 CMonitorButton을 하나 만들어서 버튼을 동적 생성 하기 위한 프로그램을 구현했다. CMonitorButton에선 오너 드로를 위해 DrawItem을 호출했고, OnBnClicked를 오버라이딩해서 자신의 nID값을 nSelectedMonitor 변수에 리턴해주었다. CMonitorButton을 생성하기 위해 다음과 같은 코드를 구현하였는데 for(int i = 0;i < n;i++) { &nbs..
보통 mfc는 선언부 파일(*.h)과 구현부 파일(*.cpp)을 나누어 놓는다. 선언부 class에서 static 멤버 변수를 선언하고 구현부에서 사용하려고 하면 Link시점에 에러가 난다. 예를 들어 다음과 같은 소스가 있다고 해보자 StaticSample.h (선언부) //StaticSample.h class CStaticSample { private: static int m_nNumofClass; publi..