어플리케이션 프로그램 류는 함수를 어떻게 쓰는지 배우는 것이다.
MFC는 객체지향이기 때문에 C++이 되야한다. 그리고 MFC구조도 배워야 한다.
1.단축키 만들기
액셀러레이터는 쉽게 말하면 단축키이다.
메뉴 리소스에서 아래와 같이 Menu&1\tCtrl+A로 입력해주면 Menu2와 같이 단축키 표시가 된다. 이건 단지 눈에 보이는 UI이기 때문에 단축키가 지정되는 것은 아니다.
이제 단축키를 만들어 보자.
우선 리소스에서 액셀러레이터를 생성하고 아래와 같이 지정한 후 저장한다.
헤더파일에 액셀러레이터도 ID가 생성된 것을 확인할 수 있다.
이제 winMain에서 HACCEL hAccel; 변수를 생성해주고.
메시지 루프만 수정해준다.
hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1)); while(GetMessage(&Message,0,0,0)) |
HACCEL LoadAccelerators(HINSTANCE hInstance, LPCTSTR lpTableName );여기서 쓰인 함수들을 알아보자
이 함수는 리소스로부터 액셀러레이터 테이블을 읽어 들인다. 두 번째 인자는 문자열 포인터이기 때문에 우리가 작성한 액셀러레이터 테이블은 정수 값이므로 MAKEINTRESOURCE 매크로를 사용해야 한다. 이 함수는 액셀러레이터 테이블을 읽은 후 그 핸들 값을 리턴 한다.
int TranslateAccelerator(HWND hWnd, HACCEL hAccTable, LPMSG lpMsg );
이 함수는 키보드 메시지를 WM_COMMAND 메시지로 변경해 주어 액셀러레이터가 동작 할 수 있도록 해준다.
잘 쓰지는 않으니 여기까지 설명.
2.문자열 테이블
메뉴에 쓰거나, 메시지를 출력할 때 테이블 형태로 만들어둔다.
테이블에 있는 내용을 수정하는 건 번역할 때 쓴다. 소스 자체를 수정안하고 테이블 만 수정하면 수정할 수 있게 된다.(c에서 자주 쓰는 값을 define 하는 거랑 비슷한 개념인 듯?)
먼저 리소스에서 스트링테이블을 선택해서 생성해 준다.
아래와 같이 세팅해주면 DS_STRING1 이라는 이름으로 문자열 테이블 테스트가 저장되고 ID는 101을 부여받는다. 이것 역시 헤더파일에 define된다.
아래와 같이 WndProc을 적어준다.
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { |
여기서 쓰인 함수들을 알아보자
int LoadString( HINSTANCE hInstance, UINT uID, LPTSTR lpBuffer, int nBufferMax);
첫 번째 인자는 문자열 리소스를 가진 인스턴트 핸들이다. WinMain의 첫 번째 인자로 전달된다. 두 번째 인자는 문자열의 ID이고 세 번째 인자는 문자열을 읽을 버퍼, 네 번째 인자는 버퍼의 길이이다.
실행화면
3. GDI오브젝트
스톡 오브젝트는 윈도우즈가 기본적으로 제공해 주는 GDI 오브젝트이다. 운영체제가 제공해 주므로 일부러 만들지 않아도 되고 사용하고 파괴할 필요도 없다. 단지 GetStockObjec함수를 사용해서 핸들을 얻기만 하면 된다.
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) } |
GetStockObject , SelectObject 두 개의 함수를 간단하게 설명하자면 만약 그림을 그리는 사람이 있는데 팬이 없다고 가정하고 GetStockObject는 팬을 사오는 것이고 SelectObject는 사온 팬을 손에 잡는거라 생각하면 된다.
OldBrush=(HBRUSH)SelectObject(hdc,MyBrush);
GDI오브젝트는 사용하고 난뒤에 이전의 핸들값을 복원시켜야 한다. 위의 소스를 보면 OldBrush에 반환값을 저장해 주는데 이는 SelectObject함수가 실행되면 반환값으로 이전에 선택되어 있던 오브젝트 핸들값을 리턴시키기 때문에 OldBrush에 저장시켜 주고 그 밑의 SelectObject(hdc,OldBrush);을 통해서 오브젝트 핸들을 복구시켜 주는걸 확인할수 있다.
실행화면
PEN의 사용법도 Brush랑 크게 틀리지 않다
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) } |
MyPen = CreatePen(PS_DASH, 1, RGB(0, 0, 255));를 보면 첫 번째 인자로 선의 종류를 선택(아래의 그림 참고)해주고 두 번째 인자는 선의 굵기 세 번째 인자는 선의 색을 선택한다. RGB는 define 되어있는 메크로이다 어차피 RGB구조가 어떻게 되어있는지 아니까 넘어가자.
여기서도 SelectObject함수가 쓰이는데 이 함수는 오브젝트 전부다 통용되니 팬,브러쉬 등에 따로 외울 필요없이 하나만 사용하면 된다. pen은 동적할당 받기 때문에 끝나면 반드시 지워준다.
실행화면
그리기 모드
실제로 우리가 그림판에 선을 그을 때 선이 움직이는게 아니고 그전에 선을 지우고 새로운 위치에 선을 그리는 것이다 아래의 소스를 통해 알아보자
#include <windows.h>
|
위에서 사용한 변수들의 정보이다.
마우스 버튼을 누르면 bNowDraw를 TRUE로 만들어 선 그리기를 시작하며 버튼이 눌러진 좌표를 시작점, 끝점에 모두 대입해 준다. 즉 처음 선을 그리기 시작할 때는 시작점과 끝점이 같은 상태에서 시작하며 이 상태에서 마우스를 움직이면 끝점이 움직이면서 선이 늘어나게 된다.
마우스가 이동할 때는 먼저 bNowDraw값을 점검해 보고 이 값이 TRUE일 경우만 선을 긋는다. SetROP2 함수를 호출하여 그리고 모드를 R2_NOT로 변경하고 (sx,sy)-(oldx,oldy) 선을 먼저 지운다. 왜 이 좌표에 선을 그으면 선이 지워지는가 하면 이미 그려진 선 위에 반전 모드로 다시 선을 출력하면 선이 지워지는 XOR연산의 특수성때문이다. 이전 선을 지운 후 현 마우스 좌표를 구해 ex, ey에 대입하고 다시 새로운 선을 그린다. 새 선을 그린 후 oldx, oldy에 현재의 끝점을 대입해 주어 다음 마우스 이동시에 이 선을 지울 수 있도록 해준다.
만약 SetROP2(hdc, R2_NOT); 이 부분을 주석처리 해주면 마우스를 움직일 때 마다 선이 남으면서 움직인다.
비트맵을 바로 표시할려면 느리기 때문에 우선 메모리에 올리고 출력한다.
비트맵을 사용할때는 메모리를 추가로 사용한다.
bitblt이 실제로 화면에 올려준다.
확대,축소하는 함수
StretchBlt(/*사본*/ hdc,0,0,246,320,/*원본* /MemDC,0,0,123,160,SRCCOPY);
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151118 22번 업무일지 우대희 API (6) | 2015.11.18 |
---|---|
20151118_주재민_API_5(작성중) (4) | 2015.11.18 |
20151118 임현수 업무일지 WIN32API #5 (4) | 2015.11.18 |
20151117-주재민-api (4) | 2015.11.18 |
20151117 수업 / API_4 남수진 (6) | 2015.11.18 |
20151117 윤재희 #4. 그래픽 (5) | 2015.11.18 |
2015-11-17 Win32 API 개인업무일지 - 천정호 (6) | 2015.11.18 |
2015.11.17_개인업무일지_[Win32API #4]_이량경 (6) | 2015.11.18 |