API에서 사용자가 Key를 입력 했을 때 연산을 하는 방법,
#include <windows.h>
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("key");
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( COLOR_WINDOW+1 );
WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass( &WndClass );
hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, (HMENU)NULL, hInstance, NULL );
ShowWindow( hWnd, nCmdShow );
while( GetMessage( &Message, NULL, 0, 0 ) )
{
TranslateMessage( &Message );
DispatchMessage( &Message );
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
static TCHAR str[256]; // 한번 입력 하면 꾸준히 값을 가지고 있어야 하기 때문에 Static
int len; // 문자열의 길이를 담당할 int형 변수
switch( iMessage )
{
// 문자 입력에 관한 메시지가 넘어 오면
//case WM_CHAR:
// len = lstrlen( str ); // str에 존재하는 현재 문자열 숫자를 len에 보관하고
// str[len] = ( TCHAR ) wParam; // 문자열의 마지막 위치(종료위치)에 wParam에서 가져온 문자를 삽입
// str[len+1] = 0; // 그 다음 배열을 마지막(종료위치)으로 잡는다.
// // 입력이 종료되면 바로 PAINT를 부르기 위해 존재하는
// // InvalidateRect함수
// InvalidateRect( hWnd, NULL, FALSE );
// // WM_PAINT:에서는 무효화가 이루어지면, 다시 그리기를 하게 되는데,
// // InvalidateRect를 사용 하면 모든 부분에 대해 강제 무효화를 시키게 되고
// // PAINT에서는 입력을 받을때 마다 다시 그려주게 되는것이다.
// // 그래서 InvalidateRect함수가 없으면 무효화가 이루어지기 전까진
// // 실시간으로 그려지지 않게 된다.
// // InvalidateRect는 첫번째 인자에 무효화를 시킬 대상 윈도우의 핸들과,
// // 사각영역, bool 타입을 받고 있는데,
// // bool 타입이 true라면 무효화 되기전 배경을 모두 지운 후 그릴 것인가.
// // false라면 그렇지 않고 그 위에 덮어 그린다, 라고 볼 수 있다.
// return 0;
case WM_CHAR:
if( (TCHAR) wParam == ' ' ) // 스페이스 바 키를 누르면 문자열을 삭제(실제로는 바로 종료값을 넣어 버린것)
{
str[0] = 0;
}
else
{
len = lstrlen(str);
str[len] = (TCHAR)wParam;
str[len+1] = 0;
}
InvalidateRect( hWnd, NULL, TRUE ); // false라면 무효화가 이루어 지기 전엔
// 스페이스바를 눌러도 글자로 바로 지워지지 않을 것이다.
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint( hWnd, &ps );
TextOut( hdc, 100, 100, str, lstrlen(str));
EndPaint( hWnd, &ps );
return 0;
}
return( DefWindowProc( hWnd, iMessage, wParam, lParam));
}
// 출력 결과
설명 : 스페이스바를 누르면 글자가 지워진다.
'프로그래밍 > API' 카테고리의 다른 글
API-마우스입력 (0) | 2010.04.21 |
---|---|
API-Key입력(2) (0) | 2010.04.21 |
API-MessageBox (0) | 2010.04.19 |
API-GraphOut (0) | 2010.04.19 |
API-DrawText (0) | 2010.04.19 |