돌아오기 위해서


여행은 또 다른 인간의 깊은 정서를 표상한다.
인간에게 '귀환(歸還)'이라는 말만큼 중요한 의미를
갖는 단어도 드물 것이다. 인간은 '돌아오는 동물'이다.
그러나 돌아오기 위해서는 어디론가 떠나야 한다.
귀환의 진한 감동을 온몸으로 느끼기 위해서는
어디론가 출발해야 한다.
여행의 참 맛은 바로 여기에 있다.



- 김용석의《 일상의 발견 》중에서 -



* 인생은 돌아오기 위해 떠나는 여행과 같습니다.
자기 마음의 감옥으로부터 탈출하여 익숙한 곳에서
낯선 곳으로, 늘 걸어본 땅에서 한번도 밟아보지
못한 땅으로 떠나는 것입니다. 그리고는 새로운 사람,
새로운 생각, 새로운 장소에서 마음의 자유를 얻어
미움과 다툼과 상처를 털어내고 본래 있던
자리로 돌아오는 것입니다.




2004. 4. 30. 08:38

생각과 행동

세상이 너 같은
최고의 지식 계층에게 바라는 것은
행동(행동은 평범한 정치인이나 군중 선동가로
족하지)이 아니라 사상이며, 그것이 훨씬 귀한 자질이지.
그러니 너는 우리의 문제들을 숙고하여 그 결과를
글로 담아내고, 차세대의 스승들을 통해 서서히
스며들도록 내버려두면 되는 것이야.



- 버트런드 러셀의《러셀 자서전(상)》중에서-



* 행동이 집이라면 생각은 설계도입니다.
생각과 사상이 뒷받침되지 않는 행동, 생각이 없는 사회,
온전하게 나아갈 수 없습니다. 행동하는 사람도
필요하지만 생각하는 사람도 더욱 필요합니다.
최고의 지식은 행동에서 나오는 것이 아니라
생각에서 나오는 것입니다.
2004. 4. 29. 09:12

2막 커튼을 들어올릴 때


여러분이
2막 커튼을 들어올리기 위해
맨 먼저 해야 할 일은 오직 자신에게
꿈꿀 권리를 주는 것, 그것뿐이다.
꿈은 이루어진다.
그렇지 않다면 신이 우리에게
꿈을 꾸게 만들었을 리가 없다.



- 스테반 폴란, 마크 레빈의 《2막》 중에서-



* 꿈이 없으면 내일의 희망도 없습니다.
꿈을 잃어버리면 미래도 함께 잃게 됩니다.
인생의 2막 커튼을 들어올릴 수가 없습니다.
'꿈은 이루어진다'는 마술을 자기 자신에게 걸면
꿈은 실제로도 마술처럼 이루어집니다.



2004. 4. 28. 09:14

최고의 업적


"최고의 업적은
남에게 유익을 끼치는 것이다."
삶의 어떠한 영역에서든 남이 성장하도록
돕는 것이 바로 유익을 끼치는 것이다. 왜냐하면
삶의 수준을 높여주기 때문이다.



- 존 맥스웰, 짐 도넌의《영향력》 중에서 -



* 자기도 잘 돼야 하지만
다른 사람도 함께 잘 돼야 합니다.
숲에 나무 한 그루만 우뚝 자라 있으면
천둥 번개 비바람에 견디지 못합니다.
그 누군가에게 유익이 되는 것이면
그것의 크기가 아무리 작다해도
큰 업적이 될 수 있습니다.




2004. 4. 27. 13:34

2004/4/27

월급 : 70만원
이부장 : 30 빌려갔음
2004. 4. 27. 09:13

브레인 스토밍

브레인 스토밍에는
다음의 4가지 규칙이 있다.
1. 다른 사람의 발언을 비판하지 않는다.
2. 자유분방한 발언을 환영한다. 몽상도 좋다.
3. 질보다 양을 중요하게 여긴다.
4. 다른 사람의 아이디어에 무임승차한다.




- 가토 마사하루의《내 두뇌에 날개를 달아주는 생각의 도구》중에서 -



* 브레인 스토밍은 완전한 아이디어를
구하는 것이 아닙니다. 파편과 같은 생각들을 하나로
모아가는 작업입니다. 그러므로 번쩍 하는 아이디어를 파바박
말할 수 있어야지, 너무 뜸을 들이거나 이 말을 했다가
창피를 당하지 않을까 걱정하면, 그때는 이미 브레인
스토밍의 자리에서 벗어나게 됩니다.
번쩍, 할 때 자신있게 말하십시오.



2004. 4. 26. 08:59

내 안의 어린아이


모든이의 마음에는
어린 영혼이 존재합니다.
내 마음속의 어린아이에게 관심을 갖는 것은
내면의 욕구를 진지하게 받아들이는 첫걸음입니다.
나는 내 영혼을 만나는 최초의 인간입니다.
내면을 들여다보며 나는 난생 처음 내 안의
소리를 듣고 보살핌을 원하는 어린아이의
상처를 보게 될 것입니다.



- A.J 셰블리어의《인생반전연습》중에서 -



* 내 안의 어린아이, 또 하나의 나입니다.
맑고 순수했던 내 영혼의 최초 모습이며, 언제나
나를 다시 비쳐보게 하는 내면의 거울입니다. 비록 나이를 먹고
세월이 흐르더라도 내 안의 어린아이는 늙지 않게 해야 합니다.
그래야 최초의 순수함 그대로의 천진무구함과
풋풋함이 시들지 않고 오래오래
내 안에 머물 수 있습니다.



2004. 4. 25. 22:51

2004/4/26

센트럴 시티 직원 모집
http://job2.naver.com/jobs/large/maincomname.asp?id=307062
2004. 4. 25. 12:11

2D테트리스만들기 1. 실전 윈도우 기본구조

####################################################
   2D테트리스만들기

             1. 실전 윈도우 기본구조

                  1) InitApp

                  2) InitInstance

                  3) WinMain

                  4) WndProc

                  5) OnCreate

                  6) OnPaint;

                  7) OnKey

                  8) OnDestroy;


####################################################


앞으로 강의 할 윈도우의 기본 구조를 분석해보자.  지금까진 워밍업이었다. 이제부터

실전에 들어가보자.  구조가 약간은 달라졌을 것이다. 그러나 중요 기능별로 함수를

만든것에 불과하다.   당부하고 싶은 말은 절대로 첨 보는 함수가 있더라도 어려워 하지

말고 모든 기능을 다 외운다는 생각은 버려야 할 것이다.  모르는 것이 있다면 그냥 이런

기능이 있구나 하구 넘어 가길 바랍니다.  나무에 너무 집착하면 넓은 숲을 못보기 때문입니다.

한번 차근히 검토해 보자.


//------------실전 예 시작------------------


#include <windows.h>
#include <windowsx.h>
// HANDLE_MSG, GlobalFreePtr을 만들려면 해더에 windowsx.h를 선언해 주어야 한다.

/************** 전역변수 선언 ***************/
HWND        hMainWnd ;
HINSTANCE        hMainInst;
char                szAppName[] = "윈도우이름" ;
/*****************************************/


/************** 함수선언 ***************/
BOOL InitApp(HINSTANCE hInstance);
// 윈도우의 기본적인 스타일과 아이콘, 커서모양등을 설정
BOOL InitInstance(HINSTANCE hInstance, int iCmdShow);
// 윈도우켑션이름과 위치나 크기등을 정한다.
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
// 윈도우에 실제 명령을 수행하게됨
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
// 윈도우를 생성한다.
void OnPaint(HWND hwnd);
// 화면을 그린다.
void OnKey(HWND hwnd, UINT vk, bool fdown, int cRepeat, UINT flags);
// 키명령을 수행한다.
void OnDestroy(HWND hwnd);
// 윈도우를 닫는다.
/*****************************************/


BOOL InitApp(HINSTANCE hInstance)
{
    WNDCLASSEX  wndclass ;


    wndclass.cbSize        = sizeof (wndclass) ;//구조체의크기
    wndclass.style         = CS_HREDRAW | CS_VREDRAW ; //윈도우의 수평,수직 크기가
                                                       //변경될 때 다시 그려준다.
    wndclass.lpfnWndProc   = WndProc ; // 윈프록 함수 이름선언
    wndclass.cbClsExtra    = 0 ;
    wndclass.cbWndExtra    = 0 ;
    wndclass.hInstance     = hInstance ; //현재 winMain()에서 사용되는 Handle값은
                                             // 무엇이냐 OS가 Handle값을 전달 해 준다.
    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
                              //IDI_APPLICATION는 ICON을 default로 쓰겠다는 의미.
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
                              //IDC_ARROW은 화살표 모양 커서를 나타냄.
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
                               //WHITE_BRUSH은 바탕색을 흰색으로 쓰겠다
    wndclass.lpszMenuName  = ""; // NULL;로해도된다.
                        // 만약 메뉴 이름이 ""로 안되어있고 그냥 이름으로 되어있다면
                        // MAKEINTRESOURCE(IDR_MENU1); 함수를 사용한다.
    wndclass.lpszClassName = szAppName ;
                     //클래스 이름. SzAppName는 클래스 이름을 담는 문자열 변수이름이다.
    wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;

    return(RegisterClassEx (&wndclass)) ;
}

BOOL InitInstance(HINSTANCE hInstance, int iCmdShow)
{
    hMainWnd = CreateWindow (szAppName,     //윈도우 클래스 이름
                            "윈도우켑션",   //윈도우 켑션
                    WS_OVERLAPPEDWINDOW,//윈도우 유형
                    CW_USEDEFAULT,      //초기 x위치
                    CW_USEDEFAULT,      //초기 y위치
                    CW_USEDEFAULT,      //초기 x크기
                    CW_USEDEFAULT,      //초기 y크기
                    NULL,               //부모 윈도우 핸들
                    NULL,               //윈도우 메뉴 핸들
                    hInstance,          //프로그램 인스턴스 핸들
                    NULL) ;           //생성 매개 변수

    if (!hMainWnd) return FALSE;

    hMainInst = hInstance;

    ShowWindow (hMainWnd, iCmdShow) ;
        //크기나 모양.. 을 눈에 보이게 하는 함수.
        // iCmdShow(속성표현-맨 하단의 아이콘 표현 유무)
    UpdateWindow (hMainWnd) ;
        //크기나 모양.. 을 눈에 보이게 하는 함수.
    return TRUE;
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    MSG         msg ;

        if ((!hPrevInstance) & (!InitApp(hInstance)))
            return FALSE;

        if (!InitInstance(hInstance, iCmdShow)) return FALSE;

    while (GetMessage (&msg, NULL, 0, 0))//들어 온 메시지를 받아냄.
                        //MFC의 LButton과 Rbutton과 같음.

    {
      TranslateMessage (&msg) ; //알 수 있는 메시지 형태로 변환.
                        // (키보드에서 메세지를 받아온다.)
      DispatchMessage (&msg) ; //Msg값을 4부분으로 쪼개서 winProc에 인
                //로 보내고 나서 winProc함수에 WN_DESTRO
                //가 올 때 까지 무한루프를 돌린다.
                // (메세지를 윈도우 프로시저에 전달)

    return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg,
                                    WPARAM wParam, LPARAM lParam)
{
    switch (iMsg)
    {
        HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
                // HANDLE_MSG는 메세지를 받아 사용자 함수에 전달하는 역활을 한다.
        HANDLE_MSG(hwnd, WM_PAINT, OnPaint);
        HANDLE_MSG(hwnd, WM_KEYDOWN, OnKey);
        HANDLE_MSG(hwnd, WM_KEYUP, OnKey);
        HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);
    }

    return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}

BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
        return 1; // True;를 사용해도 된다.
}

void OnPaint(HWND hwnd)
{
    HDC hdc; // 디바이스컨텍스트라는 핸들을 생성한다.(페인트에필수)
    PAINTSTRUCT ps; //(페인트에필수)

    hdc = BeginPaint(hwnd, &ps);
        EndPaint(hwnd, &ps);
}

void OnKey(HWND hwnd, UINT vk, bool fdown, int cRepeat, UINT flags)
{
        switch (vk)
        {
                case VK_ESCAPE :
                        PostQuitMessage(0);
                        // 윈도우핸들에 WM_CLOSE메시지를 보낸다.
                        //SendMessage (hMainWnd, WM_DESTROY, 0, 0L);
                        break;
        }
}

void OnDestroy(HWND hwnd)
{
    PostQuitMessage(0);
}



//------------실전 예 끝------------------


1) BOOL InitApp(HINSTANCE hInstance);

첨보는 함수일 것이다.  내가 만든 함수니깐...ㅎㅎ

이 함수는 윈도우 클래스 등록하는 부분을 따로 분리한 것이다. 모든 함수는 최대한 가볍게 가져가야

한다는 기본 원리를 따른 것입니다.  이해를 돕기 위해 이렇게 한다구 하는군여.

    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

여기서 (HBRUSH)는 클레스 형이 hbr이기때문에 형을 변환하기 위해 써준것이다. GetStockObject는

pens, brushes, fonts, or palettes의 핸들을 받아오는 기능을 한다.  많이 사용되니 알아두기 바랍

니다.

    wndclass.lpszMenuName  = ""; // NULL;로해도된다.
        // 만약 메뉴 이름이 ""로 안되어있고 그냥 이름으로 되어있다면
        // MAKEINTRESOURCE(IDR_MENU1); 함수를 사용한다.

  이것은 윈도우에 들어가 메뉴 이름을 넣는 것인데.  아직은 사용하지 않으니 자세한 내용은 다음으로

미루도록 하겠다.

    return(RegisterClassEx (&wndclass)) ;

생성한 클레스를 레지스터에 등록한후 리턴값을 돌려준다.



2) BOOL InitInstance(HINSTANCE hInstance, int iCmdShow);

윈도우를 생성하고 보여주는 함수이다.

    hMainWnd = CreateWindow (...);

hMainWnd는 윈도우 핸들을 전역 변수로 만들어 필요한 함수에서 가져다 쓰게 하려구 선언했다.

    if (!hMainWnd) return FALSE;

윈도 생성이 실패하면 false를 리턴한다.  윈도우 생성이 안되는 것이다.

    hMainInst = hInstance;

인스턴스 핸들을 전역 변수로 만든다.




3) int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                            PSTR szCmdLine, int iCmdShow)

        if ((!hPrevInstance) & (!InitApp(hInstance)))
            return FALSE;
hPrevInstance 몰라도 된다. InitApp함수 리턴값을 알아본다.

        if (!InitInstance(hInstance, iCmdShow)) return FALSE;

InitInstance함수 리턴값을 알아본다.



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

HANDLE_MSG함수로 모든 윈도우 메세지를 특정 함수에 전달한다.  HANDLE_MSG를 사용하지

않구 직접 메세지를 처리해도 상관없으나 WndProc함수 보기 좋게 정리 하기 위해 사용한다.

참고] 함수 원형을 보면

BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void OnChar(HWND hWnd, TCHAR ch, int cRepeat);
void OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags);
void OnPaint(HWND hWnd);
void OnSetFocus(HWND hWnd, HWND hwndOldFocus);
void OnKillFocus(HWND hWnd, HWND hwndNewFocus);
void OnDestroy(HWND hWnd);
LRESULT OnImeComposition(HWND hWnd, WPARAM wParam, LPARAM lParam);
LRESULT OnImeChar(HWND hWnd, WPARAM wParam, LPARAM lParam);
void OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
void OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags);
void OnLButtonUp(HWND hWnd, int x, int y, UINT keyFlags);
void OnTimer(HWND hWnd, UINT id);
void OnSize(HWND hWnd, UINT state, int cx, int cy);
void OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos);
void OnVScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos);
void OnContextMenu(HWND hWnd, HWND hwndContext, UINT xPos, UINT yPos);
void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);
BOOL OnSetCursor(HWND hWnd, HWND hwndCursor, UINT codeHitTest, UINT msg);
UINT OnGetDlgCode(HWND hWnd, LPMSG lpmsg);




5) BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
윈도우를 생성한다.



6) void OnPaint(HWND hwnd);
화면을 그린다.



7) void OnKey(HWND hwnd, UINT vk, bool fdown, int cRepeat, UINT flags);

vk 키값이 넘어온다.



8) void OnDestroy(HWND hwnd);

PostQuitMessage 응용 프로그램에 종료 WM_QUIT에 메세지를 전달한다.



2004. 4. 25. 09:01

윈도우 분석 4. 간단한 프로그램 작성

####################################################
   윈도우 분석

             4. 간단한 프로그램 작성

####################################################



  #include <windows.h>

  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
  int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                         LPSTR lpCmdLine, int iCmdShow)
  {
      static TCHAR szAppName[] = TEXT('Hello Windows');
      HWND hwnd;
      MSG msg;
      WNDCLASS wndClass;
              
        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)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, iCmdShow);
     while(GetMessage(&Message,NULL,0,0))
     {  
          TranslateMessage(&Message);  
          DispatchMessage(&Message);  
     }
     return Message.wParam;  
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                                   WPARAM wParam, LPARAM lParam)
{
     HDC hdc;
     PAINTSTRUCT ps;
     RECT  rect;
  
     switch(message)
     {
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            GetClientRect(hwnd, &rect);

            DrawText(hdc, TEXT("Hellow Windows"), -1, &rect,
                       DT_SINGLELINE | DT_CENTER | DT_WCENTER);
            EndPaint(hwnd, &ps);
            return 0;

        case WM_DESTROY:
           PostQuitMessage(0);
           retrun 0;
      }
      return DefWindowProc(hwnd, message, wParam, lParam);
}

      
간단한 예제에서 쓰인 Windows 함수호출 열거

   LoadIcon  - 프로그램에 의해 사용되는 아이콘을 로드한다
   LoadCursor - 프로그램에 의해 사용되는 마우스 커서를 로드한다
   GetStockObject - 그래픽개체를 알아내고 이 경우 윈도우의 배경을 칠하는데 사용되는 브러쉬이다
   RegisterClass  - 윈도우클래스를 등록한다
   MessageBox   - 메세지 상자를 출력한다
   CreateWindow  - 윈도우 클래스를 기반으로 윈도우를 생성한다
   ShowWindow   - 화면상에 윈도우를 출력한다
   GetMessage   - 메세지큐로부터 메세지를 알아낸다
   TranslateMessage - 키보드메세지를 번역한다
   DispatchMessage - 윈도우 프로시저에 메세지를 보낸다
   BeginPaint   - 윈도우에서 그리기 작업을 시작시킨다
   GetClientRect - 윈도우의 클라이언트 영역의 크기를 알아낸다
   DrawText  - 문자열을 출력한다
   EndPaint  - 그리기작업을  끝낸다
   PostQuitMessage -  메세지큐에 quit 메세지를 삽입한다
   DefWindowProc  - 메세지의 디폴트 처리를 수행한다