일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Tips프로그래밍강좌
- c#
- 리뷰
- 백준
- 티스토리
- Win32
- doit코틀린프로그래밍
- Programming
- Desktop
- Tips강좌
- Javascript
- 연산자
- CS
- 함수
- Visual Studio
- 알고리즘
- c++
- 포인터
- 이지스퍼블리싱
- 배열
- Kotlin
- tipssoft
- 김성엽
- 지식나눔강좌
- VS ERROR
- Windows
- 프로그래밍
- Direct2D
- c
- 문법
- Yesterday
- Today
- Total
목록DEV/C C++ (119)
F.R.I.D.A.Y.
C/C++로 작성한 Win32 프로그램의 exe 파일 아이콘 변경하기 리소스 파일 추가 아이콘 변경을 위해서는 리소스 파일을 추가 해야한다. 프로젝트에서 [새 항목 추가 - 리소스 - 리소스 파일]을 선택해 프로젝트에 추가한다. 리소스 뷰[# Ctrl + Shift + E]에서 리소스를 추가한다. 프로그램의 아이콘을 변경할 것이므로 아이콘을 추가한다. 가져오기를 통해, 원하는 아이콘을 별도로 추가할 수도 있다. 추가가 완료되면 세 번째 사진과 같이 IDI_ICON1 등의 추가된 아이콘이 발생함을 알 수 있다. 이제 솔루션 탐색기[# Ctrl + Alt + L]에서 Resource.rc의 코드 보기[# F7]를 통해 코드 편집을 한다. 코드 편집기를 열면 오른쪽 이미지와 같이 리소스 관련 내용이 소스코드 ..
함수 포인터 예시 사용자로부터 입력을 받는 프로그램이 있다고 하자. 그럼 해당 프로그램은 입력으로 들어온 값에 따라 다른 명령을 수행하도록 구성해야한다. 즉, 분기 구문[# if, switch 등]을 이용해야한다. #include #include using namespace std; void doHello(){ cout
C++에서 사용하는 레퍼런스 타입 함수로 값 전달하기 C에서 함수로 값을 전달하는 방법에는 크게 두 가지 방법이 있습니다. 값으로 전달(Call by Value) 주소로 전달(Call by Address) 사실, 주소로 전달하는 방식 또한, 결국은 값에 의한 전달과 동일한 개념이지만 일반적으로 값으로 전달했을 때의 단점을 상쇄할 수 있기 때문에 별도의 방식으로 보고 있죠. C++에서는 하나의 타입이 추가됩니다. 레퍼런스 타입 C++에는 레퍼런스 타입이라는 불리는 타입이 추가되었습니다. 아래처럼 사용할 수 있습니다. int a = 5; int& ref = a; ref = 7; // a도 7이 됨 레퍼런스 타입으로 변수를 선언하면, 대입한 변수의 공간을 함께 공유합니다. CallbyAddress와의 차이 레..
사용자 지정 서식지정자를 구현해 printf 이진수 출력하기 printf는 C언어의 스탠다드 라이브러리에서 출력을 담당하는 함수로 서식 지정자를 가지고 있다. 서식지정자 printf는 기본적으로 바이너리 출력을 지원하지 않는다. 즉, 이진수 출력을 지원하기 위해서는 따로 함수를 만들어 별도로 작성을 하거나, 직접 printf의 모든 기능을 구현하면서 이진수 출력에 대한 코드를 넣어서 라이브러리를 새로 만들어야한다. 이진수 출력의 문제나, 혹은 직접 커스텀 서식지정자를 만들고 싶을 때도 동일하게 발생하는 문제다. 이진수 출력용 서식지정자 정하기 제공되는 서식지정자에는 이진수 형식으로 출력을 지원하는 서식지정자를 제공하지 않으므로, 새로운 함수를 만들어 기존 printf 함수와 혼용해 코드를 작성하면 그 길..
모니터 위치 지정 Windows에서는 여러 개의 모니터를 사용할 때 각 모니터의 위치를 정할 수 있다. 나의 경우에는 1번 모니터를 메인으로 위에 2번 모니터가 존재하는 방식으로 사용한다. 이런 상황에서, 멀티 모니터 프로그래밍을 하려면 각 모니터의 위치를 찾아야하는 문제가 있다. 그러나 바탕화면을 담당하는 WorkerW 프로세스의 영역을 구하면 다음과 같다. 각 모니터 모두 FHD 해상도에 세로로 이어 붙인 상황이기 때문에 크기는 1920×2160이 맞다. 그러나 이를 Windows 좌표로 분석하면 다른 값이 노출된다. 위 두 장의 사진은 생성한 윈도우위 좌표를 윈도우 안에 출력해주는 코드이다. 메인으로 사용하고 있는 1번[# 티스토리가 출력되는 화면, 하얀 바탕] 모니터의 좌-상 위치는 (0, 0)이..
이미 시중에 CS로 만들어진 ADBlock 프로그램이 존재하지만 기억나지 않을 정도로 익숙해져버린 카카오톡 PC AD. 존재하는것은 상관 없지만, 창의 일정 부분을 저렇게 차지하다보니 공간 낭비가 아닐 수 없다. 이미 시중에 C#으로 만들어진 ADBlock 프로그램이 존재하지만, 원리나 한번 알아보자고 만든 코드. #include #include #include using namespace std; int main() { HWND kakao; kakao = FindWindowW(L"EVA_Window_Dblclk", L"카카오톡"); char titleKao[100]{}; GetWindowTextA(kakao, titleKao, 99); cout
회전한 사각형을 외접하는 사각형 구하기 회전 사각형 이미지처럼 회전각이 존재하는 사각형은 그 외부에 해당 사각형을 포함하는 사각형을 그릴 수 있습니다. 해당 사각형을 구하는 방법을 알아봅니다. 여기서부터 회전각을 가진 사각형을 포함하는 사각형[# 빨간색으로 되어 있는 사각형]을 외접 사각형이라 명명합니다. 삼각함수 외접 사각형을 구하는 방법은 피타고라스 방정식을 이용하는 것입니다. 빗변 길이의 제곱은 가로 길이의 제곱과 세로 길이의 제곱의 합으로 이루어진다는 방정식을 이용하면 외접 사각형을 구할 수 있습니다. 80도 만큼 회전한 사각형이 있습니다. 그럼 빨간색으로 강조된 삼각형이 형성됩니다. 해당 부분의 가로축과 세로축은 COS와 SIN 삼각함수를 이용하면 구할 수 있습니다. 여기에서 COS에 적용할 각..
템플릿 클래스를 상속하는 템플릿 클래스에서 부모 템플릿 클래스의 멤버 사용하기 템플릿 상속 템플릿 클래스 상속 또한 일반 클래스 상속과 같은 방식으로 합니다. template class Test{ protected: T* list; size_t length; } template class exam : Test{ exam(T* arr, size_t length): length{length}{ list = new T[length]; for(size_t i = 0 ; i < length; ++i) list[i] = arr[i]; } } 다만 일반 클래스 상속과 달리 부모 템플릿에서 상속한 list[# 템플릿으로 구현한 자료형 T를 사용] 멤버를 exam에서 사용하기 위해서는 이런 식으로 사용할 수 없다. 만일..
A 클래스 메서드를 가리키는 A 클래스의 멤버 함수 포인터의 선언과 사용 함수 포인터 함수 포인터는 말 그대로 함수를 가리키는 포인터입니다. 함수 포인터에 대한 자세한 설명은 아래 링크를 참고하세요. 포인터(pointer) part3. 함수 포인터 포인터는 신기하게도 함수까지 가리킬 수 있습니다. 어차피 이름이 있으니 이름으로 사용하면 될 텐데 뭐가 좋으냐는 생각을 할 수 있겠지만 이번에 그 생각이 바뀌실 겁니다. # 포인터에 대한 pang2h.tistory.com 클래스의 메서드도 함수 포인터로 이용을 할 수 있습니다. 그러나 일반적인 함수 포인터 선언으로는 제대로 사용할 수 없습니다. 해당 문제는 클래스 메서드의 특성을 알아야 이해가 가능하기 때문에 해당 부분을 먼저 설명합니다. 클래스 클래스는 객체..
키보드 입력으로 사각형을 움직여봅니다. # Win32 프로그래밍을 이해하고 있어야합니다. # 알지 못하는 경우 여기에서부터 시작할 것을 권장합니다. # 본 문서는 Direct2D 기반으로 구현합니다. Win32만 알아도 이해하는데 큰 무리는 없습니다. 객체 이동 키보드 이동으로 객체 이동을 한 번 구현해보겠습니다. 일반적으로 키보드 조작으로 객체 이동을 구현한다고 하면 아래와 같이 구현을 할 것입니다. 키 코드 명령 VK_LEFT 객체.x - offset VK_UP 객체.y - offset VK_RIGHT 객체.x + offset VK_DOWN 객체.y + offset LRESULT MainWindow::OnKeyDown(WPARAM key) { switch (key) { case VK_LEFT: cur..