내장형 하드웨어/WINAPI

WINAPI - 변수 명명 법, 유니코드, 윈도우 생성 첫번째

동화다아아 2011. 8. 18. 16:41

- 변수 명명법

접두어

원래말

의미

cb

Count of Bytes

바이트

dw

double word

부호 없는 long 정수

h

handle

윈도우, 비트맵 파일 등의 핸들

sz

Null Terminated

NULL 종료 문자열

ch

Character

자형

a

Array

배열

w

Word

부호 없는 정수형

i

integer

정수형

p, lp

long pointer

포인터형

b

Bool

논리형

표준함수들은 모두 방식대로 인수 이름을 작성하므로 접두어들을 정확하게 외우고 있어야 함수의 인수가 어떤 의미인가를 금방 파악할 있다.

⇒ 이런 변수 명명법을 헝가리식 명명법(Hungarian Naming)이라고 한다.

⇒ 이렇게 쓰면 편하다는 것이지 꼭 지켜야하는 의무사항은 아니다. 더구나 이 방법은 변수의 타입에 대한 정보가 이름에 포함되어 있어 타입을 수정할 때 변수의 이름까지 같이 바꿔야 하는 불편함도 있다.

⇒ 하지만 문서를 읽을 때는 변수이름만으로 타입을 쉽게 판별할 수 있다.

⇒ 예로 hWnd는 핸들이고 lpRect는 포인터이며 bErase는 진위형(논리형)이라는 것을 금방 알 수 있다.

 

- 유니코드

유니코드는 16비트의 단일한 값으로 지구상의 모둔 문자를 표현할 수 있는 문자 코드 체계이다. 유니코드를 지원하려면 문자형이나 문자열에 대해 C언어의 타입을 바로 쓰지 말고 유니코드 설정에 따라 변경되는 중간 타입을 사용해야 한다.

C 타입

유니코드 타입

char

TCHAR

char*

LPSTR

const char*

LPCTSTR



TCHAR
C 기본 타입 하나인 char 일단 같지만 유니코드로 컴파일할 때는 wchar_t 타입이 된다. wchar_t 실제로는 unsigned short 정의되어 있으며 부호없는 16비트 정수형이다.

 

 

 

- 윈도우 생성 예제

 

#include<windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("First");

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;
  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, 00))
  {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
  }
  return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
  switch(iMessage)
  {
  case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  }
  return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

출력 결과