유돌이

calendar

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

Notice

2008. 12. 30. 23:13 C/C++/MFC

기본형식

 

#include <windows.h>

/*
 - Winmain()의 첫번째 매개변수는 인스턴스 핸들(instance handle)이라 한다.
 
 - 핸들은 애플리케이션이 무언가를 식별하기 위해 사용하는 단순한 숫자다.
 
 - Winmain()에 사용되는 handle은 프로그램을 유일하게 식별한다.
 
 - 때로는 instance handle은 다른 windows함수를 호출할때 인자로 사용되기도 한다.

 

==========================================================================================

===============================
 
 - 초창기 윈도우즈에서는 사용자가 같은 프로그램을 두 번 이상 실행하면 해당 프로그램의
   인스턴스가 여러 개 생성되었다. 한 프로그램의 모든 인스턴스는 프로그램 코드와 더불어, 메

뉴나 대화상자
   템플릿 리소스와 같은 read-only데이터를 공유하였다.
   프로그램 실행시 WinMain()의 두번째 매개변수인 hPrevInstance를 이용하면 이미 다른 인스턴

스가 실행중인지를
   판단할 수 있었다.만약 다른 인스턴스가 실행중이라면 이전 인스턴스의 일부 데이터를 자신의

데이터 영역(data area)으로
   가져옴으로써 일부 작업을 생략할 수 있었다.
   하지만 32비트 윈도우즈에서는 이러한 개념이 더이상 사용되지 않음으로써 WinMain()의 두 번

째 매개변수는
   항상NULL이다.

 

==========================================================================================

===============================

   - WinMain()의 세 번째 매개변수는 프로그램을 실행할 때 사용하는 명령행(command line)이다

.
     일부 윈도우즈 프로그램은 시작할 때이를 이용하여 특정 파일을 메모리에 로드하기도 한다.
  
 

==========================================================================================

===============================

   - WinMain()의 네 번째 매개변수는 프로그램이 처음에 어떤 형태로 표시(display)될지를 나타

낸다.
   이 값에 따라 윈도우는 정상(normal)적인 현태, 화면 전체를 가득 채우는 최대화(maximized)

된형태, 그리고 작업 표시줄에 최소화(minimized)된형태 중 하나로 시작한다.
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPerInstance,
       PSTR szCmdLine, int iCmdShow)
{
 /*
  첫번째 인자 - 윈도우 핸들
  두번째 인자 - 메시지 상자에 표시되는 문자열
  세번째 인자 - 메시지 상자의 캡션 바에 나타나는 문자열
  네번째 인자 - WINUSER.H에 정의된 MB_로 시작하는 상수값의 조합을 사용한다. 버튼의 종류결


                OR연산으로 상수값을 조합할수 있다.

  각문자열은 TEXT매크로가 감싸고 있다.
  보통 문자열은 TEXT매크로로 감쌀 필요는 없지만,
  나중에 유니코드 문자셋을 사용하도록 프로그램을 변환하려면 이렇게 하는 것이 좋다.
 */
 MessageBox (NULL, TEXT("Hello Windows!"), TEXT("HelloMsg"), 0);
 
 // 이 프로그램에서 MessageBox는 1을 리턴하지만 좀더 정확하게는 IDOK(WINUSER.H 에서 1로정

의)를 리턴한다.
 // MessageBox는 다른 값을 리턴할 수 있다.
 // ex) IDYES, IDNO, IDCANCLE, IDABORT, IDRETRY, IDIGNORE 등이 있다.

 return 0;
}

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

WPARAM과 LPARAM

 

WPARAM은 unsigned int 형이고, LPARAM은 unsigned long 형이다.

특징은, WPARAM는 주로 값들을 넘기는데 사용하고, LPARAM는 값들 뿐만 아니라 포인터를 넘겨줄 때 사용된다.

 

보통 window procedure 또는 callback function의 인자로, 먼저 나오는 wParam에 자주 쓰이는 정보를 기술하고, lParam에 추가 정보를 기술한다. 지금은 모두 32bit이므로 사용자가 정의하기 나름이다.

 

윈도우는 메시지 방식으로 프로그램이 진행된다. WPARAM나 LPARAM는 모두 MS에서 지정해 놓은 형식이다. 메시지를 보낼 때 추가로 부가적인 정보를 넣는 것이다. 구체적으로 어떤 정보인지는 아무도 모른다. 이것은 각 메시지마다 다르게 구성되어 있다는 것을 뜻한다.


WM_KEYDOWN을 사용한다면, MS에서 키다운 메시지에 대한 제어를 하고 싶을 땐 이것을 써라. 그리고 부가적인 정보에는 WPARAM와 LPARAM를 사용해라. WPARAM에는 Virtual Key정보를 주고 LPARAM에는 KeyData 정보를 넣을 것이니 구현은 사용자가 알아서 제어를 해라. 하는 것과 같다.

 

W : word

L : long

 

typedef UINT WPARAM;
typedef LONG LPARAM;

현재는 둘다 32bit 값을 갖는 데이터 타입이다. 그냥 unsigned int, long 이라 해도 상관은 없겠지만, 굳이 이름을 WPARAM, LPARAM이라 한 것은 예전 16bit OS 시절에 이름 붙인 것이 이어져 온 것이다. 당시는 WPARAM은 word 형 파라미터, LPARAM은 long 형 파라미터라는 뜻이어서, (여기서 word형은 2바이트, 참고로 dword(double word)형은 4바이트, byte형은 말그대로 1바이트) 그 때도 위처럼 typedef되었었다. 그런데 32bit OS로 오면서 int형이 4바이트가 되었다. 그런데 typedef은 그대로 두다보니 현재 WPARAM는 이름과는 다르게 4바이트를 갖는 형이되었다. 그러니까 지금은 WPARAM이나 LPARAM이나 4바이트를 갖는 데이터 타입이다. 참고로 windef.h를 보면 여러가지 데이터 타입이 typedef되어 있는 걸 볼 수 있다.

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


WNDCLASS 구조체

 

typedef struct tagWNDCLASS

{

        UINT style;

        WNDPROC lpfnWndProc;

        int cbClsExtra;

        int cbWndExtra

        HINSTANCE hInstace;

        HICON hIcon;

        HCURSOR hCursor;

        HBRUSH hbrBackground;

        LPCSTR lpszMenuNmae;

        LPCSTR lpsClassNmae;

}WNDCLASS;

 

style

   윈도우 클레스의 스타일 지정

   CreateWindow 함수에서 지정하는 개별 윈도우의 스타일과는 다름

 

lpfnWndProc

    메시지 처리 함수 지정

 

cbClsExtra

    윈도우 클레스에서 사용하고자 하는 여분의 메모리양을 바이트 수로 지정

    윈도우 클레스를 운영체제에 등록할때 메모리를 추가로 할당 받을 양 지정

 

cbWndExtra

     cbClsExtra 와 유사하되 개별 윈도우에서 사용하고자 하는 여분 메모리양 지정

     개별 윈도우가 만들어 질때 마다 메모리를 추가적으로 할당 받음

 

hInstance

    윈도우 클레스를 등록한 응용 프로그램의 인스턴스 핸들

    지정한 응용 프로그램이 윈도우 클레스의 소우주가 되며 소유주가 파괴 되면 윈도우도 같이

파괴 됨

 

hIcon

    윈도우가 최소화 되었을 때 보여줄 아이콘 지정

    NULL인 경우 아이콘이 그려야 할 때 WM_ICONERASEBKGND 메시지 발생

 

hCursor   

    클레스 커서 지정

    윈도우의 작업 영역에 마우스가 위치해 있을 때 사용될 커서 지정

    리소스에 커서를 추가한 후 LoadCursor 함수로 읽은 후 핸들러에 대입해주거나 시스템에 등

록되 어 있는 디폴트 커서중에서 하나를 대입해줌

    NULL로 지정될 경우 커서 정의가 되지 않으며 마우스 이동시마다 SetCursor함수를 호출하여

윈하는 커서로 변경해주어야 함

 

hbrBackground

    윈도우의 작업 영역에 칠할 배경 브러시 지정

    GetStockObject 나 그외 브러시를 만드는 함수를 사용하여 브러시 핸들을 얻은 후 대입

 

lpszMenuNmae

    윈도우가 사용할 메뉴를 지정

    CreateWindw 함수에서도 개별 윈도우를 만들때 메뉴를 지정하며 CreateWindw에서 별도의 메

뉴를 지정한 경우 이곳에서 지정한 메뉴는 무시됨

 

lpzsClass Name

    등록하고 자는 윈도우 클레스 이름을 나타내는 문자열

    윈도우 클레스 구분에 사용

    대 소문자 구분은 하지 안음


'C/C++/MFC' 카테고리의 다른 글

MFC (디바이스 컨텍스트와 관련 클래스)  (0) 2008.12.30
윈도우즈와 메시지  (0) 2008.12.30
const 사용법  (0) 2008.12.30
C프로그래밍 별모양~  (0) 2008.12.30
BHO 란?  (0) 2008.12.30
posted by 유돌이