달력

12

« 2018/12 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 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
  • 31
  •  
  •  
  •  
  •  
  •  






이번에 살펴볼 것은,

이미지에 대해서 특정 부분만 보여준다거나(감춘다거나), 이미지특성을 반전시키는 것에 대해서 통합해서 살펴보자.

먼저 실행 화면은 다음과 같다.

*이미지의 내용은 중요하지 않습니다.

이미지를 보면 특정 원안에 부분만 이미지가 보여지고(저 원은 움직일 수 있고 사이즈 조정이 가능합니다.)
원엔에 특정 사각형은 그 부분의 이미지가 반전되는 것을 확인 할 수 있다.


코드를 살펴보자.
먼저 View클래스에 멤버 변수로,


CImage와 Crect를 하나씩 생성해 주자.

그리고 WM_PAINT, WM_KEYDOWN, WM_CREATE 메시지를 각각 추가해 주자.



소스에 대한 기본 설명은 주석에 다 포함 시켜 놓았다. 특별히 어려운 부분이 존재하진 않고,
특정 영역을 분할한다는 개념만 잡으면 어렵지 않다.
Posted by 안식의후크




프로그램을 인스톨 할때라던가,

특정 게이지가 오르락 내리락 할 때 그 안에 글씨를 상황에 맞춰서 색상 변경을 해주어야 한다.


만약 저안에 글자가 처음엔 빨강색 이였다가, 빨간색 배경이 들어 오면 흰색으로 변경하는 거라고 치자.

그에 따른 소스코드를 파악해 가면서

프로그래머는 역시 사기꾼 이라는 생각이 드는 예제인거 같다.

먼저 실행 결과를 보자.


마치 게이지의 위치에 따라서 글자가 자연스럽게 색상이 변경하는 '것'처럼 보인다.

소스를 보자.

하나하나 집어 가면서 설명을 하자면,
소스에 있는 RgnSize View클래스의 int형 멤버 변수이다.(초기값 250)


무슨 짓을 할지는 모르겠지만, 최초 2개의 Rect를 사용해 사각 영역을 생성해 주었다.
수치를 보니 2개의 사각형을 연달아 그려주고 있다.
여기서 부터 사기는 시작된다.

각각의 사각 영역에 다른 색상을 지정해 주었다.

2개의 사각 영영에 대해서 별도의 영역을 만들어 주고 있다.


다음으로 글자 폰트의 크기, 글꼴을 지정한 후 폰트를 생성하였다.


마지막으로 글자를 출력해 주고 있는데,
코드를 보면 알겠지만 글자를 2번 출력해 주고 있다. 한번은 rgnLeft에
한번은 rgnRight에 해주고 있다.

즉 2개의 사각 영역을 붙혀서 각각의 사각형에 영역을 만들고, 그 영역안에
다른 색상의 글자를 2번 출력 함으로써,
마치 하나의 글자가 자연스러운 색상변환이 이루어 지는거 같아 보이는 '것'일 뿐이다.

만약 사용자에 입력에 따라 사각 영역의 사이즈를 변경하고 싶다면(실행 화면처럼)
RgnSize 변수를 +,- 시켜 주는 것만으로 충분하다.(소스 생략)
Posted by 안식의후크
2010.05.17 02:39

MFC-CImage( 스크린 샷 찍기 ) 프로그래밍/MFC2010.05.17 02:39






화면에 있는 스크린 샷을 찍을땐 어떻게 해야 할까,

그것도 작업 영역에 대해서만,

책에 있는 예제를 조금 변경해서 원하는 결과를 만들었지만,

더 나은 방법이 있는지는 아직 잘 모르겠다.

게임을 하다보면 스크린 샷을 찍게 될 경우가 종종 있다.

그랬을 경우 풀스크린이라면 상관 없을지도 모르나,

창모드라면 윈도우 화면 전체가 아닌 현재 플레이 중인 게임 화면만 이미지로 저장 되어야 한다고 생각한다.

프로젝트에서 WM_PAINT를 추가 하여 아무 이미지나 화면에 띄워 보자.
(필자는 이전의 결과 사용)

그 후 원하는 메시지 탭을 하나 추가해 보자.

키보드 라던지, 마우스 라던지,

추가한 이후에 다음처럼 코드를 작성한다.

기본적인 구조 설명은 주석으로 달아 놓았고.
살작 자세히 보아야 할 부분은
Create() 함수화 Save(), ShellExecute부분 인것 같다고 생각한다.
Create는 x, y의 크기 만큼, 이미지를 생성한다.
3번째 인자는 어떤 속성인지 정하는 부분인데, 예제에서는 바탕화면과 동일한 색상수를 사용한다고 보면 된다.
다음으로 Save는 먼저 파일의 이름을 지정하고, 그 포멧 타입을 지정한다.
JPEG, BMP, GIF, PNG등이 같이 존재한다.
마지막으로 파일을 실행하는 ShellExecute인데,
1번째 인자로 부모 핸들( 예제에서는 NULL이기 때문에 바탕 화면이 되고 )
2번째 인자는 어떤 동작을 할 것인지에 대해 지정해 준다. open이기 때문에 실행을 의미한다.(또한 explore, edit, find, print등이 존재)
3번째로는 어떤 대상을 사용할 것이가에 대해서 이며(여기서는 open할 대상)
4번째는 3번째 인자가 실행 파일인 경우 실행 파일의 실행 인자를 명시,
5번째는 실행할 프로그램의 현재 폴더 경로 이 값이 NULL이면 윈도우 기본 설정을 적용한다고 한다.
마지막인자는 nShowCmd인데,
어떤식으로 보여 줄지에 대한 플래그 값정도로 예상된다.

// 실행 화면

// 스크린 샷을 찍은 후 저장된 파일,
Posted by 안식의후크
2010.05.17 01:41

MFC-CImage 클래스 프로그래밍/MFC2010.05.17 01:41






기존의 이미지를 출력하는 방식이 아닌
MFC에서 추가된 CImage를 사용해 보자.


소스 코드 자체가 딱히 어려운 부분은 없다. 마지막에 흑백으로 출력 하는 부분이 있는데,
RGBtoGray라는 부분은 inline으로 선언되 있다.

흑백으로 변경하는 알고리즘은 거의 공식화 되어 있다고 하니 그냥 단순하게 기억해 두자.
CImage에서는 bmp뿐만 아니라 jpg, gif, png등이 있다고 한다.

CImage를 사용하기 위해서는 반드시
#include <atlimage.h> 를 해 주어야 한다.

// 실행 화면

단점은, 이미지에 대해서 모든 픽셀을 변경해서 다시 픽셀을 설정해 주기 때문에, 예제 처럼 WM_PAINT에서 매번 처리하기에는 비효율 적이다.
WM_CREATE나 또는 한번만 불러오게 변경하여, 추가 이미지를 생성하여 그 안에 변경후 저장해 두는 것이 훨씬 나은 구현 방법일 것이다.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-TextRgn( 게이지에 따른 텍스트 변화 )  (0) 2010.05.19
MFC-CImage( 스크린 샷 찍기 )  (0) 2010.05.17
MFC-CImage 클래스  (0) 2010.05.17
MFC-비트맵 띄우기  (0) 2010.05.16
MFC-가상 버튼 만들기  (0) 2010.05.16
MFC-부채꼴 그리기  (0) 2010.05.16
Posted by 안식의후크
2010.05.16 21:39

MFC-비트맵 띄우기 프로그래밍/MFC2010.05.16 21:39







MFC의 비트맵도 API와 매우 흡사하다.

일단 비트맵 리소스를 하나 추가하자.

다음과 같은 비트맵이 있다고 하였을 때,

이제 이 비트맵을 가지고 띄우는 일과, 투명값, 알파값, 사이즈 조정등을 하나하나 해보도록 하자.

기본적으로 리소스에 존재하는 이미지를 띄우는 개념에 대해서는 구지 설명하지 않고,

소스 위주로 보도록 하자.

먼저 프로젝트에 WM_PAINT 메시지를 하나 만들자.


기본 적인 설명은 주석을 달아 놓았다.
큰 구조 자체는 변화가 없다. MemDC를 생성하고 그 안에 Bitmap을 넣은 후 DC에 MemDC를 복사 하는 방법이다.
BitBlt의 인자는 출력할 윈도우 좌표 x,y
비트맵의 폭과 높이.
출력할 비트맵을 저장한 메모리 DC의 주소
메모리 DC에 들어 있는 비트맵의 시작 좌표
적용할 래스터 연산 이다.

// 실행 화면


두번째로 기본의 이미지를 상태로 크기를 조정하는 예제를 살펴 보자.

다른 부분은 전혀 바뀐게 없다. 단지,

BitBlt의 부분을

로만 변경해 주어도 이미지의 크기가 좌우 2배씩 늘어 난 것을 알 수 있다.

각각의 인자는 BitBlt과 비슷 하지만, 3,4번째 인자로 이미지 확대를 가능케 하고,
8,9번째 인자에 원본 이미지의 폭과 높이를 추가로 지정하는것이 차이점이다.
// 실행 화면


다음으로 이미지에 특정 RGB값에 대해서 투명하게 처리하는 함수를 살펴 보자.

이전 함수와 차이라고는 마지막 변수에 RGB값을 컬러키로 지정해서 그 부분만 투명하게 한다는 것!
// 실행 화면

마지막으로 알파블랜딩에 대해서 알아 보자.

기존과는 조금 차이가 있는데, 마지막에 들어 가는 인자가 BLENDFUNCTION이라는 구조체에 대한 정보를 삽입하게 된다.


// 실행 화면

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-CImage( 스크린 샷 찍기 )  (0) 2010.05.17
MFC-CImage 클래스  (0) 2010.05.17
MFC-비트맵 띄우기  (0) 2010.05.16
MFC-가상 버튼 만들기  (0) 2010.05.16
MFC-부채꼴 그리기  (0) 2010.05.16
MFC-도형 그리기  (0) 2010.05.16
Posted by 안식의후크
2010.05.16 19:56

MFC-가상 버튼 만들기 프로그래밍/MFC2010.05.16 19:56






가상으로 버튼을 만들어 보자.

먼저 WM_LBUTTONDOWN과 WM_LBUTTONUP, WM_PAINT에 대해서 메시지탭에서 추가해 주자.



여기까지는 특별히 어려운게 없다.
단순히 클릭을 하면 메시지 박스를 띄우는 것이라 생각 할 수 있지만,
우리가 원하는건 가상 버튼이다, 이제 WM_PAINT를 살펴 보자.

중요한 내용은 다 주석을 달아 놓았다.
처음 보는 부분도 존재하지만 특별히 이해가 가지 않는 부분은 없는거 같다.
Draw3dRect는 2번째 인자로 왼쪽과 위쪽의 색상을,
3번째 인자로 오른쪽과 아래의 색상을 추가 정의 할 수 있다.(즉 입체감을 주기 위해 존재한다고 보면 될듯 하다)

// 실행 화면
실제 버튼도 아닌 것이 입체적인 효과를 내고 있다.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-CImage 클래스  (0) 2010.05.17
MFC-비트맵 띄우기  (0) 2010.05.16
MFC-가상 버튼 만들기  (0) 2010.05.16
MFC-부채꼴 그리기  (0) 2010.05.16
MFC-도형 그리기  (0) 2010.05.16
MFC-선 그리기  (0) 2010.05.16
Posted by 안식의후크
2010.05.16 19:11

MFC-부채꼴 그리기 프로그래밍/MFC2010.05.16 19:11






원을 그리는 것은 쉽지만 부채꼴을 그리기 위해서는 조금더 알아야 할것이 존재한다.

먼저 코드와 실행 화면을 보자.



// 실행 화면


일단 다음 처럼 부채꼴을 띄울 수 있는데

사용해야 할 함수는 CDC에 존재하는 Pie 함수 이다.

Pie 함수는 시작점과, 끝점을 지정해 주면,
시작점을 기준으로 끝점까지 반시계 방향으로 그림을 그리게 된다.

이 부분을 보면, 먼저 PieRect라는 CRect를 넘겨주면서,
2번째 인자로 부채꼴의 시작점, 3번째 인자로 부채꼴의 끝점을 보내준다.
즉 PieRect안에서 반시계 방향으로 시작부터 끝까지 그려준다고 볼 수 있다.
CRect 클래스 안에는 CenterPoint라는 함수가 존재 하는데,
예제에서는 x축이 20~140까지의 사각 영역중에 중간, 80이라는 위치가 나오게 될 것이다.
(y축도 마찬가지)
그런 식으로 부채꼴의 시작, 끝을 잡아 주고 있다.
마찬가지로, 2번째의 부채꼴 역시,

PieRect를 안을 기준으로,
시작점, 끝점을 각각 잡아 주고 부채꼴의 도형을 그리고 있다.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-비트맵 띄우기  (0) 2010.05.16
MFC-가상 버튼 만들기  (0) 2010.05.16
MFC-부채꼴 그리기  (0) 2010.05.16
MFC-도형 그리기  (0) 2010.05.16
MFC-선 그리기  (0) 2010.05.16
MFC-GDI의 개념  (0) 2010.05.16
Posted by 안식의후크
2010.05.16 18:56

MFC-도형 그리기 프로그래밍/MFC2010.05.16 18:56






기본적으로 그리기를 제공하는 원이나, 사각형이 아닌

삼각형을 포함한 다각형을 그리고 싶을 때 어떻게 해야 하는지,

먼저 예제를 보자.


다음 처럼 WM_PAINT에 소스 코드를 작성하게 되면,
화면에 사다리꼴? 같은 사각형이 보여지게 될 것이다.
각 코드가 무슨 일을 하는지에 대해서는 주석으로 설명해 놓았고,
여기서 한단계 더 발전하여 조금더 간단하게 출력하는 방법이 존재한다.

화면에 5각형을 그려 보았다.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-가상 버튼 만들기  (0) 2010.05.16
MFC-부채꼴 그리기  (0) 2010.05.16
MFC-도형 그리기  (0) 2010.05.16
MFC-선 그리기  (0) 2010.05.16
MFC-GDI의 개념  (0) 2010.05.16
MFC-마우스 입력( TRACKMOUSEEVENT )  (0) 2010.05.16
Posted by 안식의후크
2010.05.16 18:28

MFC-선 그리기 프로그래밍/MFC2010.05.16 18:28






이전 GDI개념에 대해 설명할때 간단하게 선의 속성을 잡아 주는 것을 보았다.

이번엔 여러개의 선을 그리고, 그 선에 따른 스타일 값에 따른 변화를 살짝 살펴 보자.

WM_PAINT메시지를 추가 하고.


소스 코드를 작성하고 실행하면,

다음과 같은 결과를 볼 수 있다.
//실행 화면

기존의 Pen 생성처럼 단순히
CPen Pen(____)가 아닌,
배열로 생성해서 생성자에 속성을 넣는것이 아닌.
CreatePen()을 사용한다는 것과,
공통적인 속성에 대해서 LOGBRUSH 를 사용해 그 값을 &로 넘겨 준다는것이 차이가 있을 뿐이다.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-부채꼴 그리기  (0) 2010.05.16
MFC-도형 그리기  (0) 2010.05.16
MFC-선 그리기  (0) 2010.05.16
MFC-GDI의 개념  (0) 2010.05.16
MFC-마우스 입력( TRACKMOUSEEVENT )  (0) 2010.05.16
MFC-새로운 클래스 추가 하기  (0) 2010.05.16
Posted by 안식의후크
2010.05.16 18:08

MFC-GDI의 개념 프로그래밍/MFC2010.05.16 18:08






API에서 GetDC라던가, BeginPaint라던가, ReleaseDC, EndPaint에 대해서,

CDC 클래스가 담당 하고 있다고 생각하면 딱히 GDI의 개념 자체는 바뀐게 없다.

WM_PAINT에서는 화면에 출력, 가려진 부분이 생기면 다시 출력 하거나 그런 부분은 모두 똑같고,

Pen이나 Brush에 대한 것도

CPen이나 CBrush 클래스에서 정보들을 가지고 있다.

OldPen이나 OldBrush를 통해서 되돌아 오는 DC의 값을 저장해 두었다가,

출력이 끝나면 다시 이전 값으로 되돌리는 작업이라던가.

BitMap을 출력할 때 MemDC를 사용해서 미리 그려 넣은 후 Dc간의 복사를 해준다거나 하는 것도

API의 GDI와 차이가 없다.

단지 그것이 클래스에서 관리하게 되었다는 것뿐?

일단 실행 화면을 먼저 보고 예제 소스를 봐보자.

왼쪽은 WM_PAINT가 아닌 부분에서 그린 것.
오른 쪽은 WM_PAINT에서 그린것

화면을 가리고 그 부분을 다시 움직여 보면,
왼쪽은 지워져 있고( 다시 그려 주지 않고 ), 오른쪽은 그대로이다( 다시 그려준다 )

왜 저러는 지는 이미 API에서 살펴 보았기 때문에 설명을 또 하진 않고,

간단하게 사용법을 훑어 보기 위해 이제 코드를 보자.

WM_LBUTTONDOWN과, WM_PAINT를 메시지 탭에서 추가한다.

LBUTTONDOWN에서는 CDC에 GetDC를 받아서 그림을 그려 주고 있고,
PAINT에서는 CPaintDC를 통해 그림을 그려 주고 있다.

특별히 어려운 부분은 없으니 그냥 넘어 가자.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-도형 그리기  (0) 2010.05.16
MFC-선 그리기  (0) 2010.05.16
MFC-GDI의 개념  (0) 2010.05.16
MFC-마우스 입력( TRACKMOUSEEVENT )  (0) 2010.05.16
MFC-새로운 클래스 추가 하기  (0) 2010.05.16
MFC-마우스입력( 드래그 & 드랍 )  (0) 2010.05.16
Posted by 안식의후크