블로그 이미지
vee

카테고리

분류 전체보기 (17)
void (1)
Information (0)
Develop (5)
C/C++ (0)
Windows API (3)
TCP/IP (2)
Linux (3)
Hardware (3)
Operating system (5)
Total
Today
Yesterday

달력

« » 2026.7
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

공지사항

최근에 올라온 글

typedef struct tagWNDCLASSW {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCWSTR lpszMenuName;

LPCWSTR lpszClassName;

}

 

UINT style;

윈도우 스타일, 즉 윈도우가 어떤 형태를 가질 것인가를 지정한다.

가장 많이 사용되는 값은 CS_HEADRAW|CS_VREDRAW이다.

특이하게도 OR 연산자를 이용하는 기법을 사용한다. (고성능, 고효율)

 

WNDPROC lpfnWndProc;

윈도우의 메시지 처리 함수를 지정한다. – 함수 포인터

메시지가 발생할 때 마다 이 멤버가 지정한 함수가 호출되며 모든 메시지를 처리하게 된다.

WndProc을 대입하게 된다.

 

int cbClsExtra;

int cbWndExtra;

일종의 예약 영역으로서 아주 특수한 목적에 사용되는 여분의 공간이다.

예약 영역을 사용하지 않을 때는 0으로 지정한다.

HINSTANCE hInstance;

이 윈도우 클래스를 등록하는 프로그램의 번호(핸들)이며 WinMain의 인수로 전달된 hInstance값을 그대로 대입하게 된다.

핸들은 운영체제가 임의로 생성하는 값으로 프로그래머가 특정한 값을 생각할 필요는 없다.

 

HICON hIcon;

HCURSOR hCursor;

이 윈도우가 사용할 마우스 커서와 아이콘을 지정하는 변수이다.

LoadCursor함수와 LoadIcon함수를 이용하여 이 멤버에 대입하면 된다.

 

HBRUSH hbrBackground;

윈도우의 배경 색상을 채색할 브러시를 지정하는 멤버이다.

GetStockObject 함수를 이용하여 윈도우에서 제공하는 브러시를 지정하거나 COLOR_WINDOW같은 시스템 색상을 지정할 수도 있다.

 

LPCWSTR lpszMenuName;

이 프로그램(윈도우)이 사용할 메뉴를 지정한다.

메뉴는 리소스 에디터에 의해 별도로 만들어져 링크시 같이 합쳐지며 메뉴를 사용하지 않을 경우 NULL을 대입한다.

 

LPCWSTR lpszClassName;

윈도우 클래스의 이름을 문자열로 정의하는 멤버.

여기서 지정한 이름은 CreteWindow함수에 전달되며 CreteWIndow 함수는 윈도우 클래스에서 정의한 특성 값을 참조하여 윈도우를 만든다.

 

WNDCLASS는 WinUser.h에 정의되어 있다.

WNDCLASS는 프로젝트가 유니코드이거나 멀티바이트일 때 다르게 정의된다.

#ifdef UNICODE

typedef WNDCLASSW WNDCLASS;

typedef PWNDCLASSW PWNDCLASS;

typedef NPWNDCLASSW NPWNDCLASS;

typedef LPWNDCLASSW LPWNDCLASS;

#else

typedef WNDCLASSA WNDCLASS;

typedef PWNDCLASSA PWNDCLASS;

typedef NPWNDCLASSA NPWNDCLASS;

typedef LPWNDCLASSA LPWNDCLASS;

#endif // UNICODE

WNDCLASSA 는 멀티바이트 Windows 응용프로그램에서 사용되며
WNDCLASSW는 유니코드 Windows 응용프로그램에서 사용된다.

두 클래스의 차이는 문자열을 LPCSTR 을 사용하느냐 아니면 LPCWSTR를 사용하느냐의 차이만 존재한다.

'Develop > Windows API' 카테고리의 다른 글

Windows API – 2. WinMain, WndProc  (0) 2013.08.29
Windows API – 1. Basis of Windows Programming  (0) 2013.08.28
Posted by vee
, |

 

Windows.h

기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의하며 그 외 Windows 프로그래밍에 필요한 보조 헤더 파일을 포함하고 있다.

 

Win32 응용프로그램의 Entry Point(시작점)은 main()이 아니라 WinMain()이다.

 

WinMain의 원형

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)

  • WinMain의 원형은 고정되어 있다.
  • APIENTRY 지정자는 Windows의 표준 호출 규약인 __Stdcall을 사용한다는 뜻
  • hInstance : 프로그램의 인스턴스 핸들
  • hPrevInstance : 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들
  • lpszCmdParam : argv에 해당
  • nCmdShow : 프로그램이 실행될 형태이며 최소화, 보통 모양 등이 전달됨

 

WndProc 함수

WndProc 함수는 사용자와 시스템이 보내오는 메시지를 처리하는 역할

Windows 응용 프로그램은 WinMain과 WndProc이 전부 존재해야 정상적으로 동작할 수 있다.

 

WndProc의 원형

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

  • CALLBACK 매크로는 APIENTRY와 마찬가지로 __stdcall로 정의되어 있다.
Posted by vee
, |

 

Windows Application Programming Interface

Windows API

 

Textbook – Windows API 정복 개정판 (한빛미디어, 김상형)

 

첫 번째 예제 – 기본 윈도우 띄우기

 

Source code

#include <Windows.h>

 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE g_hInst;

LPCTSTR lpszClass=TEXT("First API project");

 

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, 0, 0))

    {

        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));

}

 

Compile

Posted by vee
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함