728x90
반응형

Program Language 197

[MFC] Control의 Style 비교하기

MFC에서 Control들의 기능을 변경하기 위해서 CustomDraw를 하다 보면 Control을 속성을 확인해야 할 때가 있다. 그중에서도 특히 Style에 대한 비교가 필요한데 GetStyle()로 받을 수 있는 Style 옵션은 GetStyle()에서 Return 받은 값으로 바로 비교가 불가능하다. 스타일을 비교하려면 아래와 같은 작업이 필요하다. UINT nButtonStyle = GetWindowLong(m_hWnd, GWL_STYLE) & 0x0000000F; if (nButtonStyle == BS_GROUPBOX) { ... } } MFC에서 사용하는 스타일은 아래와 같다. 자신이 필요한 스타일을 비교하여 Control을 Customizing 하는 데 사용할 수 있다. MFC에서 사용하..

[C++] Queue Clear

std::queue의 경우 clear를 제공해주지 않는다. 결국 size만큼 pop 해서 들어내야 한다. while(!q.empty()) q.pop(); 다른 방법으로는 빈 queue와 바꿔치기를 하면된다. queue empty; swap(q, empty); swap을 사용하려면 algorithm을 include 해야 한다. 그리고 새로운 방법으로 queue를 재선언해도 된다. q = queue(); How do I clear the std::queue efficiently? I am using std::queue for implementing JobQueue class. ( Basically this class process each job in FIFO manner). In one scenario, ..

[C++] condition_variable에서 unique_lock

thread 사이에 동기화를 할 때 lock을 잡는 것으로 가장 많이 사용되는 것은 lock_guard다. 소멸과 동시에 unlock을 해주기 때문에 자동으로 lock을 해제할 수 있기 때문이다. 편하지만 lock_guard는 오직 생성자, 소멸자를 통해서만 lock을 다룰 수 있다. unique_lock은 lock_guard에 몇 가지 추가적인 기능이 있다. lock을 획득하는 시점을 미룰 수 있고 lock을 잡기 위해 무한 대기하지 않아도 된다. lock을 획득하는 순서를 보장해주기도 한다. unlock 함수도 호출할 수 있다. coditional_variable은 조건을 만족하지 않으면 무한 대기하지 않고 thread를 바로 block 한다. thread가 block 되면 다른 thread로 넘어가..

COM/ATL을 Thread 내에서 사용하기

COM/ATL로 만든 기능을 다이얼로그 등에서 작업할 때에는 정상적으로 동작하지만, Thread 속에 넣으면 에러가 발생하는 경우가 있다. 이때는 스레드에서 사용함을 초기화해야 한다. CoInitializeEx(NULL, COINIT_MULTITHREADED); // COM 시작 시 ::CoUninitialize(); // 종료 시 해당 코드를 CoCreateInstance() 사용 전과 프로그램이 닫히기 전에 추가하면 스레드에서도 정상적으로 사용할 수 있다.

[MFC] Frame Caption 고정하기

Single/Multi Document 에서 상단 Caption은 보통 '제목없음 - 프로젝트 이름'으로 나타난다. 이를 해결하기 위해서는 Frame의 Style 설정에서 TITLE을 변경하면 된다. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style &= ~(FWS_ADDTOTITLE); cs.lpszName = L"User Application"; return TRUE; } Frame Style에서 FW..

[MFC] CString ↔ BSTR

BSTR은 여간해서 쓸 일이 잘 없는데, ATL을 쓰다 보면 종종 써야 해서 정리한다. BSTR은 Visual Basic 개발팀에 의해 만들어졌는데, Visual Basic이 포인터를 지원하지 못했기 때문이다. 그래서 IDispatch 인터페이스를 만들었다. Visual Basic과 COM 객체가 원활히 통신하기 위해서 COM에서 Visual Basic 문자열 타입을 지원하게 되는 결과로 만들어진 것이 바로 BSTR(Basic String)이다. BSTR은 COM에서 유니코드 문자열을 나타내는데 자주 사용된다. // BSTR -> CString BSTR bstr = ::AllocSysString(L"ABCD"); CString str = (CString) bstr; // CString -> BSTR CS..

[ATL/MFC] 32Bit Software를 64Bit Software에서 사용하기

C++에서 x86, x64 프로그램은 서로 호환해서 사용할 수 없어서 별도로 만들어 사용해야 한다. 모든 프로그램을 자신 혹은 팀이 만들어 나간다면 아무런 문제가 없다. 하지만 외부로부터 제공되는 라이브러리나 개발이 종료된 라이브러리의 경우 32bit만 존재하는 경우가 종종 있다. 이럴 경우 두 프로그램의 통신을 이용하여 사용할 수 있다. 32bit 프로그램을 ATL로 둘러싸서 서버를 만든 후 64Bit 프로그램에서 해당 서버와 통신을 하게 된다. 서버 만들기 (ATL Project) Visual Studio에서는 ATL을 이용하여 서버 프로그램을 간단히 만들 수 있다. C++ 프로젝트에서 ATL/ATL Project를 선택한 뒤, Service(EXE)를 선택한 후 프로젝트를 생성한다. ServerX8..

[C++] unique_ptr<T> nullptr 비교하기

unique_ptr 는 객체를 비교하거나 nullptr를 비교하는 연산자를 제공해 준다. 이 사실을 알지 못했을 때에는 get()을 사용하여 확인했다. std::unique_ptr str; if (str.get() == nullptr) return; 하지만 unique_ptr 는 bool 타입으로 암시적으로 변화될 수 있다. unque_ptr이 nullptr이면 변환 결과는 false가 되고, 그렇지 않으면 true가 된다. 이를 이용하면 unique_ptr객체의 nullptr 체크를 할 수 있다. std::unique_ptr str; if (str) return; 두 unique_ptr 객체를 비교할 때에는. get() 멤버를 호출해서 비교해야 한다. 이 동작은 shared_ptr에도 마찬가지로 동작한다.

[MFC] Control 보여주고 숨기기 (확인하기)

MFC에서 GUI를 구성할 때 사용하는 Control은 조건에 따라서 보여주거나 숨겨야 한다. 이때 사용하는 함수가 ShowWindow()이다. 편법으로는 MoveWindow()를 이용하여 Size를 0으로 만들어주면 되기도 한다. CEdit m_edit; // 라고 선언했다면, m_edit.ShowWindow(SW_SHOW); // 보여주기 m_edit.ShowWindow(SW_HIDE); // 숨기기 이때, SHOW/HIDE 상태를 확인하기 위해서는 IsWindowVisible() 함수를 사용할 수 있다. 물론 CEdit를 Subclassing 하여 OnShowWindow() 이벤트 내에서 선언된 변수에 정보를 저장하여 알 수도 있다. if (!m_edit.IsWindowVisible()) // SW..

[MFC] 따라하기 06. 순차적으로 원 그리기

1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 순차적으로 구동하는 시스템 만들기 [MFC] 따라하기 05. 여러 개의 원 그리기 1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 여러 시스템 구동하기 [MFC] 따라하기 04. 원이 그려지는 동작 만들기 1. 프로젝트 예제에 사용되는 내용 원을 이루는 함수 구하기 Clie stormpy.tistory.com 2. flag로 동작 구현하기 기존에 Timer의 동작으로 구동하던 방법을 bool 변수를 사용하여 그리기/멈추기를 구현해 보자. 3개의 start_flag를 배열로 만들어서 그리기 동작을 제어할 수 있다. 하나가 작업이 끝나면 다음 작업이 실시될 수 있도록 만들자. BOOL CDrawCircleDlg::OnInitDialog..

[ATL] WTL 9.0 설치하기

첨부된 WTL 관련 압축 파일을 풀면 아래와 같은 파일들이 존재한다. 해당 파일들을 원하는 폴더에 옮겨놓도록 한다. C:\Program Files\WTL에 만드는 것이 보통이다. 파일을 옮긴 후, /AppWiz 폴더 내에 있는 Setup.js 파일을 실행한다. 상기 다이얼로그에 이어 “App Wizard successfully installed!”라는 메시지와 “Done!”이라는 메시지가 연속해서 나타난다. 위 순서대로 진행되었다면 정상적으로 설치된 것이다. 이제는 VS2008에 WTL 9.0을 연결해줘야 한다. VS 2008을 실행시킨 후, 도구/옵션 메뉴를 실행하면 아래와 같은 창이 뜬다. VC++ 디렉터리 항목에서 포함 파일을 선택한 후, WTL 9.0이 있는 폴더의 /include 폴더를 연결해 ..

[C++] Algorithms and Lifting

함수 템플릿은 다양한 데이터 유형에 대한 작업을 수행하고 해당 작업을 구현하기 위해 인수로 전달된 다양한 작업을 사용할 수 있다는 점에서 일반 함수를 일반화한 것이다. 알고리즘은 문제를 해결하기 위한 절차 또는 공식이다. 결과를 생성하기 위한 유한한 일련의 계산 단계다. 따라서 함수 템플릿을 종종 알고리즘이라고 한다. 특정 데이터에 대해 특정 작업을 수행하는 함수에서 다양한 데이터 유형에 대해 보다 일반적인 작업을 수행하는 알고리즘으로 어떻게 이동할까? 좋은 알고리즘을 얻는 가장 효과적인 방법은 하나의 구체적인 예에서 일반화하는 것이다. 이러한 일반화를 Lifting이라고 한다. 즉, 이러한 일반화를 Lifting이라고 한다. 성과를 유지하고 합리적인 것을 주시하면서 구체적인 것에서 추상적인 것으로 나아..

[C++] Template Aliases

uisng 또는 typedef를 이용하여 유형에 대한 별칭을 정의할 수 있다. using 구문은 일부 인수가 바인딩된 템플릿의 별칭을 정의하는 데 사용할 수 있다는 중요한 의미에서 더 일반적이다. template vector; using Cvec = vector; // both arguments are bound Cvec vc = {'a', 'b', 'c'}; // vc is a vector template using Vec = vector; // vector using my allocator (2nd argument is bound) Vec fib = {0, 1, 1, 2, 3, 5, 8, 13}; // fib is a vector 일반적으로 템플릿의 모든 인수를 바인딩하면 유형을 얻지만 일부만 바이딩..

[C++] Function Template

많은 사람들에게 템플릿의 첫 번째이자 가장 명백한 용도는 vector, list 및 map과 같은 컨테이너 클래스를 정의하고 사용하는 것이다. 곧 이러한 컨테이너를 조작하기 위한 함수 템플릿의 필요성이 발생한다. 벡터 정렬은 간단한 예다. template void sort(vector&); // declaration void f(vector& vi, vector& vs) { sort(vi); // sor t(vector&); sort(vs); // sor t(vector&); } 함수 템플릿이 호출되면 함수 인수의 유형에 따라 사용되는 템플릿 버전이 결정된다. 즉, 템플릿 인수는 함수 인수에서 추론된다. 당연히 함수 템플릿은 어딘가에 정의되어야 한다. template void sort(vector& v)..

[C++] Console 한 줄 Refresh

C++에서 기본적으로 제공하는 Console에서 한 줄만 지우는 것은 불가능한 것 같다. Console 전체 지우기는 제공하나 한 줄 지우기는 존재하지 않는다. 그래서 '\r'을 이용하여 공백 문자를 채워 넣어서 지우고 다시 써보았다. 공백 문자를 채워서 한 번에 print를 하는 방법도 있을 것 같다. #include #include #include using namespace std; char buffering_char[4] = { '-', '\\', '|', '/' }; int main() { for (int i = 0; i < 3; i++) { std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); int co..

728x90
반응형