C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[7195] Re:저 이거 꼭 알아야 하는뎅.. 도저히 몰라성..
왕초보 [] 2300 읽음    2001-05-04 09:55
ghduddlekd 님이 쓰신 글 :
: 안냐세염...
: 저는 그냥 지나다가 들른 살암인데영....
: 저기여.. 정말로 죄송한데여..
: 제가 짐 올린 소스 혹시 아시면 어떤 프로그램인지 주석좀 달아주실수 이쓰세염?
: 여기 계시는 분덜 대부분은 c++잘하시니깐 잘아실텐뎅..
: 좀만 알켜주세염...부탁...
:
: #include <windows.h>
: #include "Test.h"
: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR                           1pCmdLine, int nCmdShow)
: {
:    static char szAppName[]  = "TestSDK_버전1";
:    static char szTitle[] = "TestSDK 윈도우즈 프로그램";
:
:   MSG        msg;
:   HWND      hWnd;
:   WNDCLASSEX wc;
:
:  wc.cbSize      = sezeof(WNDCLASSEX);
:  wc.style       = CS_HREDRAW | CS_VREDRAW;
:  wc.1pfnWndProc  = (WNDPROC)WndProc;
:  wc.cbClsExtra    = 0;
:  wc.cbWndExtra   = 0;
:  wc.hInstance     = hInstance;
:  wc.hIcon        = LoadIcon(NULL, IDI_APPLICATION);
:  wc.hCursor      = LoadCursor(NULL, IDC_ARROW);
:  wc.hbrBackground = GetSysColorBrush(COLOR_INFOBK);
:  wc.1pszMenuName = NULL;
:  wc.1pszClassName = szAppName;
:  wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
: RegisterClassEx(&wc);
:
: hWnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPEDWINDOW,                                       CW_USEDEFAULT, 0, CO_USEDEFAULT, 0, NULL, NULL,                           hInstance, NULL);
:
: if (!hWnd)
:      return(FALSE);
: ShowWindow(hWnd, nCmdShow);
: UpdateWindow(hWnd);
:
: while(GetMessage(&msg, NULL, 0, 0))
: {
:       TranslateMessage(&msg);
:       DispatchMessage(&msg);
: }
:
: return(msg.wParam);
: }
: LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam,                                         LPARAM 1Param)
: {
:   switch (uMsg)
:   {
:      case WM_DESTROY:
:               PostQuitMessage(0);
:               break;
:     default:
:             return DefWindowProc(hWnd, uMsg, wParam, 1Param);
:     }
:     return(OL);
: } 
:
: 제발 부탁좀 드릴게여..
: 빨리 할수록 좋은뎅...
: 오늘 하면 더 좋구영...
: 정말 부탁좀 드릴게여..
: 감사합니다..

왕초보인 저로서는 어디까지 설명을 해 드려야 할지가 좀 막막하네요...
일단 위의 프로그램은 Win32 SDK 프로그래밍인 것은 아시져..? 음.. 소스를 보니까.. 별로 하는 일은 없습니다.. 그냥 윈도하나 만들어서 WM_DESTROY 메세지가 들어오면 끝내는 뭐 아주 단순한 프로그램입니다..

이 글을 쓰기전에 막 한참을 답변을 달다가 중단했는데요... 한줄한줄을 다 설명하려니까.. 힘들어서 그냥 주석만 달아 드리겠습니다..

참고로 저도 왕 허접인지라 정확성은 보장 못합니다.. ㅋㅋ ㅡ.ㅡ;;

#include <windows.h>   // 윈도 프로그래밍을 하려면 반드시 포함 되어야 하는 헤더져..
#include "Test.h"      // 이 소스가 Test.cpp 이지 않을까 생각이 듭니다.. 그냥 이 cpp파일의 구조를 정의해 둔 헤더 파일이겠죠.. 소스 분석에는 큰 의미가 없는 것 같습니다..

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR                           1pCmdLine, int nCmdShow)
/* Main 함수 입니다.. 도스 시절에는 main() 으로 시작을 했는데 window 프로그래밍 부터는 WinMain으로 시작을 해야하겠죠...

Parameter 를 보면 HINSTANCE 라는 것이 있는데요.. 이것은 프로그램이 실행이 될 때 이 프로세스에 대한 인스턴스를 얻는 것이죠... 그러니까 무슨 말이냐면... 윈도우에서 탐색기를 여러개 띄웠다가 가정했을때 첫번째 탐색기 두번째 탐색기 등등 이런식으로 같은 프로그램이라도 각 프로세스 별로 구분을 해야 나중에 제어를 할 수 있기 때문에 각 프로세스에 대한 ID 같은 값을 지니게 되는거죠...

hPrevInstance 는 이전에 띄워져 있는 프로세스 값을 가지게 되는데.. 이것은 요즘엔 거의 안쓰인답니다.. 그냥 형태를 알고만 있으면 될 듯.. 그 뒤에 있는 두개의 parameter 는 저도 정확하게는 알지 못해 뭐라고 얘기하기가 좀 그렇네요..
*/

: {
:    static char szAppName[]  = "TestSDK_버전1";
:    static char szTitle[] = "TestSDK 윈도우즈 프로그램";
:
:   MSG        msg;
:   HWND      hWnd;
:   WNDCLASSEX wc;
// 위의 구문들은 그냥 변수 선언입니다.. MSG, HWND 이런 타입들에 대한 설명까지 해 드리긴 뭐하구요.. 그런 타입을 알고 싶으시면 책을 하나 사 보심이 더 좋을 듯 싶습니다..
:

// 여기서 부터 클래스를 등록하기 시작합니다....
// 사용하게 될 윈도우의 속성들을 지정해 주고 RegisterClassEx 로서 클래스를 등록하게 됩니다..
// 클래스를 등록한다는 것이 윈도우가 뜬다는 것은 아니고 일단 등록을 해 둔 뒤에 나중에 ShowWindow 등으로 화면에 뿌려줄 수 있습니다..
// 아래에 보면 WNDCLASS의 Size, 스타일( 여기서는 아래위로 redrwaw 가 되는 형태 ), 호출이 될 함수 포인터, icon, cursor, bgcolor, 등등등 프로퍼티를 설정을 하고 클래스를 등록하는 과정입니다..
:  wc.cbSize      = sezeof(WNDCLASSEX);  
:  wc.style       = CS_HREDRAW | CS_VREDRAW;
:  wc.1pfnWndProc  = (WNDPROC)WndProc;      
:  wc.cbClsExtra    = 0;
:  wc.cbWndExtra   = 0;
:  wc.hInstance     = hInstance;
:  wc.hIcon        = LoadIcon(NULL, IDI_APPLICATION);
:  wc.hCursor      = LoadCursor(NULL, IDC_ARROW);
:  wc.hbrBackground = GetSysColorBrush(COLOR_INFOBK);
:  wc.1pszMenuName = NULL;
:  wc.1pszClassName = szAppName;
:  wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
: RegisterClassEx(&wc);
:

// 여기서 window 를 만들게 됩니다.. window를 만든다고 해서 보여지는 것은 아닙니다.. 그냥 그 형태를 만드는 일을 합니다..
// CreateWindow의 매개 변수 등은 MSDN 이나 다른 참고 서적을 보시는 것이 더욱 더 정확할 것 같아서 일단은 그냥 Window를 만든다고만 설명하겠습니다..
: hWnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPEDWINDOW,                                       CW_USEDEFAULT, 0, CO_USEDEFAULT, 0, NULL, NULL,                           hInstance, NULL);
:
: if (!hWnd)
:      return(FALSE);

// 이제 만든 윈도우를 화면에 출력하게 됩니다..
: ShowWindow(hWnd, nCmdShow);
: UpdateWindow(hWnd);
:

// 윈도우 프로그래밍은 Event Driven 방식이라는 거 아시죠..? 사용자의 Action에 따라서 Event가 발생을 하게 되고 그 Event에 따라서 프로그램이 진행을 하게 되는 거죠...
// 아래의 구문은  프로그램이 죽을 때 까지 Message Queue 에 저장이 되어 있는 Message를 가져오는 그런 역할을 합니다.. 물론 메세지를 가져오게 되면 해당 Message 에 적합한 함수라던지 프로세스들이 실행이 되겠죠...
// 제 생각에는 Window Programming 에 대한 책을 보면 Window Programming의 형태라던지 Message Queue등의 설명이 되어 있는데 한번 보시는 것이 더 좋을 것 같습니다..
: while(GetMessage(&msg, NULL, 0, 0))
: {
:       TranslateMessage(&msg);
:       DispatchMessage(&msg);
: }
:
: return(msg.wParam);
: }


// 아까 클래스를 등록하는 과정에서 wc.1pfnWndProc  = (WNDPROC)WndProc; 라는 구문이 있었죠..? 이것은 아까 Message Queue 에서 계속 메세지를 가져오게 되는 데 그 내부 구조에 의해서 Message 가 지금 이 프로세스가 처리를 해야할 메세지라면 가져와서 WndProc 에 넘기게 되는데요.. WndProc 에서는 받은 메세지에 따라서 적절한 행동을 취하게 되는 것입니다..  에궁 제가 실력이 없어서리 설명하기가 꽤나 힘드네요..
: LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam,                                         LPARAM 1Param)
: {

// 아까 말했던 메세지에 따라서 행동을 취하게 되는 부분입니다...
// WM_DESTROY 라는 메세지가 오게 되면 프로그램을 끝내는 역할을 하게 되구요...
// 그 나머지의 메세지인 경우 윈도우에서 자체 지정한 default Proc 를 실행하게 됩니다..
:   switch (uMsg)
:   {
:      case WM_DESTROY:
:               PostQuitMessage(0);
:               break;
:     default:
:             return DefWindowProc(hWnd, uMsg, wParam, 1Param);
:     }
:     return(OL);
: } 

에궁 제가 글을 적어놓고도 별 횡설수설이라는 느낌이 드네요... 아무튼 실력없는 저로선 최선을 다한 것이니까.. 미워하지 말아주세염... 그럼 즐프하시구여... 도움이 되시길...

+ -

관련 글 리스트
7192 저 이거 꼭 알아야 하는뎅.. 도저히 몰라성.. ghduddlekd 2126 2001/05/04
7195     Re:저 이거 꼭 알아야 하는뎅.. 도저히 몰라성.. 왕초보 2300 2001/05/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.