안녕하십니까. 저번 포스팅까지 작성했던 소스를 더 수정했습니다.

한번 보시지요.

바뀌거나 추가된 소스를 살펴 봅시다.

- hWnd = CreateWindow(wndclass.lpszClassName, L"abex 2nd crackme",       

WS_POPUPWINDOW, 820, 462,

        280, 155, NULL, NULL, wndclass.hInstance, NULL); -> 기존코드

- hWnd = CreateWindow(wndclass.lpszClassName, L"abex 2nd crackme",

        WS_POPUPWINDOW | WS_VISIBLE, 820, 462,

        280, 155, NULL, NULL, wndclass.hInstance, NULL); -> 수정코드

윈도우를 생성할 때 스타일 옵션에 하나를 더 주었습니다. WS_VISIBLE라는 옵션입니다. 이 WS_VISIBLE은 ShowWindow 기능을 제공합니다. 즉 ShowWindow 함수가 없어도 윈도우 창이 보인다는 뜻이지요. 그래서 ShowWindow를 지우고 WS_VISIBLE을 넣어주었습니다.  사실 이  WS_VISIBLE은 나중에 알게 되어서 미리 처음에 작성할 때 적용하지 못했습니다.

- CreateWindow(L"edit",NULL,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,

10,57,165,18,hWnd,NULL,hInstance,NULL);

컨트롤을 만드는 코드입니다. 여기서 컨트롤이라 함은 사용자와의 인터페이스를 도와주는 윈도우 입니다. 즉 사용자로부터 입력을 받고 결과값을 보여주기 위해 사용합니다. 예로 버튼, 에디트 등이 있으며 이러한 컨트롤은 클래스가 이미 정의되어이 있습니다.

정의된 컨트롤을 쓰기 위해선 CreateWindow의 첫번째 인자인 클래스 이름을 바꿔주어야 합니다. 각각의 컨트롤은 정의된 클래스 이름이 있습니다.

button(버튼), static(텍스트), scrollbar(스크롤 바), edit(에디트) , listbox(리스트 박스), combobox(콤보 박스)

우리는 이중 사용자의 입력값을 받기 위해 edit라는 클래스를 사용하겠습니다. 원래 CreateWindow함수를 사용할려면 WinMain함수에서 보았듯이 윈도우 클래스를 선언하고.. 각각의 멤버를 정의하고... RegisterClass 함수를 이용해 윈도우클래스를 등록해야 합니다만 컨트롤은 미리 클래스가 등록되어 있기 때문에 그냥 갖다 쓰기만 하면 됩니다.

그다음 세번 째 인자인 윈도우 스타일을 봅시다. WS_CHILD가 적혀있습니다. 이 WS_CHILD 은 이 윈도우가 자식윈도우임을 나타냅니다. 즉 부모 윈도우가 꺼지면 이 자식 윈도우도 자동으로 꺼집니다. 만약 이 옵션이 없으면 이 윈도우는 독립된 윈도우로 인식하여 운영체제에 윈도우 창이 총 2개 띄워집니다. abex crack me2에서는 자식윈도우를 쓰고 있으니 우리도 자식 윈도우를 씁시다. WS_VISIBLE은 설명했으니 넘어갑시다. 

그 다음 눈에 들어오는 것이 ES_AUTOHSCROLL 옵션입니다. 이 옵션은 윈도우 클래스 edit의 전용옵션입니다. 어떤 옵션이냐면 말 그대로 자동으로 스크롤을 지원한다는 뜻입니다. 좀더 쉽게 얘기하면 이 edit라는 컨트롤이 사용자의 입력값을 받지 않습니까? 그런데 이 edit는 사용자가 입력칸에 값을 꽉 채웠을 때 더 못쓰게 할거냐 아니면 스크롤을 이용해서 계속 쓰게 할거냐를 결정합니다. 우리는 계속 쓰게 할 것이므로 ES_AUTOHSCROLL 옵션을 추가로 주었습니다.

8번째 인자에는 hWnd가 들어가 있습니다. 이 인자는 부모윈도우를 인자로 받습니다. 자식윈도우이므로 당연히 부모윈도우가 인자로 들어가야 합니다. 여기서는 팝업윈도우로 만들어진 윈도우가 부모윈도우이므로 이 부모윈도우의 핸들값인 hWnd를 넣어주었습니다.

이 edit창은 이름을 입력받습니다.

그다음은 달라진 것이 하나 있군요. 부모 윈도우는 wndclass.hInstance인데 자식 윈도우는 hInstance입니다. 어.. 별 차이는 없으니 넘어갑시다.

- CreateWindow(L"edit",NULL,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,

10,113,165,18,hWnd,NULL,hInstance,NULL);

두 번째 edit 창을 만듭니다. 이 edit창은 시리얼을 입력받습니다.

- CreateWindow(L"button",L"Check",WS_CHILD | WS_VISIBLE |   BS_PUSHBUTTON, 200,40,65,25,hWnd,NULL,hInstance,NULL);

이번에는 버튼을 만듭니다. 클래스 이름을 button으로 줌으로써 button을 생성합니다.물론 이 버튼도 전용옵션이 있습니다. BS_PUSHBUTTON입니다. 이 옵션은 이 버튼을 누르는 버튼으로 생성한다는 뜻입니다. 그 외에도 체크박스, 라디오 버튼 등의 옵션이 있는데 이것은 나중에 추가로 설명하겠습니다.

이 button의 보여지는 값은 Check입니다. 이 Check는 두번째 인자를 의미합니다. 그 외에는 앞에서 설명했으니 넘어갑시다.

- CreateWindow(L"button",L"About",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 200,80,65,25,hWnd,NULL,hInstance,NULL);

About 푸쉬버튼을 만듭니다.

- CreateWindow(L"button",L"Quit",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 200,120,65,25,hWnd,NULL,hInstance,NULL);

Quit 버튼을 만듭니다.

자 이제 WndProc함수를 살펴봅시다.

- HFONT font, font1;

font가 하나 더 필요하므로 font를 하나 더 선언하였습니다.

- font1 = CreateFont(12,0,0,0,400,0,0,0,HANGEUL_CHARSET,0,0,0,

DEFAULT_PITCH | FF_ROMAN,L"돋움");

폰트를 하나 더 생성합니다. 이 폰트는 앞의 font보다 크기가 작고, 진하게가 설정되지 않았으며(400), 글씨체가 돋움을 의미합니다.

- DeleteObject(font);

  SelectObject(hdc,font1);

처음에 font를 hdc에 등록한 후 제목을 출력하였으므로 이제 폰트를 바꾸기 위해 기존에 등록한 font를 지우고 새 폰트인 font1을 등록하였습니다. 

- TextOut(hdc, 10,40,L"Name:",lstrlen(L"Name:"));

  TextOut(hdc, 10,96,L"Serial:",lstrlen(L"Serial:"));

새로 등록한 폰트로 Name: 과 Serial: 을 출력시킵니다.

여기까지입니다. 생각보다 조금 짧네요. 결과를 한 번 봅시다.

오오오오 정말 그럴듯하게 만들어졌습니다. abex crack me2를 봅시다.

완전히 똑같지는 않지만 굉장히 비슷합니다. 

네 이것으로 포스팅을 마치겠습니다. 다음 포스팅에선 이제 버튼 동작을 시켜보겠습니다. 

점점 더 재밌어지는군요!. 아.. 아닌가요? 죄송합니다...

Posted by englishmath
,