728x90
반응형

전체 글 326

[MFC] 따라하기 04. 원이 그려지는 동작 만들기

1. 프로젝트 예제에 사용되는 내용 원을 이루는 함수 구하기 ClientDC 2. CClientDC와 Ellipse()를 이용하여 원 그리기 Dialog Based 프로젝트를 만든 뒤, 버튼을 하나 추가하여 클릭으로 원을 그릴 수 있도록 해보자. 위와 같이 원을 그리는 것은 어렵지 않다. Button Click 이벤트에 다음과 같이 작성하면 간단하게 작성할 수 있다. void CDrawCircleDlg::OnBnClickedDraw() { CClientDC dc(this); dc.Ellipse(10, 10, 100, 100); } CCleintDC는 window에서 device context를 가져온다. Ellipse()는 원을 그리는 함수다. OnInitDialog()에서는 CCleintDC을 이용해서..

코드/MFC 2022.03.08

[MFC] 따라하기 03. Edit box를 이용하여 여러 개의 사각형 그리기

1. 프로젝트 예제에 사용되는 내용 for문 사용 Edit box 사용법 [MFC] 따라하기 02. 버튼을 이용하여 사각형 그리기/지우기 1. 프로젝트 예제에 사용되는 내용 함수의 사용 버튼 사용의 이해 [MFC] 따라하기 01. 사각형 그리기 1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생 stormpy.tistory.com 2. for문과 이용하여 3 x 3 개수의 사각형 그리기 이전 글까지 진행하면 (10, 10)에서 (110, 110)에 이르는 100 x 100 pixel의 사각형을 그리게 된다. 이제부터는 똑같은 사각형을 3x3으로 9개를 그려보자. 사각형은 100 pixel의 변을 가지고 있기 때문에 10 pixel의 간..

코드/MFC 2022.03.02

[MFC] 따라하기 02. 버튼을 이용하여 사각형 그리기/지우기

1. 프로젝트 예제에 사용되는 내용 함수의 사용 버튼 사용의 이해 [MFC] 따라하기 01. 사각형 그리기 1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생성 MFC 응용프로그램 프로젝트를 만들기 위해서는 위 그림에 있는 버튼을 차례대로 누른다. File/New stormpy.tistory.com 2. 함수를 이용하여 사각형 그리기 사각형을 그리는 프로젝트에서 해당 기능을 떼어내어 함수로 옮겨보자. 함수의 이름은 DrawRectangle로 하며 반환 값은 없으므로 void로 선언하자. void CDrawRectDlg::DrawRectangle(CPaintDC& dc) { dc.MoveTo(10, 10); dc.LineTo(110, 1..

코드/MFC 2022.03.02

[MFC] 따라하기 01. 사각형 그리기

1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생성 MFC 응용프로그램 프로젝트를 만들기 위해서는 위 그림에 있는 버튼을 차례대로 누른다. File/New 메뉴를 선택한다. Project를 선택하면 Project 종류를 선택할 수 있다. Visual C++의 MFC 하위에 있는 'MFC Application'을 선택한다. 이때 하단의 Project 이름을 넣을 수 있다. ( Sample은 DrawRect이라고 정했다. ) MFC Application 프로젝트는 3가지를 선택할 수 있습니다. Single document : frame window가 있지만 child window가 아닌 프로젝트 Multiple document : fra..

코드/MFC 2022.03.02

[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..

[C++] Class Template

데이터 멤버 보통 클래스의 경우 클래스 템플릿에는 모든 유형의 데이터 멤버가 포함될 수 있다. non-static 멤버는 해당 저의 또는 생성자에서 초기화할 수 있다. template struct X { int m1 = 7; T m2; X(const T& x) :m2{x} { } }; X xi {9}; X xs {"Rapperswil"}; non-static 데이터 멤버는 const일 수 있지만 constexpr일 수는 없다. 멤버 함수 보통 클래스는 클래스 템플릿의 non-static 멤버 함수를 클래스 내부 또는 외부에서 정의할 수 있다. template struct X { void mf1() { /* ... */ } // defined in-class void mf2(); }; template vo..

[C++] Simple String 템플릿

특정 문자에 대한 의존도를 최소화하면서 '문자열'의 개념을 표현하고자 한다. 예를 들어 부호 있는 문자, 부호 없는 문자, 중국어, 그리스어 등등 다양한 context에 유용하게 사용한다. 문자열의 정의는 문자를 복사할 수 있다는 사실에 의존하고 다른 것은 거의 없다. template class String { public: String(); explicit String(const C∗); String(const String&); String operator=(const String&); // ... C& operator[](int n) { return ptr[n]; } // unchecked element access String& operator+=(C c); // add c at end // .....

FAS_MoveLinearAbsPos/FAS_MoveLinearIncPos 실행 시, FMM_INVALID_SLAVE_NUM을 리턴하는 경우

FAS_MoveLinearIncPos(BYTE nNoOfBds, int* iBdID, long* lplIncPos, DWORD lFeedrate, WORD wAccelTime) 해당 포인터 변수들은 형식을 맞춰줘야 함. int ↔ long 사이의 변환은 문제없음. long ↔ double 사이의 변환은 문제 있음. struct MotionParam { long axisCount; long axisList[MotionMax_Axes]; double position[MotionMax_Axes]; double velocity[MotionMax_Axes]; }; MotionParam의 위치, 속도 등은 double로 선언되어 있어, FAS_MoveLinearIncPos에 사용하려면 변수를 casting 해야 한..

[C++] std::chrono로 시간 측정하기

std::chrono가 제공되면서 시간 연산이 더욱 쉬워졌다. 기존에 정밀한 단위의 시간을 측정하려면 OS에서 제공하는 API를 사용해야 했는데 이제는 번거로움이 사라졌다. #include #include using namespace std; int main() { std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); for (int i = 0; i < 10000000; i++) std::sqrt(10000000000); std::chrono::duration sec = std::chrono::system_clock::now() - start; std::cout

[C++] unique_lock, lock_guard

unique_lock과 lock_guard의 차이점은 lock을 걸 수 있는 시점이다. 둘 다 소멸 시점에 lock이 걸려 있다면 unlock을 수행한다. lock_guarud는 lock과 unlock 사이에서 lock과 unlock을 할 수 없지만 unique_lock은 소멸하기 전에 unlock과 lock을 걸 수 있다. unique_lock은 lock_guard에 기능이 추가된 버전이라고 생각하면 된다. 이러한 lock 유틸리티 객체를 사용하는 것은 프로그래머가 unlock 코드에 신경 쓰지 않아도 되게 해 준다. 아래와 같이 사용하면 된다. std::mutex m_mutex; std::lock_guard lock(m_mutex); std::unique_lock lock(m_mutex);

[C++] 함수 delete

함수를 '삭제'할 수 있다. 즉, 함수가 존재하지 않는다고 명시하여 그것을 사용하려고 시도하는 것은 오류다. 가장 확실한 용도는 기본 설정이 아닌 기능을 제거하는 것이다. 예를 들어, 베이스로 사용되는 클래스의 복사는 슬라이싱으로 이어지기 때문에 이를 방지하고자 하는 것이 일반적이다. class Base { // ... Base& operator=(const Base&) = delete;// disallow copying Base(const Base&) = delete; Base& operator=(Base&&) = delete; // disallow moving Base(Base&&) = delete; }; Base x1; Base x2 {x1}; // error : no copy constr ucto..

[C++] static 멤버 초기화

static 클래스 멤버는 클래스의 각 객체의 일부가 아니라 정적으로 할당된다. 일반적으로 static 멤버 선언은 클래스 외부의 정의에 대한 선언 역할을 한다. class Node { // ... static int node_count; // declaration }; int Node::node_count = 0; // definition 하지만 몇 가지 간단한 특별한 경우에는 클래스 선언에서 static 멤버를 조기화할 수 있다. static 멤버는 정수 또는 열거형 형성의 const이거나 리터럴 형식의 constexpr이어야 하고 intiailizer는 상수식이어야 한다. class Curious { public: static const int c1 = 7; // OK static int c2 = ..

728x90
반응형