일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 리눅스
- 드라이버
- MFC
- Troubleshooting
- C
- kering
- it
- java
- Quiz
- UI
- Visual C++
- jni강좌
- source
- NDK
- InstallShield
- gcc
- jni
- 프로그래밍
- winapi
- sqlite3
- control
- API
- db
- 음악
- driver
- android
- Install Shield
- 안드로이드
- linux
- C++
- Today
- 158
- Total
- 530,647
목록Visual C++ (56)
JHB의 프로그래밍 삽질기
Window환경에서 ffmpeg을 사용하기 위해 얼마나 삽질했던가... 아래는 ffmpeg shared library를 직접 컴파일 한것..(2012년 9월 16일 현재 최신 버전) + 에러나는 부분 조금 수정한 것.. int64니 뭐니 해서 에러 나는 헤더파일들을 좀 수정해줬다. 컴파일 하는건 msys, mingw등등 여러가지 써서 직접 했음.. 사용 법은.. C++에서 사용할때는 아래와 ..
몇일째 고민했던가... 더블 버퍼링으로 화면 출력을 시켰는데도 계속 깜빡이는 것이었다. 나는 이것의 문제를 내부에 사용한 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..
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
아래 내용이 일부 틀려서 정정합니다. 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)일 경우, 일본 윈도우에서 일본어를 읽어 오는 것은 문제가 ..
///////////////////////////////////////////////////////////////////////////// UNICODE PRIVATE FAQ 0.1 (2004.08.03) by redhotfrog@naver.com ---------------------------------------------------------------------------- A000 : character set, code..
현재 다루고 있는 프로그램은 캐릭터 표현에 있어서 멀티 바이트를 사용한다. 따라서 OS에 따라서 언어 인코딩 방식이 달라진다... 영어만 생각한다면 큰 문제가 없을텐데 일본어 버전 OS에서는 큰 문제가 발생 하더라. 특히 LoadString 매크로 함수에서 가장 큰 문제가 발생 한다. euc_kr로 인코딩 돼있는 리소스(.rc) 파일을 한글 윈도우에서 컴파일 하여 일본 os에서 실행 하는 경우 일본어가 들어있을 때, LoadString이 일본어를 ..
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..
이건 Visual Studio 2005 의 버그인듯 싶다. VS에서 DLL을 컴파일 하고 실행 할려면 Executable file을 아래와 같이 설정해 줘야 한다. 아마 한글로는 [디버깅 세션에 사용할 실행 파일의 경로를 지정하십시오] 쯤으로 뜨는 듯 싶다. 여튼 여기서 Executable file name의 path를 dll이 포함될 exe로 지정하면 좋은데.. 실수로 다른 파일을 지정했더니 도저히 다시 원래의 exe로 못 ..
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..
우선 DLL만드는건 아래처럼 하면 됨. empty project에 체크하지 말것. 체크하지 말아야지 DllMain까지 자동으로 만들어준다. 그리고 이제 아무 것도 건들지 말고 그냥 예제 써보자면 calc.c랑 calc.h를 만들고 각각 이렇게 입력한다. //calc.h extern "C" __declspec(dllexport) int add(int lhs, int rhs); //calc.c #include "stdafx.h" //요..
CButton을 상속 받은 CMonitorButton을 하나 만들어서 버튼을 동적 생성 하기 위한 프로그램을 구현했다. CMonitorButton에선 오너 드로를 위해 DrawItem을 호출했고, OnBnClicked를 오버라이딩해서 자신의 nID값을 nSelectedMonitor 변수에 리턴해주었다. CMonitorButton을 생성하기 위해 다음과 같은 코드를 구현하였는데 for(int i = 0;i < n;i++) { &nbs..
Vector 사용법 #include <cstdio> #include <vector> using namespace std; int main() { int i; int num =10; vector<int> vi; for(i = 0;i < num;i++) { vi.push_back(i*2); //vi[i] = i*2; } for(i = 0;i < num;i..
1. 더블 버퍼링에 대하여 더블버퍼링은 WM_PAINT에서 해주는 일을 간략화 시켜주기 위해! 다른 곳에서 미리 BITMAP에다가 다 그려놓고 WM_PAINT에서는 해당 BITMAP을 불러와주는 일만 해주도록 하는 것. MFC의 경우엔 CBitmap을 사용한다 클래스 내에 CBitmap m_BitmapBG; 뭐 이런식으로 하나 만들고 다른 함수 (예를 들어 고정 배경이라면 Init부분에서)에서 MemDC를 만들어 SelectObject로 m_Bit..
CDialog를 상속받은 CParentDlg가 있을 때 CParentDlg를 상속받은 CChildDlg를 만들어보자~ 예제도 있으니 다운 받아도 되고 안받아도 되고.. vs2008에서 컴파일했음. 생각같아선 그냥 class CChildDlg : public CParentDlg { ... }; 해주면 될 것 같은데 이게 끝이 아니다. 우선 부모가될 Parent 다이얼로그에서는 MFC Wizard가 만든 기본 생성자 외에 CP..
다이얼로그로 대화창을 만들고, 에디트 버튼이나, 기타 엔터키 입력을 받는 콘트롤을 올려 놓을 경우에, 다이얼로그에서 먼져 엔터키를 받아서 OnOK();가 호출되어 걍 ~~ 죽죠. 이 부분을 막아 보겠습니다. 1. 리소스 부분에서 IDOK 부분을 다른 리소스로 변환합니다. IDOK -- > IDC_BUTTON_ACCEPT #define IDC_BUTT..
버튼 모양을 맘대로 만들어 줄 때.. Bitmap으로 바꿔주기 위해 사용한다. Owner Draw라는 기법(?)인데 Combo, List, Button에 사용한다. 버튼으로 예를 들면 Dialog에 Button을 그린 후 Add Variation해서 CButton으로 등록한다. 이름을 m_btnTest로 했으면 CButton m_btnTest로 돼있을텐데 여기서 CButton을 강제로 CBitmapButton으로 바꿔준다. (CButton을 상속받..