728x90
반응형
<Win32API>✔
================================================================
✔ 5-4 액셀러레이터
* 단축키
- &를 넣어 Alt키와 함께 사용하는 키를 단축키 (액셀러레이터와는 의미가 조금 다름)
- 단축키는 반드시 Alt키와 함께 사용 (메뉴에 있는 항목을 키보드로 선택하는 빠른 방법)
* 액셀러레이터는 메뉴와 상관없이 언제든지 사용할 수 있다는 차이가 있다.
* 각 항목에 대해 Ctrl+A, Ctrl+B, Ctrl+C의 액셀러레이터를 할당
- 메뉴를 선택하지 않고 키보드로 메뉴 기능을 실행하도록 해 본다.
1. 메뉴 편집기를 열어 메뉴 리소스 수정
- 리소스 뷰 IDR_MENU1
<Caption 속성을 편집>
- 항목의 캡션을 수정
수정전 | 수정후 |
Menu1 | Menu&1\tCtrl+A |
Menu2 | Menu&2\tCtrl+B |
Exit | &Exit\tCtrl+C |
* \t : 탭문자다. 액셀레이터가 메뉴 리스트의 오른쪽으로 정렬되게 해준다.
2.File 메뉴는 F문자가 단축키로 지정되어 있어 Alt+F를 누르면 File 메뉴가 열린다.
- 액셀러레이터를 만들려면 별도의 리소스를 만들어야 한다.
3. 액셀레이터 속성 편집기입력
- ID : 프로그램 소스에서 액셀레이터를 참조 할때 이 값을 사용한다.
- Key : 액셀레이터로 사용할 키를 선택
- Modifier : 키와 함께 눌러질 조합키
- Type : 키값이 아스키 코드 값인지 가상키 코드 값인지 설정.
*액셀러레이터의 ID를 메뉴의 ID와 같도록 해 두었기 때문에 WndProc의 WM_COMMAND는 수정할 필요가 없다.
- HACCEL LoadAccelerators(HINSTANCE hInstance, LPCTSTR lpTableName );
- 이 함수는 리소스로부터 액셀러레이터 테이블을 읽어들인다.
- int TranslateAccelerator(HWND hWnd, HACCEL hAccTable, LPMSG lpMsg );
- 이 함수는 키보드 메시지를 WM_COMMAND 메시지로 변경해 주어 액셀러레이터가 동작할 수 있도록 해 준다.
------------------------------------------------
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM );
HINSTANCE g_hInst;
LPSTR lpszClass = "Menu" ;
HACCEL hAccel;
int APIENTRY WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance
, LPSTR lpszCmdParam, int nCmdShow )
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = ( HBRUSH)GetStockObject( WHITE_BRUSH);
WndClass.hCursor = LoadCursor(NULL , IDC_ARROW );
WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = ( WNDPROC)WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1 );
WndClass.style = CS_HREDRAW | CS_VREDRAW ;
RegisterClass(&WndClass);
hWnd = CreateWindow(
lpszClass,
TEXT( "SMART"),
WS_OVERLAPPEDWINDOW,
500, // 시작점 사각형의 각 4꼭지점
100,
400,
400,
NULL, ( HMENU) NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
hAccel = LoadAccelerators(hInstance , MAKEINTRESOURCE (IDR_ACCELERATOR1 ));
while ( GetMessage(&Message, 0, 0, 0))
{
if (0==( TranslateAccelerator(hWnd, hAccel, &Message)))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
}
return Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
static RECT rt;
switch ( iMessage)
{
case WM_COMMAND:
switch ( LOWORD( wParam))
{
case ID_FILE_MENU1:
MessageBox(hWnd , L"첫번째 메뉴를 선택했습니다." , L"Menu Demo", MB_OK);
break;
case ID_FILE_MENU2:
MessageBox(hWnd , L"두번째 메뉴를 선택했습니다." , L"Menu Demo", MB_OK);
break;
case ID_FILE_EXIT:
PostQuitMessage(0);
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return ( DefWindowProc(hWnd , iMessage , wParam , lParam ));
}
}
------------------------------------------------
✔ 5-5 문자열 테이블
- 윈도우즈에서는 문자열들도 리소스의 일종으로 취급된다.
- 대량의 문자열을 사용하는 프로그램은 리소스에 문자열을 정의해 두고 필요할 때마다 리소스에 문자열을 읽어와 사용한다.
* 문자열 테이블의 내용만 바뀌면 게임의 내용이 바뀐다.
이 내용을 수정 = 번역, 의역 처럼 프로그램을 수정 일일이 안해도 엑셀의 표 바꾸듯, 대부분의 문자열을 등록해 둔다.
* 문자열 리소스를 읽을 때 함수
int LoadString( HINSTANCE hInstance, UINT uID, LPTSTR lpBuffer, int nBufferMax);
- 첫번째 인수는 문자열 리소스를 가진 인스턴스 핸들인데 이 값은 WinMain의 첫번째 인수로 전달되며 ApiStart.txt에서 이 인수를 전역 변수 g_hInst에 대입해 두었으므로 g_hInst를 써 주면 된다.
- 두번째 인수로 읽어올 문자열의 ID를 주고
- 세번재 인수로 문자열을 읽을 버퍼,
- 네번째 인수로 버퍼의 길이를 주면 된다.
* 문자열 테이블의 이점
1. 문자열 자체가 코드와 분리됨으로써 문자열만 따로 관리
2. 다국어 버전을 쉽게 만들 수 있다는 점 (리소스는 조건에 따라 교체할 수 있기 때문에 경우에 따라 다른 문자열을 사용)
------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
WCHAR str[256];
switch ( iMessage)
{
case WM_PAINT:
hdc = BeginPaint( hWnd, &ps);
LoadString(g_hInst, IDS_STRING1 , str, 256);
TextOut(hdc, 10, 10, str, lstrlen(str));
EndPaint( hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return ( DefWindowProc(hWnd , iMessage , wParam , lParam ));
}
------------------------------------------------
✔ 6-1-가. GDI오브젝트
- GDI 오브젝트(GDI Object)란 그래픽 출력에 사용되는 도구
그림판의 선 모양 선색상을 변경할수 있는 항목
GDI 오브젝트 | 핸들 타입 | 설명 | 디폴트 |
펜 | HPEN | 선을 그을 때 사용된다. | 검정색의 가는 선 |
브러시 | HBRUSH | 면을 채울 때 사용된다. | 흰색 |
폰트 | HFONT | 문자 출력에 사용되는 글꼴 | 시스템 글꼴 |
비트맵 | HBITMAP | 비트맵 이미지 | 선택되지 않음 |
팔레트 | HPALETTE | 팔레트 | 선택되지 않음 |
영역 | HRGN | 영역 | 선택되지 않음 |
- 비트맵 그릴수도 있고, 들고 올수도 있다.
* 윈도우가 해주는것은 그릴수도 있게, 읽어와서 집어넣는것.
✔ 6-1-나. 스톡 오브젝트
- 스톡 오브젝트(Stock Object)는 윈도우즈가 기본적으로 제공해 주는 GDI 오브젝트
- 운영체제가 제공해 주므로 일부러 만들지 않아도 언제든지 사용할 수 있으며
- 사용하고 난 후에 파괴시켜 줄 필요도 없다. 다음 함수로 핸들을 얻어 사용하기만 하면 된다.
HGDIOBJ GetStockObject( int fnObject );
- Select 펜을 바꾸는것
-> 올드 : 펜을 바꾸어도 되지만 되돌려 놔야 한다.
-> Select 기존에 있는 브러시로 바꿔잡는다.
fnObject | 설명 |
BLACK_BRUSH | 검정색 브러시 |
GRAY_BRUSH | 회색 브러시 |
NULL_BRUSH | 투명 브러시 |
WHITE_BRUSH | 흰색 브러시 |
DKGRAY_BRUSH | 짙은 회색 브러시 |
LTGRAY_BRUSH | 옅은 회색 브러시 |
BLACK_PEN | 검정색 펜 |
WHITE_PEN | 흰색 펜 |
NULL_PEN | 투명 펜 |
ANSI_FIXED_FONT | 고정폭 폰트 |
ANSI_VAR_FONT | 가변폭 폰트 |
DEFAULT_PALETTE | 시스템 팔레트 |
* HGDIOBJ SelectObject( HDC hdc, HGDIOBJ hgdiobj ); 첫번째 인수로 DC의 핸들 두번째 인수로 GDI 오브젝트의 핸들을 주면 DC에 해당 오브젝트를 선택해 준다. 이후부터 GDI는 그래픽을 출력할 때 선택된 오브젝트를 사용하게 된다. SelectObject가 리턴하는 값은 새로 선택되는 오브젝트 이전에 선택되어 있던 같은 종류의 오브젝트 핸들이다. 이 핸들값은 복구를 위해 반드시 별도의 변수에 저장해 두어야 한다. 위 예제에서는 이전 브러시의 핸들을 OldBrush 변수에 대입해 두었다. 회색 스톡 브러시를 선택한 후 Rectangle 함수로 사각형을 그렸으므로 사각형의 내부는 회색으로 채워지게 된다. 사각형을 그리고 난 후는 SelectObject를 한번 더 호출하여 원래의 GDI 오브젝트인 OldBrush를 복구해 주어야 한다. |
------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
HBRUSH MyBrush;
HBRUSH OldBrush;
switch ( iMessage)
{
case WM_PAINT:
hdc = BeginPaint( hWnd, &ps);
MyBrush = (HBRUSH)GetStockObject( GRAY_BRUSH);
OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);
Rectangle(hdc, 50, 50, 300, 200);
SelectObject(hdc, OldBrush);
EndPaint( hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProcA( hWnd, iMessage, wParam, lParam));
}
------------------------------------------------
******************************************************
* 펌웨어는 레지스트 사용방법 이 핵심이고
* api는 함수 활용 방법을 많이 아는 것이 핵심.
- C가 기반이 되어 Win32API가 가능.
- C -> Win32API -> MFC
* MFC 구조 책 사서 공부할것.
* 펌웨어의 UI를 구현해야 되면Win32API, C#을 활용하면 됨.
******************************************************
✔ 6-1-다. 색상
#define RGB(r,g,b)((COLORREF)(((BYTE)(r) | ((WORD)((BYTE)(g))<<8)) | (((DWORD)(BYTE)(b))<<16)))
내부적으로 BGR로 되어있어서 RGB매크로로 정의 되어있다.
✔ 6-1-라. 펜
* SelectObject
- 오브젝트라는 것은 펜이든 브러쉬든 교체가 다된다. 펜은동적할당 받으므로 DeleteObject지워주어야한다.
HPEN CreatePen( int fnPenStyle, int nWidth, COLORREF crColor );
fnPenStyle : 그려질 선의 모양을 정의한다.
nWidth : 선의 폭을 지정한다
crColor : 선의 색상을 지정한다
- GDI 오브젝트는 사용한 후 반드시 삭제해 주어야 한다.
- GDI 오브젝트도 메모리를 사용하기 때문이다. 메모리를 할당한 후 반드시 해제해 주어야 하는 것처럼 GDI 오브젝트도 사용이 끝나면 해제해 주어야 하는 것이 원칙이다.
- 만약 해제해 주지 않으면 시스템의 메모리를 갉아먹게 될 것이다.
- GDI 오브젝트를 삭제할 때
BOOL DeleteObject( HGDIOBJ hObject ); 사용한다.
- 삭제하고자 하는 GDI 오브젝트의 핸들만 인수로 넘겨주면 된다.
단, 이때 주의할 것은 DC에 현재 선택되어 있는 GDI 오브젝트는 삭제할 수 없다는 점이다. 현재 사용되고 있는 객체를 함부로 삭제하도록 내버려 둘 수는 없기 때문에 생긴 일종의 안전 장치 역할을 하는 규정이다. 그래서 삭제를 하기 전에 먼저 DC에 선택된 객체를 선택 해제해 주어야 하는데 선택을 해제시켜주는 별도의 함수는 제공되지 않으므로 다른 GDI 오브젝트를 선택해 주는 방법을 사용한다. 이런 이유로 OldPen이라는 핸들을 만든 후 이 핸들에 MyPen이 선택되기 전의 펜 핸들을 저장해 두고 MyPen을 삭제하기 전에 OldPen을 다시 선택해 주는 것이다.
DeleteObject(SelectObject(hdc, OldPen));
* SelectObject가 이전 핸들값을 리턴해 주므로 OldPen을 선택함과 동시에 리턴되어져 나오는 MyPen을 삭제하는 것이다. 이때 사용되는 OldPen은 이전에 선택되어 있던 펜을 보존한다기보다는 단순히 MyPen을 선택해제하기 위한 용도로 사용된 것이다.
------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
HBRUSH MyBrush;
HBRUSH OldBrush;
HPEN MyPen;
HPEN OldPen;
switch ( iMessage)
{
case WM_PAINT:
hdc = BeginPaint( hWnd, &ps);
MyBrush = CreateHatchBrush( HS_BDIAGONAL, RGB (255, 255, 0));
MyBrush = ( HBRUSH)GetStockObject( GRAY_BRUSH);
OldBrush = ( HBRUSH)SelectObject(hdc, MyBrush);
MyPen = CreatePen(PS_DASH, 5, RGB(0, 0, 255));
OldPen = (HPEN)SelectObject(hdc, MyPen);
Rectangle(hdc, 50, 50, 300, 200);
SelectObject(hdc, OldBrush);
SelectObject(hdc, OldPen);
DeleteObject(MyPen);
EndPaint( hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProcA( hWnd, iMessage, wParam, lParam));
}
------------------------------------------------
✔ 6-1-마. 브러시
HBRUSH CreateSolidBrush( COLORREF crColor );
HBRUSH CreateHatchBrush( int fnStyle, COLORREF clrref );
값 | 설명 |
HS_BDIAGONAL | 좌하향 줄무늬 |
HS_CROSS | 바둑판 모양 |
HS_DIACROSS | 좌하향 및 우하향 줄무늬 |
HS_FDIAGONAL | 우하향 줄무늬 |
HS_HORIZONTAL | 수평선 |
HS_VERTICAL | 수직선 |
------------------------------------------------
case WM_PAINT:
hdc = BeginPaint( hWnd, &ps);
MyBrush = CreateHatchBrush(HS_BDIAGONAL, RGB (255, 255, 0));
OldBrush = ( HBRUSH)SelectObject(hdc, MyBrush);
Rectangle(hdc, 50, 50, 300, 200);
SelectObject(hdc, OldBrush);
DeleteObject(MyBrush);
EndPaint( hWnd, &ps);
return 0;
------------------------------------------------
✔ 6-2-가. 흑백에서의 그리기 모드
패스
✔ 6-2-나. 그리기 모드의 종류
- 윈도우즈에서 사용하는 디폴트 그리기 모드는 R2_COPY 모드이다. 그래서 그려지는 그림이 기존 그림을 덮어 버린다.
int SetROP2( HDC hdc, int fnDrawMode );
int GetROP2( HDC hdc );
int GetROP2( HDC hdc );
그리기 모드 | 설명 |
R2_BLACK | 항상 검정색이다. |
R2_WHITE | 항상 흰색이다. |
R2_NOP | 아무런 그리기도 하지 않는다. |
R2_NOT | 원래의 그림을 반전시킨다. |
R2_COPYPEN | 원래의 그림을 덮어버리고 새 그림을 그린다. |
R2_NOTCOPYPEN | 새 그림을 반전시켜 그린다. |
R2_MERGEPEN | OR연산으로 두 그림을 합친다. |
R2_MASKPEN | AND연산으로 겹치는 부분만 그린다. |
R2_XORPEN | XOR연산으로 겹치는 부분만 반전시킨다. |
✔ 6-2-다. Ropmode
선을 그릴때 마우스는 원점을 중심으로 선이 따라가는데 연결되는 부분이 보이지 않는 것은 겹치는 부분을 지운다 (XOR연산)
- 새 선을 그린 후 oldx, oldy에 현재의 끝점을 대입해 주어 다음 마우스 이동시에 이 선을 지울 수 있도록 해준다.
변수 | 설명 |
sx,sy | 처음 마우스를 누른 위치를 가진다. |
oldx,oldy | 지워져야 할 선의 끝 좌표를 가진다. |
ex,ey | 다시 그려져야 할 선의 끝 좌표를 가진다. |
bNowDraw | 현재 선을 그리고 있는 중인가에 대한 정보를 가진다. |
------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
static int sx, sy, oldx, oldy;
int ex, ey;
static BOOL bNowDraw = FALSE;
HDC hdc;
switch ( iMessage)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_LBUTTONDOWN:
sx = LOWORD( lParam);
sy = HIWORD( lParam);
oldx = sx;
oldy = sy;
bNowDraw = TRUE;
return 0;
case WM_LBUTTONUP:
bNowDraw = FALSE;
hdc = GetDC( hWnd);
MoveToEx(hdc, sx, sy, NULL);
LineTo(hdc, oldx, oldy);
ReleaseDC( hWnd, hdc);
return 0;
case WM_MOUSEMOVE:
if (bNowDraw)
{
hdc = GetDC( hWnd);
SetROP2(hdc, R2_NOT);
MoveToEx(hdc, sx, sy, NULL);
LineTo(hdc, oldx, oldy);
ex = LOWORD( lParam);
ey = HIWORD( lParam);
MoveToEx(hdc, sx, sy, NULL);
LineTo(hdc, ex, ey);
oldx = ex;
oldy = ey;
ReleaseDC( hWnd, hdc);
}
return 0;
}
return(DefWindowProcA( hWnd, iMessage, wParam, lParam));
}
------------------------------------------------
✔ 6-3-가. 윈도우즈의 좌표체계
- 그래픽 부분은 대부분이 동일하다.
✔ 6-3-나. 맵핑 모드
- 맵핑 모드(mapping mode)란 주어진 좌표가 화면상의 실제 어디에 해당하는지를 결정하는 방법을 말한다.
- 윈도우즈에서 사용하는 좌표는 논리 좌표와 물리 좌표 두가지가 있다
- 논리 좌표 : 윈도우즈의 내부에서 사용되는 좌표를 말한다.
- 물리 좌표 : 실제 화면에 출력되는 좌표이며 픽셀 단위를 사용한다
- 이 두가지 좌표의 관계를 정의하는 것이 맵핑 모드이다.
* 맵핑(Mapping)이란 용어는 두가지 사물의 일대일 대응 관계를 정의하는 공식 내지는 함수라고 할 수 있으며 윈도우즈에서의 맵핑 모드는 논리 좌표를 물리 좌표로 변환하는 방법을 의미한다. 어떠한 맵핑 모드가 사용되는가에 따라 (100,100)의 논리 좌표는 물리적으로 (10,10)이 될 수도 있고 (20,30)이 될 수도 있다.
맵핑 모드 | 단위 | X축 증가 | Y축 증가 |
MM_TEXT | 픽셀 | 오른쪽 | 아래쪽 |
MM_LOMETRIC | 0.1mm | 오른쪽 | 윗쪽 |
MM_HIMETRIC | 0.01mm | 오른쪽 | 윗쪽 |
MM_LOENGLISH | 0.01인치 | 오른쪽 | 윗쪽 |
MM_HIENGLISH | 0.001인치 | 오른쪽 | 윗쪽 |
MM_TWIPS | 1/1440인치 | 오른쪽 | 윗쪽 |
MM_ISOTROPIC | 가변 | 가변 | 가변 |
MM_ANISOTROPIC | 가변 | 가변 | 가변 |
6-3-다. 윈도우와 뷰포트
------------------------------------------------
case WM_PAINT:
hdc = BeginPaint( hWnd, &ps);
SetMapMode(hdc, MM_LOENGLISH);
//SetMapMode(hdc, MM_HIENGLISH);
SetViewportOrgEx(hdc, 200, 150, NULL);
MoveToEx(hdc, -2000, 0, NULL);
LineTo(hdc, 2000, 0);
MoveToEx(hdc, 0, -2000, NULL);
LineTo(hdc, 0, 2000);
for (f = -500; f < 1000; f++)
{
y = ( int)(sin(f*3.14 / 180) * 100);
SetPixel(hdc, ( int)f, y, RGB(0, 0, 0));
}
EndPaint( hWnd, &ps);
return 0;
------------------------------------------------
6-3-라. 가변 비율
패스
6-4-가. bitmap.dsw
- 비트맵을 메모리에 올려야 하므로 메모리를 추가한다.
MemDC = CreateCompatibleDC(hdc);
- BitBlt 용량이 커서 느리므로 일단 LoadBitmap ( 메모리에 올린다)
* 멤디시에 비트멥을 연결 -> 화면에 뜬다.
0시작, 0,0 가로 크기 세로크기
- 메모리에 올리고 출력공간 멤디시 공간확보-> 화면 출력
- 비트맵을 한번올리고 종료할때까지 메모리에서 안내리므로 속도가 빨라진다.
- bitblt함수로 실제로 화면에 표시한다.
- LoadBitmap() 하면 메모리에 올라간다.
- 0,0은 시작, 이미지 가로크기 세로크기
* 나중에 올리는 작업을 wm_create에보내고 delete작업을 destroy에 보낸다. 그리고 중간에는 static으로 해놓으면 메모리에 계속 남아있는다.
------------------------------------------------
case WM_PAINT:
hdc = BeginPaint( hWnd, &ps);
MemDC = CreateCompatibleDC(hdc);
MyBitmap = LoadBitmap(g_hInst, MAKEINTRESOURCE (IDB_BITMAP1 ));
OldBitmap = ( HBITMAP)SelectObject(MemDC, MyBitmap);
BitBlt(hdc, 0, 0, 466, 578, MemDC, 0, 0, SRCCOPY);
SelectObject(MemDC, OldBitmap);
DeleteObject(MyBitmap);
DeleteDC(MemDC);
EndPaint( hWnd, &ps);
return 0;
------------------------------------------------
6-4-나. 메모리 DC
- 메모리 디시는 화면이 아닌데
- 화면의속도는 느린데 메모리에 쓰는거지만 화면에 안떳다. 그림을 만들고 화면에 옮기면
- 비트맵은 그래픽이 개입하면 무조건 느린데 이렇게 함으로 느린것을 상쇄 시킬수 있다.
- 일종의 메모리를 확보해놓고 왕창 다집어넣고 화면에 출력하는 버퍼링이다.
* 메모리의 속성과 같아야 한다. 가상의공간을 현재 화면 크기에 맞춰생성 시켜준다.
LoadBitmap 해야 비트멥이 적재된다.
6-4-다. BitBlt 원본크기 그대로 보임
BOOL BitBlt( HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop );
HDC hdcDest, 화면 디시
int nXDest, int nYDest, 0.0
int nWidth, int nHeight, 가로크기 세로 크기
* 확대 축소 개념이 없다.(덮어쓰면서 공백으로 두거나 , 잘린다)
값 | 설명 |
BLACKNESS | 대상영역을 검정색으로 가득 채운다. |
DSTINVERT | 화면을 반전시킨다. |
MERGECOPY | 소스 비트맵과 대상 화면을 AND 연산한다. |
MERGEPAINT | 소스 비트맵과 대상 화면을 OR 연산한다. |
SRCCOPY | 소스 영역을 대상 영역에 복사한다. |
WHITENESS | 대상영역을 흰색으로 채운다. |
6-4-라. StretchBlt
BOOL StretchBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc,
int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop );
StretchBlt(hdc,0,0,246,320,MemDC,0,0,123,160,SRCCOPY);
앞 좌표 : 뒤쪽 좌표 원본(확대 축소할때 인자를 바꿔주면 된다)
//BitBlt(hdc, 0, 0, 466, 578, MemDC, 0, 0, SRCCOPY);
StretchBlt(hdc, 0, 0, 466, 578, MemDC, 0, 0,200, 300, SRCCOPY);
6-4-마.비트맵 만들기
- 비트맵 직접 그리기
<게임 만들기>
우선 가로크기 세로크기 정해야.
미션
1. 경계 검사
2. 창모양 고정
3. 좌표 시작과 끝지점 처리.
* 배경그리기, 양방향 앞뒤 캐릭터 추가
728x90
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
김태현 WinAPI 4일차 단축키 만들기 문자열 테이블 GDI오브젝트 (5) | 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 |
20151117_안향진_API_4 (6) | 2015.11.18 |
20151117 임현수 업무일지 WIN32API #4 (6) | 2015.11.18 |
20151117 - 강동조 개인업무일지 API 4일차(작성중) (5) | 2015.11.17 |
20151117_박서연_WinAPI(4) (6) | 2015.11.17 |