반응형

1. HWND → PID

DWORD GetWindowThreadProcessId(

    HWND hWnd,                             //  [in] 윈도우 핸들

    LPDWORD lpdwProcessId           //  [out] PID

);         

리턴 : hWnd의 Process ID (=파라미터 2)

 

2. PID → HANDEL

HANDEL OpenProcess(

    DWORD dwDesiredAccess,          // [in] 프로세스 접근 권한   최고 : MAXIMUM_ALLOWED

    BOOL bInheritHandle,                  // [in] 상속 여부  false

    DWORD dwProcessId                  // [in] PID

);

리턴 : PID의 HANDEL

cf. CloseProcess()

 

3. HANDEL → PID

DWORD GetProcessId(
    HANDLE Process                        // [in] 프로세스 핸들

);

리턴 : HANDEL의 PID


반응형

' http://www.meadroid.com의 ScriptX 공개 프린트 컴포넌트로 상당히 많은 기능이 있으나
무료로 사용할수 있은 기능은 아래와 같고.  그 외의 기능은 라이센스가 필요하다.

<script language="javascript">

function printWindow() {
   factory.printing.header = "머릿글" //머릿말 설정
   factory.printing.footer = "바닥글"   //꼬릿말 설정
   factory.printing.portrait = true                    //출력방향 설정: true-세로, false-가로
   factory.printing.leftMargin = 1.0                 //왼쪽 여백 설정
   factory.printing.topMargin = 1.0                 //왼쪽 여백 설정
   factory.printing.rightMargin = 1.0               //왼쪽 여백 설정
   factory.printing.bottomMargin = 1.0            //왼쪽 여백 설정
  factory.printing.Print(false, window)
}
</script>

 


<object id="factory" viewastext  style="display:none"
  classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"
  codebase="http://www.meadroid.com/scriptx/ScriptX.cab#Version=6,2,433,14">
</object>

 

<input type="button" name="print" value="프린트" onClick="printWindow();">

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 - 프린터 팁 : 웹페이지를 다음 페이지에 인쇄

     <p style="page-break-before:always"> 

     이 태그를 만나면 다음페이지에 인쇄함.

다음은 MeadCo 사에서 제공하는 ScriptX 에 대한 보다 더 자세한 설명입니다.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

ASP나 자바스크립트로는 이러한 웹브라우저의 인쇄기능 설정을 변경할 수 없습니다.
사용할수 있는것이라고는 오직 여러분들이 잘 아시는 window.print(); 밖에 없습니다. ASP나 자바스크립
트 같은 스크립트 언어로는 윈도우 API를 사용할수 없기 때문이죠.

따라서 할수 있는 방법은 컴포넌트를 따로 만들어서 이것을 ASP 같은 스크립트 언어를 사용해 제어하는 것
이 현재까지의 방법중 가장 확실한 것이죠.

근데 문제는....
직접 서버를 운영하는 분들이 아니고 호스팅 서비스를 이용하시는 분들의 경우 개인이 만든 컴포넌트를 서버
에 인스톨하는 것이 불가능합니다. 대부분의 호스팅 회사들은 이것을 전혀 허락하지 않으니까요. 그리고 만
일 직접 컴포너트를 제작할 능력이 안된다면 그건 더 말할게 없겠죠.

이러한 문제점들을 안고 어려운 환경속에서도 열쒸미 프로젝트 개발에 여념이 없으신 분들에게 좋은 팁하나
가르쳐 드리겠습니다. 남의 손으로 코푼다고 할까요~~ 아주 간단하지만 강력한 인쇄기능 제어 방법입니다.
이 방법을 사용하시면 웹사이트에서 인쇄를 할때...

1. Header, Footer를 완벽히 제어할수 있습니다. Header, Footer를 빼고 인쇄할수도 있고 자기가 원하는 것으
로 바꿔서 인쇄할 수도 있습니다.

2. 코딩으로도 화면을 가로로 인쇄할지 세로로 인쇄할지 설정할수 있습니다.

3. 웹브라우저에 기본으로 되어있는 건 언제나 1부씩 출력이죠.... 이것을 자기가 원하는 부수로 설정할 수 있
습니다.

4. 왼쪽, 오른쪽, 위, 아래 여백 사이즈를 자기가 원하는데로 설정할 수 있습니다.

5. 프린터 이름을 입력해 어느 프린터로 출력 할지도 미리 설정할 수 있습니다.

6. 종이의 종류를 A4로 할지 다른걸로 할지등을 지정할 수 있습니다.

7. Manual Feed로 할지 Auto Feed로 할지 지정할 수 있습니다.

어떠세요. 이 정도 기능을 웹페이지 안의 코딩으로 미리 다 설정이 가능하다면 더 이상 웹어플리케이션 개발
할때 봉착하는 프린트 제어 기능 문제는 겪지 않으시겠죠?
또한 서버에 컴포넌트를 설치할 필요도 없으니 호스팅 서비스를 이용하시는 분들이나 컴포넌트 제작이 어려
우신 분들에게도 아주 좋으실 겁니다.

자 이제 딴소린 다 집어치우고 어떻게 하는지에 대해 말씀 드리겠습니다.

MeadCo라는 회사에서 개발한 ScriptX 라는 컴포넌트가 있습니다. 이것을 사용하는 것입니다.
물론 무료로 사용 가능하구요. Cab 파일 형태로 제공됨으로 서버에 설치하지 않고 클라이언트 컴터에 설치하
여 쓸수 있습니다. 여러분들 어떤 사이트를 방문하면 팝업이 뜨면서 0000 가 배포하는 000 프로그램을 설치하
겠나는 메세지 많이들 보셨죠? '예'를 선택하면 자동으로 그 프로그램이 설치되고 해당하는 웹페이지의 기능
들을 쓸수 있었잖아요. 이게 바로 그겁니다.

1.
우선 MeadCo 사의 웹사이트에서 ScriptX.Cab을 다운 받으세요.
이름(First Name), 성(Last Name), 이메일 주소를 입력하면 무료로 다운 받으실 수 있습니다.

http://www.meadroid.com/scriptx/sxdownload.asp

2.
다운받은 ScriptX.CAB 파일을 본인 웹서버의 원하는 곳에 업로드 시키세요.
http://www.test.com/ActiveX/ScriptX.cab 에 올렸다고 가정하죠.

3.
이제 인쇄기능이 필요한 웹이지 안에 다음의 오브젝트 태그를 삽입하세요.

<object id="factory" style="display:none" viewastext classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"
codebase="http://www.test.com/ActiveX/ScriptX.cab#Version=6,1,431,2">
</object>

여기는 게시판이라 짤려서 3줄이 됐지만 짤리지 않게 두줄로 삽입하세요.

4.
이제 준비 끝입니다. 다음의 설정 스크립트를 삽입합니다.

<script defer>
function Print() {
factory.printing.header = "영수증 원본"; // Header에 들어갈 문장
factory.printing.footer = "감사합니다."; // Footer에 들어갈 문장
factory.printing.portrait = false // true 면 가로인쇄, false 면 세로 인쇄
factory.printing.leftMargin = 1.0 // 왼쪽 여백 사이즈
factory.printing.topMargin = 1.0 // 위 여백 사이즈
factory.printing.rightMargin = 1.0 // 오른쪽 여백 사이즈
factory.printing.bottomMargin = 1.0 // 아래 여백 사이즈
factory.printing.SetMarginMeasure(2); // 테두리 여백 사이즈 단위를 인치로 설정합니다.
factory.printing.printer = "HP DeskJet 870C"; // 프린트 할 프린터 이름
factory.printing.paperSize = "A4"; // 용지 사이즈
factory.printing.paperSource = "Manual feed"; // 종이 Feed 방식
factory.printing.collate = true; // 순서대로 출력하기
factory.printing.copies = 2; // 인쇄할 매수
factory.printing.SetPageRange(false, 1, 3); // True로 설정하고 1, 3이면 1페이지에서 3페이지까지 출력
factory.printing.Print(true) // 출력하기
}
</script>

이제 버튼 하나 만들어서 Print() 만 호출하면 위에 설정된 구성들로 프린트가 될것입니다.

만일 폼값을 받아 위의 설정값들을 변경하려면
frm = document.forms[0]; 처럼 폼 다큐먼트를 설정해 준 후
document.factory.printing.copies = frm.CopiesValue.value; 처럼 그 값을 받아오면 됩니다.
<출처: http://flashcafe.org/?mid=programming_study&page=2&sort_index=readed_count&order_type=desc&document_srl=12026 >
반응형

win32 console API

 

GetConsoleWindow                  //콘솔 윈도우 윈도우핸들 얻기
GetConsoleMode                     //현재 콘솔의 입출력 모드 얻기
SetConsoleMode                     //콘솔의 입출력 모드 설정
GetConsoleCursorPosition        //스크린 버퍼의 커서 위치 변경
GetConsoleCursorInfo              //스크린 버퍼의 커서 정보 얻기
SetConsoleCursorInfo              //스크린 버퍼의 커서 정보 설정
SetConsoleWindowInfo             //콘솔 윈도우의 정보 설정
CreatConsoleScreenBuffer        //스크린 버퍼 생성
GetConsoleScreenBufferInfo      //스크린 버퍼 정보 얻기
SetConsoleScreenBufferSize     //스크린 버퍼 크기 변경
SetConsoleTextAttribute            //기본 문자 속성 설정, 고수준 출력함수에서 사용
ScrollConsoleScreenBuffer        //스크린 버퍼의 내용 스크롤
SetConsoleActiveScreenBuffer   //활성 스크린 버퍼 변경
GetCurrentConsoleFont             //콘솔에서 사용중인 폰트 정보 얻기

 

COORD 구조체

콘솔에서 좌표를 나타내기위한 구조체

 

typedef struct _COORD { // coord.
    SHORT X;      // horizontal coordinate
    SHORT Y;      // vertical coordinate
} COORD;

 

// 커서의 좌표를 조사한다.
COORD getCursorPosition(void)
{
    CONSOLE_SCREEN_BUFFER_INFO buffInfo;

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&buffInfo); //현재콘솔스크린버퍼에서 정보읽어와서

                                                                                                                  //buffInfo에 저장
    return   buffInfo.dwCursorPosition; //CONSOLE_SCREEN_BUFFER_INFO구조체형변수 buffInfo에 속한 멤버변수이고
}                                                   //COORD형인  dwCursorPosition을 리턴   (x,y좌표값이 들어있다)

//나중에 사용할 코딩부분 //////////////////
//콘솔의 스크린 버퍼사이즈 변경할 소스코드
COORD bufferSize = {80, 25};
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), bufferSize);
//////////////////////////////////////////////////////////////////////////////////////////



http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=72177697&qb=U2V0Q29uc29sZVNjcmVlbkJ1ZmZlclNpemU=&enc=utf8&section=kin&rank=2&sort=0&spq=0&pid=fINGjv331xwsssyZ6jZssv--057430&sid=S6b8EfbepksAAH9dHjI

http://www.adrianxw.dk/SoftwareSite/Consoles/Consoles6.html

http://msdn.microsoft.com/en-us/library/ms683231(VS.85).aspx <==GetStdHandle Function

Value Meaning
STD_INPUT_HANDLE
(DWORD)-10

The standard input device. Initially, this is the console input buffer, CONIN$.

STD_OUTPUT_HANDLE
(DWORD)-11

The standard output device. Initially, this is the active console screen buffer, CONOUT$.

STD_ERROR_HANDLE
(DWORD)-12

The standard error device. Initially, this is the active console screen buffer, CONOUT$.


STD_OUTPUT_HANDLE 활성화된 콘솔 스크린에 핸들을 가져오는 건가?? 

A console process uses handles to access the input and screen buffers of its console. A process can use the GetStdHandle, CreateFile, or CreateConsoleScreenBuffer function to open one of these handles.

The GetStdHandle function provides a mechanism for retrieving the standard input (STDIN), standard output (STDOUT), and standard error (STDERR) handles associated with a process. During console creation, the system creates these handles. Initially, STDIN is a handle to the console's input buffer, and STDOUT and STDERR are handles of the console's active screen buffer. However, the SetStdHandle function can redirect the standard handles by changing the handle associated with STDIN, STDOUT, or STDERR. Because the parent's standard handles are inherited by any child process, subsequent calls to GetStdHandle return the redirected handle. A handle returned by GetStdHandle may, therefore, refer to something other than console I/O. For example, before creating a child process, a parent process can use SetStdHandle to set a pipe handle to be the STDIN handle that is inherited by the child process. When the child process calls GetStdHandle, it gets the pipe handle. This means that the parent process can control the standard handles of the child process. The handles returned by GetStdHandle have GENERIC_READ | GENERIC_WRITE access unless SetStdHandle has been used to set the standard handle to have lesser access.

The value of the handles returned by GetStdHandle are not 0, 1, and 2, so the standard predefined stream constants in Stdio.h (STDIN, STDOUT, and STDERR) cannot be used in functions that require a console handle.

The CreateFile function enables a process to get a handle to its console's input buffer and active screen buffer, even if STDIN and STDOUT have been redirected. To open a handle to a console's input buffer, specify the CONIN$ value in a call to CreateFile. Specify the CONOUT$ value in a call to CreateFile to open a handle to a console's active screen buffer. CreateFile enables you to specify the read/write access of the handle that it returns.

The CreateConsoleScreenBuffer function creates a new screen buffer and returns a handle. This handle can be used in any function that accepts a handle to console output. The new screen buffer is not active until its handle is specified in a call to the SetConsoleActiveScreenBuffer function. Note that changing the active screen buffer does not affect the handle returned by GetStdHandle. Similarly, using SetStdHandle to change the STDOUT handle does not affect the active screen buffer.

Console handles returned by CreateFile and CreateConsoleScreenBuffer can be used in any of the console functions that require a handle to a console's input buffer or of a console screen buffer. Handles returned by GetStdHandle can be used by the console functions if they have not been redirected to refer to something other than console I/O. If a standard handle has been redirected to refer to a file or a pipe, however, the handle can only be used by the ReadFile and WriteFile functions.

A process can use the DuplicateHandle function to create a duplicate console handle that has different access or inheritability from the original handle. Note, however, that a process can create a duplicate console handle only for its own use. This differs from other handle types (such as file, pipe, or mutex objects), for which DuplicateHandle can create a duplicate that is valid for a different process.

To close a console handle, a process can use the CloseHandle function.


콘솔 생성

BOOL AllocConsole(VOID);
콘솔창을 생성한다. 실패하면 FALSE을 반환한다.

BOOL FreeConsole(VOID);
열려진 콘솔을 닫는다.

HANDLE GetStdHandle(DWORD nStdHandle);
콘솔의 표준 핸들을 구하는 함수이다.
인자로 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE 중 하나를 넣어준다.

콘솔 정보 구하기

BOOL GetConsoleSc0reenBufferInfo(
HANDLE hConsoleOuput, // 콘솔의 핸들
PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo // 콘솔의 정보와 관련된 구조체
);
콘솔의 커서의 위치와 콘솔의 정보를 조사한다.

typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
COORD dwSize; // 화면 버퍼의 크기. 크기는 셀 단위이다.
COORD dwCursorPosition; // 커서의 현재 위치
WORD wAttributes; // 출력될 문자의 전경색과 배경색의 정보
SMALL_RECT srWindow; // 현재 보이는 화면 영역에 대한 좌표
COORD dwMaximumWindowSize; // 최대 화면의 크기 모니터의 해상도와 시스템 글꼴에 따라 달라진다.
} CONSOLE_SCREEN_BUFFER_INFO ;

전경, 배경 컬러
#define FOREGROUND_BLUE 0x0001
#define FOREGROUND_GREEN 0x0002
#define FOREGROUND_RED 0x0004
#define FOREGROUND_INTENSITY 0x0008
#define BACKGROUND_BLUE 0x0010
#define BACKGROUND_GREEN 0x0020
#define BACKGROUND_RED 0x0040
#define BACKGROUND_INTENSITY 0x0080

typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD;

typedef struct _SMALL_RECT {
SHORT Left;
SHORT Top;
SHORT Right;
SHORT Bottom;
} SMALL_RECT;

BOOL SetConsoleCursorPosition(
HANDLE hConsoleOutput, // 콘솔의 핸들
COORD dwCursorPosition // 커서의 위치
);
콘솔의 커서의 위치를 설정한다.

BOOL SetConsoleCursorInfo(
HANDLE hConsoleOutput, // 콘솔 핸들
CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo // 커서 모양의 구조체
);
커서의 크기를 구조체의 정보에 의해 바꾼다.

typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize; // 100분율의 크기
BOOL bVisible; // FALSE 로 하면 보이지 않음
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

BOOL GetConsoleCursorInfo(
HANDLE hConsoleOutput, // 콘솔 핸들
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo // 커서 정보
);
위의 함수에 상응하는 커서 정보를 알아오는 함수이다.

BOOL SetConsoleMode(
HANDLE hConsoleHandle, // 콘솔 핸들
DWORD dwMode // 모드
);
콜솔 모드를 선택한다.
밑의 모드들은 OR연산으로 중복 선택이 가능하다.

dwMode
ENABLE_PROCESSED_INPUT
편집키와 제어키를 문자 입력으로 받지 않고 해당 키의 기능을 처리하도록 한다.
BackSpace, Enter등의 제어키들의 기능을 수행한다.

ENABLE_LINE_INPUT
ReadFile, ReadConsole등의 함수로 문자열을 받을 때 Enter키가 눌러질 때 까지 입력을 받는다.
이 모드가 설정되어 있지 않으면 입력 버퍼에 한글자라도 있으면 바로 리턴한다.

ENABLE_ECHO_INPUT
입력중인 문자열을 화면으로 다시 보여주어 사용자가 확인할 수 있도록 해 준다.
이 모드가 설정되어 있지 않으면 입력중인 문자열을 사용자가 볼 수 없다.

ENABLE_MOUSE_INPUT
마우스의 커서의 위치, 변화, 클릭, 더블클릭등의 상태를 조사할 수 있다.

ENABLE_WINDOW_INPUT
콘솔창의 등록 정보창에서 화면 버퍼의 크기를 변경할 경우 버퍼 크기 변경 이벤트를 입력 버퍼에 넣는다. 버퍼의 크기에 따라 화면을
재구성해야 한다면 이 이벤틀를 받아서 처리한다.
나머지 다섯가지 입력 모드중 이 모드만 디폴트로 제외 되어 있다.

ENABLE_PROCESSED_OUTPUT
출력시 제어코드를 문자로 출력하지 않고 기능으로 출력한다.

ENABLE_WRAP_AT_EOL_OUTPUT
행의 끝 부분에 문자가 출력될때 다음줄로 자동으로 개행된다. 화면의 제일 아래쪽으로 출력되고자 할때 화면을 스크롤 한다.

BOOL GetConsoleMode(
HANDLE hConsoleHandle, // 콘솔 핸들
LPDWORD lpMode // 모드
);
현재의 콘솔의 모드를 반환한다.

BOOL SetConsoleCtrlHandler(
PHANDLER_ROUTINE HandlerRoutine, // 함수 포인터
BOOL Add // TRUE이면 이 핸들러가 추가되고, FALSE 이면 제거 된다.
);
콘솔의 핸들러를 지정한다.

핸들러의 원형은 밑의 형식이다.
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType);
여기서 넘어오는 dwCtrlType은 이 핸들러 함수를 호출한 신호 유형을 알려준다.
여기서 반환되는 값이 TRUE이면 나머지 등록되어 있는 핸들러는 실행 되지 않는다.
FALSE를 반환할때는 다음 핸들러로 제어를 넘긴다.
dwCtrlType
CTRL_C_EVENT Ctrl+C 가 입력되었음
CTRL_BREAK_EVENT Ctrl+Break가 입력되었음
CTRL_CLOSE_EVENT 콘솔창이 닫힐 때 이 콘솔에 연결된 모든 프로세스에게 보내진다.
CTRL_LOGOFF_EVENT 사용자가 로그오프할 때 보내진다.
CTRL_SHUTDOWN_EVENT 시스템이 셧다운될 때 보내진다.

HANDLE CreateConsoleScreenBuffer(
DWORD dwDesiredAccess, // 버퍼의 읽기, 쓰기모드에 대한 내용 ( GENERIC_READ, GENERIC_WRITE등의 플래그 조합 )
DWORD dwShareMode, // 콘솔의 공유 모드. 공유하지 않을때는 0.
CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 설명자. 그냥 NULL.
DWORD dwFlags, // 콘솔의 타입인데 현재 가능한 값은 CONSOLE_TEXTMODE_BUFFER 만 있음.
LPVOID lpScreenBufferData // 예약 값. 무조건 NULL.
);
복수개의 화면을 생성한다. 콘솔의 입력 버퍼는 하나만 존재하지만 출력 버퍼는 여러개가 존재 할수 있다.

BOOL SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput);
화면 출력 버퍼를 선택한다.


콘솔에 쓰기

DWORD WriteConsole(
HANDLE hConsoleOutput, // 콘솔 핸들
CONST VOID *lpBuffer, // 버퍼
DWORD nNumberOfCharsToWrite, // 쓰여질 문자열의 길이
LPDWORD lpNumberOfCharsWritten, // 쓰여진 문자열의 길이
LPVOID lpResserved // 예약된 변수
);
ANSI문자열이나 UNICODE문자열을 출력할수 있다. WriteFile함수로도 콘솔 핸들로 출력할수 있으니 ANSI파일밖에 출력 할 있다.

BOOL WriteConsoleOutput(
HANDLE hConsoleOutput, // 콘솔 핸들
CONST CHAR_INFO *lpBuffer, // 버퍼
COORD dwBufferSize, // 버퍼의 크기 (X,Y의 좌표로 행과 열을 뜻한다.)
COORD dwBufferCoord, // 버퍼내의 출력 대상 셀의 좌표를 지정한다.
PSMALL_RECT lpWriteRegion // 화면의 출력할 좌표
);
문자와 색상의 속성으로 콘솔에 출력한다.

typedef struct _CHAR_INFO {
union {
WCHAR UnicodeChar;
CHAR AsciiChar;
} Char;
WORD Attributes;
} CHAR_INFO, *PCHAR_INFO;

BOOL WriteConsoleOutputCharacter(
HANDLE hConsole hConsoleOutput, // 콘솔 핸들
LPCTSTR lpCharacter, // 문자열
DWORD nLength, // 길이
COORD dwWriteCoord, // 위치
LPDWORD lpNumberOfCharsWritten // 쓰여진 문자열의 길이
);
위치에 문자를 출력한다.

BOOL WriteConsoleOutputAttribute(
HANDLE hConsoleOutput, // 콘솔 핸들
CONST WORD *lpAttribute, // 속성
DWORD nLength, // 길이
COORD dwWriteCoord, // 위치
LPDWORD lpNumberOfAttrsWritten // 쓰여진 속성의 크기
);
위치의 속성을 변경한다.

콘솔에서 읽기

BOOL ReadConsole(
HANDLE hConsoleInput, // 콘솔핸들
LPVOID lpBuffer, // 버퍼
DWORD nNumberOfCharsToRead, // 읽을 문자열의 길이
LPDWORD lpNumberOfCharsRead, // 읽어진 변수
LPVOID lpReserved // 예약된 변수
);
ANSI문자열이나 UNICODE문자열을 읽을 수 있다.

출력 3함수에 대응하는
ReadConsoleOutput
ReadConsoleOutputCharacter
ReadConsoleOutputAttribute

//콘솔 어태치?


//어태치  사용




반응형
이번 프로젝트 이름은 GudaWinSet

Win32 API를 이용한 프로그램을 처음 작성한 것이다.

딱히 내놓을 만한 것은 아니지만 개인적인 프로젝트로 수정 보완하며 진행할 생각이다.

그리고 자바와는 또다른 매력이 있고 오랫만에 플밍에 오르가즘(?)을 느끼는 것 같기도 하다.

이렇게 말한다고 딱히 거창한 것은 아니다. 내가 사용하고자 진행하는 것이기 때문이다.


일단은 콘솔창 및 윈도우 화면의 설정을 변경할 목적으로 만들생각이다.
업무중 어쩔수 없이 콘솔창을 통해 로그를 보는데 각 콘솔창의 타이틀명을 바꾸기 번거럽고
버퍼라인 설정도 일일히 변경하기 귀찮은 관계로 해당 어플을 만들기로 하였다.
그리고 추가적으로 투명도 설정을 할수 있도록 기능을 추가할 예정이다. ㅎㅎ
메신저중에 네이트온처럼 투명창이 되었으면 하는 바램이 있기에 추가할 생각이다.
허접한 어플이지만 내공이 부족하여 구현하는 도중 찾은 여러가지 자료를 정리하고자 한다.

일단 다이얼로그 창에 한글입력시 깨짐 현상이 발생하였는데 이는 visual studio 설정으로 해결.

Resource View에서 해당 다이얼로그를 클릭하면 프로퍼티 속성에서 Language 항목을 볼수가 있다
여기서 한국어를 선택하면 실행시 한글깨짐 현상을 해결할수 있다.

다음 문제는 해당 윈도우의 핸들을 구하는 과정에서의 삽질 부분이다.

윈도우 간의 상호작용을 위해서는 우선 윈도우의 핸들을 알아야지 윈도우 관련 함수들을 사용할 수 있다.

HWND FindWindow(     

    LPCTSTR lpClassName,      //조사할 윈도우의 클래스 이름
    LPCTSTR lpWindowName      //조사할 윈도우의 캡션
);
조건에 맞는 윈도우를 찾으면 윈도우의 핸들을 리턴해 주고 못찾을경우 NULL을 리턴해준다.
최상위 부모 윈도우의 핸들만 리턴해준다.
 

HWND FindWindowEx(      

    HWND hwndParent,      //hwndParent에 속한 차일드 윈도우를 검색해낸다. NULL이면 데스크탑 윈도우의 차일드를 검색한다.
    HWND hwndChildAfter,  //검색을 시작할 차일드 윈도우를 지정한다. NULL이면 첫번째 차일드부터 검색한다.
    LPCTSTR lpszClass,    //조사할 윈도우의 클래스 이름
    LPCTSTR lpszWindow    //조사할 윈도우의 캡션
); 
부모 윈도우에 속한 차일드 윈도우 핸들을 찾을때 사용한다.

//이번에 사용한 함수이다.
HWND WindowFromPoint(      

    POINT Point
);
화면 좌표로 윈도우를 검색하는 함수로 인수로 화면 좌표를 POINT형으로 넣어주면 된다.
조건에 맞는 윈도우를 찾으면 윈도우의 핸들을 리턴해 주고 못찾을경우 NULL을 리턴해준다.
SPY++ 에서 사용하는 함수 인듯하다..  

*주의사항
위 함수를 이용해 얻은 CWnd * 형식의 값은 임시적으로 생성된 객체의 주소값이기 때문에
전역 변수 또는 멤버 변수에 저장한 후, 계속 사용하면 문제가 발생할수 있다.
해당 작업을 하는 그 순간에만 사용하고 더 이상 사용하면 안된다. 주의 할것!

위와 같은 함수를 이용해 윈도우의 핸들을 구했지만 내가 구하고 싶은것은 최상위 부모 윈도우의 핸들
이와 관련하여 HWND GetParent(HWND hWnd) 을 사용했지만 컨트롤의 경우 다른 컨트롤에 포함된 상태이면
상위 윈도우를 리턴하므로 원하는 결과가 나오지 않았다 그래서 사용한 함수가
GetAncestor(hWndChild,GA_ROOTOWNER); 두번째 인자인 플래그에 따라 GA_PARENT, GA_ROOT, GA_ROOTOWNER

GA_PARENT GetParent()와 비슷한 작업.
GA_ROOT, GA_ROOTOWNER  호출하는 컨트롤을 포함하는 최상위 윈도우 핸들

부모 윈도우의 차일드 윈도우를 조사하는 함수

BOOL EnumChildWindows(
    HWND hWndParent,                         // 부모 윈도우 핸들
    WNDENUMPROC IpEnumFunc,        // Call Back 함수의 포인터
    LPARAM IParam);  

하위 윈도우의 캡션값을 가져오기 위해서는  WM_GETTEXT 를 사용하면 된단다.. ^^;; 자료만 수집

코딩보다 자료정리하는데 더 많은 시간이 걸리는 것 같다. 그래도 정리를 해야 다음에 또 써먹기에.. ㅋ

반응형
 
- CWnd 클래스는 MFC의 모든 윈도우 클래스들에 대해서 기본적인 기능을 제공 하는 클래스이다. 

데이터 멤버
m_hWnd : CWnd와 관련된 HWND를 가리킨다. 


생성/소멸 관련 함수
CWnd : CWnd객체를 생성한다.
DestroyWindow : 윈도우를 소멸한다. 그렇지만 객체를 소멸시키는 것은 아니다. 


초기화 관련 함수
Create : CWnd 객체와 관련된 자식 윈도우를 만들고 초기화한다.
PreCreateWindow : CWnd 객체와 관련된 실제 윈도우를 만들기 전에 호출된다.
CaleWindowRect : 클라이언트 사각형 영역에서 윈도우를 만들기 전에 호출된다.
GetStyle : 현재 윈도우의 스타일을 반환한다.
GetExStyle : 확장된 윈도우의 스타일을 반환한다.
Attach : CWnd 객체에 윈도우 핸들을 추가한다.
Detach : CWnd 객체에서 윈도우 핸들을 분리하고 핸들을 반환한다.
PreSubclassWindow : SubclassWindow가 호출되기 전에 필요한 다른 서브클래싱이 일어나 는 것을 허용한다.
SubclassWindow : CWnd 객체에 윈도우를 추가하고 CWnd의 메시지맵을 통해서 루트 메시 지로 만든다.
UnSubclassWindow : CWnd 객체에서 윈도우를 분리한다.
FromHandle : 윈도우에 핸들이 주어질 때 CWnd 객체에 대한 포인터를 반환한다. CWnd 객체가 핸들을 가지지 않는다면, 임시적인CWnd 객체기 생성되고 추가된다.
FromHandlePermanent : 윈도우에 핸들이 주어질 때 CWnd 객체에 대한 포인터를 반환한다. 
CWnd 객체가 핸들을 가지지 않는다면, NULL이 반환된다.
DeleteTempMap : CWinApp가 자동으로 호출하며 FromHandle에 의해서 생성된 어떠한 임시 CWnd 객체도 지운다.
GetSafeHwnd : 포인터가 NULL이면, m_hWnd, 또는 NULL을 반환된다.
CreateEx : 오버랩된 형태의 팝업 자식 윈도우를 생성하고 이것을 CWnd 객체에 추가한다
CreateControl : MFC 프로그램에서 CWnd 객체에 의해서 표현되는 OLE 컨트롤을 생성한다. 


윈도우 상태 함수
IsWindowEnabled : 윈도우에 마우스와 키보드 입력이 가능한지를 결정한다.
EnableWindow : 윈도우에 마우스와 키보드로 입력을 가능하게 하거나 불가능하도록 한다.
GetActiveWindow : 활성 윈도우를 얻는다.
SetActiveWindow : 윈도우를 활성화한다.
GetCapture : 마우스를 캡쳐한 CWnd를 얻는다.
SetCapture : 모든 일련의 마우스 입력이 CWnd로 보내지도록 한다.
GetFocus : CWnd가 현재 입력 포커스를 가지고 있는지 검사한다.
SetFocus : 입력 포커스를 설정한다.
GetDestktopWindow : 윈도우 시스템의 desktop윈도우를 얻는다.
GetForegroundWindow : 포그라운드 윈도우의 포인터를 반환한다.
SetForegroundWindow : 생성된 윈도우의 스레드를 포그라운드로 설정하고 윈도우를 활성 화 한다.
GetIcon : 핸들에서 아이콘을 얻는다.
SetIcon : 핸들에 특정 아이콘을 설정한다.
GetWindowContextHelpId : 도움말 항목에 대한 식별자를 얻는다.
SetWindowContextHelpId : 도움말 항목에 대한 식별자를 지정한다.
ModifyStyle : 현재 윈도우의 스타일을 수정한다.
ModifyStyleEx : 확장된 윈도우의 스타일을 수정한다. 
IsWindow(HWND hWnd):  윈도우가 존재하면 TRUE 아니면 FALSE
IsWindowVisible(HWND hWnd): 윈도우가 보이면 TRUE 아니면 FALSE

윈도우의 크기와 위치
GetWindowPlacement : 윈도우가 보여지는 상태와 정상(복귀된), 최소, 최대화된 윈도우의 위치를 얻는다.
SetWindowPlacement : 윈도우가 보여지는 상태와 정상(복귀된), 최소, 최대화된 윈도우의 위치를 설정한다.
IsIconic : CWnd가 최소화되었는지를 알아본다.
IsZoomed : CWnd가 최대화되었는지를 알아본다.
MoveWindow : CWnd의 위치또는 크기를 변경한다.
SetWindowPos : 크기, 위치, 순서, 팝업, 최상위 윈도우에 대한 것을 설정한다.
ArrangeIconicWindows : 모든 축소된(아이콘화 된) 자식 윈도우에 대한 것을 설정한다.
BringWindowToTop : CWnd를 오버랩 된 윈도우의 맨 처음으로 보낸다.
GetWindowRect : CWnd의 화면 좌표를 얻는다.
GetClientRect : CWnd 클라이언트 영역의 크기를 얻는다. 


윈도우 참조 관련 함수
ChildWinddowFromPoint : 어떤 자식 윈도우가 특정 점을 포함하고 있는지를 알아낸다.
FindWindow : 윈도우의 이름과 클래스로 확인이 가능한 윈도우의 핸들을 반환한다.
GetNextWindow : 윈도우 관리자의 리스트에서 다음 또는 이전 윈도우를 반환한다.
GetOwner : CWnd의 소유자에 대한 포인터를 얻는다.
SetOwner : CWnd의 소유자를 변경한다.
GetTopWindow : CWnd에 속한 맨 첫 번째 자식 윈도우를 반환한다.
GetWindow : 이 윈도우와 특정한 관계를 가지고 있는 윈도우를 반환한다.
GetLastActivePopup : CWnd이 가지고 있는 팝업 윈도우가 가장 최근에 활성화 되었는지를 알아낸다.
IsChild : CWnd가 자식 윈도우인지 또는 다른 특정 윈도우의 후손인지를 알아낸다.
GetParent : CWnd의 부모 윈도우가 있다면 그 윈도우를 얻는다.
GetSafeOwner : 지정된 윈도우의 소유자를 얻는다.
SetParent : 부모 윈도우를 변경한다.
WindowFromPoint : 특정 점을 포함하는 윈도우를 알아낸다.
GetDlgItem : 특정 대화상자에서 특정 ID의 컨트롤을 얻는다.
GetDlgCtrlID : CWnd가 자식 윈도우이면, 자신의 ID 값을 반환한다.
SetDlgCtrlID : 윈도우에 윈도우 또는 컨트롤의 ID를 설정한다.
GetDescendantWindow : 모든 자식 윈도우를 검색하고 윈도우의 특징 ID를 반환한다.
GetParentFrame : CWnd 객체의 부모 프레임 윈도우를 얻는다.
SendMessageToDescendants : 윈도우의 모든 자식 윈도우에게 메시지를 보낸다.
GetToLevelParent : 윈도우의 최상위 부모를 얻는다.
GetToLevelOwner : 최상위 윈도우를 얻는다.
GetParentOwner : 자식 윈도우의 부모 윈도우에 대한 포인터를 반환한다.
GetTopLevelFrame : 윈도우의 촤상위 프레임 윈도우를 얻는다.
UpdateDialogControls : 대화상자의 버튼이나 다른 컨트롤들의 상태 갱신을 요구한다.
UpdateData : 대화상자의 데이터를 초기화하고 유효화한다.
CenterWindow : 부모 윈도우의 중앙에 윈도우를 위치시킨다. 


갱신/그리기 함수
BeginPaint : 드로잉 작업을 수행하기 위해서 CWnd를 준비한다.
EndPaint : 드로임 작업을 마친다.
Print : 특정 디바이스 컨텍스트에 현재 윈도우를 그린다.
PrintClient : 특정 디바이스 컨텍스트에 모든 윈도우를 그린다.
LockWindowUpdate : 정해진 윈도우에 드로잉을 불가능하도록 하거나 다시 가능하도록 한다.
GetDC : 클라이언트 영역에 표시된 디바이스 컨텍스트를 얻는다.
GetDCEx : 클라이언트 영역에 표시된 디바이스 컨텍스트를 얻고, 그리는 도중에 클리핑이 가능하도록 한다.
RedrawWindow : 클라이언트 영역에서 특정 사각형이나 특정 영역을 갱신한다.
GetWindowDC : 툴바나, 메뉴, 스크롤 바를 포함한 모든 윈도우 영역에 대한 디바이스 컨 텍스트를 얻는다.
ReleaseDC : 클라이언트와 윈도우 디바이스 컨택스트를 해제함으로써, 다른 애플리케이션 이 사용할 수 있도록 한다.
UpdateWindow : 클라이언트 영역을 갱신한다.
SetRedraw : CWnd가 변화된 것을 다시 그리도록 설정하거나, 다시 그릴 수 없도록 설정 하는 역할을 한다.
GetUpdateRect : CWnd의 갱신 영역을 완전히 둘러싸는 가장 작은 사각형의 좌표를 얻는다.
GetUpdateRgn : CWnd의 갱신 영역을 얻는다.
Invalidate : 모든 클라이언트 영역을 무효화한다.
InvalidateRect : 현재의 갱신 영역에 사각형을 추가함으로써 정해진 사각형 내의 클라이언 트 영역을 무효화한다.
InvalidateRgn : 현재의 갱신 영역에 영역을 추가함으로써 정해진 영역내의 클라이언트 영 역을 무효화한다.
VaildateRect : 현재의 갱신 영역에서 사각형을 제거함으로써 정해진 사각형 내의 클라이 언트 영역을 유효화시킨다.
VaildateRgn : 현재의 갱신 영역에 영역을 제거함으로써 정해진 영역 내의 클라이언트 영 역을 유효화시킨다.
ShowWindow : 윈도우를 보이도록 하거나 숨긴다.
IsWindowVisible : 윈도우가 보이는지를 알아낸다.
ShowOwnedPopups : 윈도우가 가지고 있는 모든 팝업 윈도우를 보이게 하거나 숨긴다.
EnableScrollBar : 스크롤 바의 화살표를 사용가능하도록 하거나 불가능하게 한다. 


좌표 매핑 관련 함수
MapWindowPoints : CWnd의 좌표계로부터 다른 윈도우의 좌표계로 지정된 점들을 매핑시 킨다.
ClientToSreen : 클라이언트 좌표계를 화면 좌표계로 변환한다.
ScreenToClient : 화면 좌표계를 클라이언트 좌표계로 변환한다. 


윈도우 텍스트 함수
SetWindowText : 윈도우의 텍스트나 캡션 제목을 지정된 텍스트로 설정한다.
GetWindowText : 윈도우의 텍스트나 캡션 제목을 반환한다.
GetWindowTextLength : 윈도우의 텍스트나 캡션 제목의 길이를 반환한다.
SetFont : 현재의 폰트를 설정한다.
GetFont : 현재의 폰트를 얻는다. 


스크롤 관련 함수
GetScrollPos : 스크롤 박스의 현재 위치를 얻는다.
GetScrollRange : 지정된 스크롤 바에 대한 최소, 최대의 스크롤 바 위치 값을 얻는다.
ScrollWindow : 클라이언트 영역의 내용을 스크롤한다.
ScrollWindowEx : 클라이언트 영역의 내용을 스크롤한다. (ScrollWindow과 비슷)
GetScrollInfo : 스크롤 바에 대한 SCROLLINFO 구조체 값을 얻는다.
GetScrollLimit : 스크롤 바의 한계 값을 얻는다.
SetScrollInfo : 스크롤 바에 대한 정보를 설정한다.
SetScrollPos : 스크롤 박스의 현재 위치를 설정하고, 설정이 되면, 새로운 위치를 나타내 도록 스크롤 바를 다시 그린다.
SetScrollRange : 지정된 스크롤 바에 대한 최소와 최대 위치 값을 지정한다.
ShowScrollBar : 스크롤 바를 보이거나 숨긴다.
EnableScrollBarCtrl : 스크롤 바의 컨트롤을 가능하게 하거나 불가능하도록 한다.
GetScrollBarCtrl : 스크롤 바 컨트롤을 반환한다.
RepositionBars : 클라이언트 영역에 컨트롤 바를 재위치 시킨다. 


드래그-드롭 함수
DragAcceptFiles : 윈도우가 드래그된 파일을 받아들일 것인지를 결정한다. 


Caret 관련 함수
CreateCaret : 시스템 캐럿으로 새로운 형태를 생성하고 캐럿의 소유권을 얻는다.
CreateSolidCaret : 시스템 캐럿으로 솔리드 캐럿을 생성하고 캐럿의 소유권을 얻는다.
CreateGrayCaret : 시스템 캐럿으로 회색 캐럿을 생성하고 캐럿의 소유권을 얻는다.
GetCaretPos : 특정 위치로 캐럿을 이동시킨다.
SetCaretPos : 화면에서 캐럿을 숨긴다.
HideCaret : 캐럿의 현재 위치에서 캐럿을 보이도록 한다.
ShowCaret : 캐럿의 현재 위치에서 캐럿을 보이도록 한다. 일단 캐럿이 화면에 나타나면 캐럿은 자동적으로 깜박거리게 된다. 


대화상자 아이템 관련 함수
CheckDlgButton : 버튼 컨트롤 다음에 체크 표시를 하거나 버튼 컨트롤에서 체크 표시를 제거한다.
CheckRadioButton : 특정 라디오 버튼을 체크하고, 특정 버튼 그룹 내에 있는 모든 다른 라디오 버튼에서 체크 표시를 제거한다.
GetCheckedRadioButton : 버튼 그룹에서 현재 체크된 라디오 버튼의 ID를 반환한다.
DlgDirList : 파일이나 디렉토리에 대한 리스트로 리스트 박스를 채운다.
DlgDirListComboBox : 파일이나 디렉토리에 대한 리스트 콤보 박스를 채운다.
DlgDirSelect : 리스트 박스에서 현재 선택된 항목을 얻는다.
DlgDirSelectComboBox : 콤보 박스에서 현재 선택된 항목을 얻는다.
GetDlgItemInt : 지정된 대화상자에서 컨트롤이 사용하는 텍스트를 정수 값으로 변환한다.
GetDlgItemText : 컨트롤과 관련된 캡션이나 텍스트를 얻는다.
GetNextDlgGroupItem : 컨트롤 그룹 내의 다음 또는 이전 컨트롤을 찾는다.
GetNextDlgTabItem : 특정 컨트롤의 다음 또는 이전 컨트롤 중에서 WS_TABSTOP속성을 가 지는 컨트롤을 얻는다.
IsDlgButtonChecked : 버튼 컨트롤이 체크되었는지를 결정한다.
IsDialogItemMessage : 지정된 메시지가 모달리스(modeless)대화상자를 위한 것인지를 알아 내고, 만약에 그렇다면 그것을 처리한다.
SendDigItemMessage : 특정 컨트롤에 메시지를 보낸다.
SendDigItemInt : 지정된 대화상자에서 컨트롤이 사용하는 텍스트를 정수 값에 해당하는 문 자열로 설정한다.
SendDigItemText : 지정된 대화상자에서 컨트롤의 캡션이나 텍스트를 설정한다.
SubclassDlgItem : CWnd 컨트롤에 윈도우 컨트롤을 추가하고 CWnd의 메시지 맵을 통해 메시지를 배정하도록 한다.
ExecuteDlgInit : 해당 대화상자의 리소스로 초기화한다.
RunModalLoop : 모달 상태에 있는 윈도우의 메시지를 검색하고, 번역하거나, 처리한다.
ContinueModal : 윈도우 모달 상태를 지속시킨다.
EndModalLoop : 윈도우 모달 상태를 마친다. 


메뉴 함수
GetaMenu : 특정 메뉴에 대한 포인터를 얻는다.
SetMenu : 현재의 메뉴를 지정된 메뉴로 설정한다.
DrawMenuBar : 메뉴 바를 다시 그린다.
GetSystemMenu : 애플리케이션이 컨트롤 메뉴를 복사하거사 수정하도록 참조하는 것을 허용한다.
HiliteMenuItem : 최상위 메뉴 아이템에서 선택된 부분을 하이라이트하거나 해제한다. 


툴팁 함수
EnableToolTips : 툴팁 컨트롤을 사용가능하도록 한다.
CancelToolTips : 툴팁 컨트롤을 사용 불가능하도록 한다.
FilterToolTipMessage : 대화상자에서 컨트롤과 관련된 제목이나 텍스트를 얻는다.
OnToolHitTest : 포인터가 특정 도구의 사각형 경계(보통 툴바 영역)안에 있는지를 알아내 고 그 도구에 대한 정보를 얻는다. 


타이머 관련 함수
SetTimer : 시작될 때 WM_TIMER 메시지를 보내는 시스템 타미머를 설치한다.
KillTimer : 타이머를 해제한다. 


경고 함수
FlashWindow : 윈도우를 한 번 반짝이게 한다.
MessageBox : 애플리케이션이 제공하는 캡션과 메시지를가지고 있는 윈도우를 생성하고 화면에 출력한다. 


윈도우 메시지 관련 함수
GetCurrentMessage : 윈도우가 현재 처리하고 있는 메시지의 포인터를 반환한다. OnMessage 류의 메시지 핸들러 멤버 함수 내부에서만 호출되어야한다.
Default : 디폴트 윈도우 프로시저를 호출하며, 이것은 애플리케이션에게 어떤 윈도우 메 시지도 디폴트 형태로 처리하도록 한다.
PreTranslateMessage : TranslateMessage와 DispatchMessage 윈도우 함수에서 처리되기 전 에 윈도우의 메시지를 필터링하기 위해서 CWinApp가 사용한다.
SendMessage : CWnd 객체에 메시지를 보내고 메시지를 처리할 때 까지 반환되지 않는다.
PostMessage : 애플리케이션 큐에 메시지를 위치시키고, 윈도우가 메시지를 처리할 때까 지 기다리지 않고 바로 반환한다.
SendNotifyMessage : 특정 메시지를 윈도우에 보내고 호출한 스래드가 윈도우를 생성했는 지에 따라서, 가능한 빨리 반환한다.


클립보드 관련 함수
ChangeClipboardChain : 클립보드 뷰어의 체인으로부터 CWnd를 제거한다.
SetClientboardViewer : 클립보드의 내용이 변하면 윈도우의 체인에 CWnd를 추가한다.
SetClipboard : 클립보드를 연다. 다른 애플리케이션이 윈도우의 CloseClipboard 함수를 호 출할 때까지 클립보드를 수정하지 않도록 한다.
GetClipboardOwner : 클립보드의 현재 소유자에 대한 포인터를 얻는다.
GetOpenClipboardWindow :현재 클립보드가 열려진 윈도우에 대한 포인터를 얻는다.
GetClipboardViewer : 클립보드 뷰어의 체인에서 처음 윈도우에 대한 포인터를 얻는다. 


OLE 콘트롤
SetProperty : OLE 컨트롤 프로퍼티를 설정한다.
OnAmbientProperty : 환경 프로퍼티 값을 구현한다.
GetControlUnknown : 알려지지 않은 OLE 컨트롤에 대한 포인터를 얻는다.
GetProperty : OLE 컨트롤 프로퍼티를 얻는다.
InvokeaHelper : OLE 컨트롤의 메소드나 프로퍼티를 호출한다. 


오버라이드 가능한 함수
WindowProc : CWnd에 대한 디폴트 프로시저를 제공한다. 디폴트로 메시지 맵을 통해서 메시지를 처리하게 된다.
DefWindowProc : 디폴트 윈도우 프로시저를 요구하며, 이것은 애플리케이션이 처리하지 않은 모든 윈도우 메시지에 대해서 디폴트 처리를 하도록 한다.
PostNcDestroy : 윈도우가 소멸된 후에 디폴트 OnNcDestroy 함수에 의해서 호출되는 가상 함수이다.
OnChildNotify : 컨트롤 통지 메시지를 처리하기 위한 기회를 컨트롤에게 주기 위해서 부 모 윈도우에 의해 호출된다.
DoDateExchange : 대화상자의 데이터 교환이나 유효화 검사를 위해서 UpdateData에 의해 서 호출된다. 


초기화 메시지 핸들러
OnInitMenu : 메뉴가 활성화될 때 호출된다.
OnInitMenuPopup : 팝업 메뉴가 활성화될 때 호출된다. 


시스템 메시지 핸들러
OnSysChar : 사용자가 컨트롤 문자로 변환하기 위해서 호출된다.
OnSysCommand : 사용자가 컨트롤 메뉴에서 항목을 선택하거나, 사용자가 최대화 또는 최 소화 버튼을 누를 때 호출된다.
OnSysDeadChar : 키 입력을 시스템의 Dead 문자((')등이 추가된 문자)로 변환할 때 호출 된다.
OnSysKeyDown : 사용자가 Alt 키를 누르고 다른 키를 누를 때 호출된다.
OnSysKeyUp : 사용자가 Alt 키를 누른 상태로 다른 키를 놓을 때 호출된다.
OnCompacting : 윈도우 시스템에서 시스템 메모리가 부족한 경우에 호출된다.
OnDevModeChange : 사용자가 디바이스의 모드 설정을 바꿀 때 최상위 윈도우가 호출된다.
OnFontChange : 폰트 리소스의 풀이 변할 때 호출된다.
OnPaletteChanged : 애플리케이션이 논리 팔레트를 적용할 것임을 다른 애플리케이션들에 게 알린다.
OnPaletteChanging : 윈도우가 논리 팔레트를 적용할 것임을 다른 애플리케이션들에게 알 린다.
OnSysColorChange : 시스템의 컬러 설정에 변화가 있을 때 최상위 윈도우가 호출한다.
OnWindowPosChanging : SetWindowPos나 다른 윈도우-관리 함수의 호출의 결과로 크기, 위치, 또는 Z-Order가 변하려 할 때 호출된다.
OnWindowPosChanged : SetWindowPos나 다른 윈도우-관리 함수의 호출의 결과로 크기, 위치, 또는 Z-Order가 변했을 때 호출된다.
OnDropFiles : 사용자가 드롭된 파일을 실행하기 위한 프로그램으로 등록된 윈도우 위에서 왼쪽 마우스 버튼을 놓을 때 호출된다.
OnSpoolerStatus : 프린트 관리자의 작업이 추가되거나 삭제될 때마다 프린트 관리자가 호출한다.
OnTimeChange : 시스템 시간 설정이 변경되면 최상위 윈도우가 호출한다.
OnWinIniChange : 윈도우의 초기화 파일인 WIN.INI가 변경되면 최상위 윈도우가 호출한다. 


일반 메시지 핸들러
OnCommand : 사용자가 명령을 선택할 때 호출된다.
OnActivate : CWnd가 활성화되거나 비활성화될 때 호출된다.
OnActivateApp : 애플리케이션이 활성화되려고 하거나 비활성화되려고 하는 경우에 호출 된다.
OnCancelMode : CWnd가 마우스 캡쳐와 같은, 어떤 내부적인 모드를 취소하는 것을 허용 하기 위해서 호출된다.
OnChildActivate : MDI의 자식 윈도우에서 CWnd의 크기나 위치가 변경되거나 CWnd가 활 성화될 때 호출된다.
OnClose : CWnd이 종료되는 신호로서 호출된다.
OnCreat : 윈도우 생성의 일부분으로서 호출된다.
OnCtlColor : 컨트롤이 그려지려 할 때 CWnd가 컨트롤의 부모 윈도우이면 호출된다.
OnDestroy : CWnd가 소멸될 때 호출된다
OnEnable : CWnd가 사용 가능하거나 불가능할 때 호출된다.
OnEndSession : 세션이 종료될 때 호출된다.
OnEnterIdle : 모달 대화상자나 메뉴가 유휴(idle)상태에 들어갈 때 애플리케이션의 메인 윈 도우 프로시저에서 호출된다.
OnEraseBkgnd : 윈도우의 바탕이 지워져야 할 때 호출된다.
OnGetMinMaxInfo : 윈도우가 최대화된 위치나 크기, 또는 최소 또는 최대 트랙킹 크기를 알아야 할 때마다 호출된다.
OnIconEraseBkgnnd : CWnd가 최소화되거나 아이콘이 그려지기 전에 아이콘의 배경을 채 워야 하는 경우에 호출된다.
OnKillFocus : CWnd가 입력포커스를 잃기 전에 호출된다.
OnMenuChar : 사용자가 현재 메뉴에서 이미 정의된 코드와 대응이 안되는 문자를 눌렀을 때 호출된다.
OnMenuSelect : 사용자가 메뉴 아이템을 선택할 때 호출된다.
OnMove : CWnd의 위치가 변경된 후에 호출된다.
OnMoving : 사용자가 CWnd 객체를 이동하고 있음을 나타낸다.
OnDeviceChange : 디바이스나 컴퓨터의 하드웨어 설정이 변경되었음을 알려준다.
OnStyleChanged : ::SetWindowLong 윈도우 함수를 사용하여 하나나 혹은 그 이상의 윈도우 의 스타일이 변했음을 알려준다.
OnStyleChanging : ::SetWindowLong 윈도우 함수를 사용하여 하나나 혹은 그 이상의 윈도 우의 스타일이 변하려 하는 것을 알려준다.
OnPaint : 윈도우의 일부분을 다시 그리기 위해서 호출된다.
OnParentNotify : 자식 윈도우가 생성되거나 소멸될 때, 또는 커서가 자식 윈도우 위에 있 는 동안 마우스 버튼을 클릭하는 경우에 호출된다.
OnQueryDragIcon : 최소화된 CWnd가 사용자에 의해서 드래그될 때 호출된다.
OnQueryEndSession : 사용자가 윈도우의 세션 종료를 선택하는 경우에 호출된다.
OnQueryNewPalette : CWnd가 입력 포커스를 받게됨을 알려준다.
OnQueryOpen : CWnd가 아이콘이거나 사용자가 아이콘이 열려지지기를 요구할 때 호출된다.
OnSetFocus : CWnd가 입력 포커스를 얻은 후에 호출된다.
OnShowWindow : CWnd가 감추어지거나 혹은 보여질 때 호출된다.
OnSize : CWnd의 크기가 변한 후에 호출된다.
OnSizing : 사용자가 사각형의 크기를 다시 조정하고 있음을 나타낸다.
OnStyleChanged : 윈도우의 하나나 혹은 그 이상의 스타일이 변한 것을 나타낸다.
OnStyleChanging : 윈도우의 하나나 혹은 그 이상의 스타일이 변하려 하는 것을 나타낸다. 


컨트롤 메시지 핸들러
OnCharToItem : LBS_WANTKEYBOARDINPUT 스타일을 가지고 있는 리스트 박스에 의해서 WM_CHAR에 대한 응답으로 호출된다.
OnCompareItem : 정렬이 가능한 owner draw 형태의 콤보 박스나 리스트 박스에서 새로운 아이템의 상대 위치를 지정하기 위해서 호출된다.
OnDeleteItem : owner draw 형태의 리스트 박스나 콤보 박스가 소멸되거나 아이템이 컨트 롤에서 제거될 때 호출된다.
OnDrawItem : owner draw 형태의 버튼 컨트롤, 콤보 박스 컨트롤, 리스트 박스 컨트롤이 다시 그려져야 할 때 호출된다.
OnGetDlgCode : 컨트롤이 화살표 키와 Tab 키에 대한 입력을 수행할 수 있도록 하기 위 해서 호출된다.
OnMeasureItem : 컨트롤이 생성될 때 owner draw 형태의 콤보 박스, 리스트 박스, 또는 메뉴 아이템을 요구한다. CWnd는 윈도우에게 컨트롤의 크기를 알려준다.
SendChildNotifyLastMsg : 부모 윈도우가 자식 윈도우에게 통보 메시지를 제공하여 자식 윈도우가 작업을 수행할 수 있도록 한다.
OnWndMsg : 윈도우의 메시지가 핸들링되고 있는 것을 나타낸다.
ReflectLastMsg : 자식 윈도우의 마지막 메시지를 나타낸다.
OnVKeyToItem : WM_KEYDOWN 메시지에 대하여 CWnd가 소유한 리스트 박스가 호출된다. 


입력 메시지 핸들러
OnChar : 키 입력이 시스템 문자가 아닌 문자로 변환될 때 호출된다.
OnDeadChar : 키 입력이 시스템 문자가 아닌 Dead 문자로 변환될 때 호출된다.
OnHSroll : 사용자가 CWnd의 수평 스크롤 바를 클릭하는 경우에 호출된다.
OnKeyDown : 시스템 키가 아닌 키보드가 눌러 졌을 때 호출된다.
OnKeyUp : 시스템 키가 아닌 키보드가 놓을 때 호출된다.
OnLButtonDblClk : 사용자가 왼쪽 버튼을 더블 클릭 했을 때 호출된다.
OnLButtonDown : 사용자가 왼쪽 버튼을 눌렀을 때 호출된다.
OnLButtonUp : 사용자가 왼쪽 버튼을 놓을 때 호출된다.
OnMButtonDblClk : 사용자가 가운데 버튼을 더블 클릭 했을 때 호출된다.
OnMButtonDown : 사용자가 가운데 버튼을 눌렀을 때 호출된다.
OnMButtonUp : 사용자가 가운데 버튼을 놓을 때 호출된다.
OnMouseActivate : 커서가 비활성화된 윈도우에 있고 사용자가 마우스 버튼을 누를 때 호출된다.
OnMouseMove : 마우스커서가 움직일 때 호출된다.
OnRButtonDblClk : 사용자가 오른쪽 버튼을 더블 클릭 했을 때 호출된다.
OnRButtonDown : 사용자가 오른쪽 버튼을 눌렀을 때 호출된다.
OnRButtonUp : 사용자가 오른쪽 버튼을 놓을 때 호출된다.
OnSetCuror : 마우스 입력이 캡쳐되지 않고 마우스가 윈도우에서 커서를 움직이게 하려면 호출된다.
OnTimer : SetTimer에서 정해진 간격마다 호출된다.
OnVScroll : 사용자가 윈도우의 수직 스크롤 바를 클릭할 때 호출된다.
OnCaptureChanged : 마우스 캡쳐를 놓치는 윈도우 메시지를 보낸다. 


비 클라이언트 영역 메시지 핸들러
OnNcActivate : 비 클라이언트 영역이 활성화된 상태인지 비활성화된 상태인지를 가리키 기 위해서 변환이 필요한 경우 호출된다.
OnNcCalcSize : 비 클라이언트 영역의 크기와 위치가 계산될 때 호출된다.
OnNcCreate : 비 클라이언트 영역이 생성될 때 OnCreate 보다 먼저 호출된다.
OnNcDestroy : 비 클라이언트 영역이 소멸될 때 호출된다.
OnNcHitTest : CWnd가 커서를 포함하고 SetCapture로 마우스 입력을 캡쳐할 때 마우스가 움직일 때 마다 윈도우에 의해서 호출된다.
OnNcLButtonDblClk : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 왼쪽 마우스 버튼을 더블 클릭 했을 때 호출된다.
OnNcLButtonDown : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 왼쪽 마우스 버튼을 눌렀을 때 호출된다.
OnNcLButtonUp : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 왼쪽 마우스 버튼을 놓을 때 호출된다.
OnNcMButtonDblClk : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 가운데 마우스 버튼을 더블 클릭 했을 때 호출된다.
OnNcMButtonDown : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 가운데 마우스 버튼을 눌렀을 때 호출된다.
OnNcMButtonUp : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 가운데 마우스 버튼을 놓을 때 호출된다.
OnNcMouseMove : 커서가 CWnd의 비 클라이언트 영역 내에서 이동할 때 호출된다.
OnNcPaint : 비클라이언트 영역이 다시 그려지기를 요구할 때 호출된다.
OnNcRButtonDblClk : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 오른쪽 마우스 버튼을 더블 클릭 했을 때 호출된다.
OnNcRButtonDown : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 오른쪽 마우스 버튼을 눌렀을 때 호출된다.
OnNcRButtonUp : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 오른쪽 마 우스 버튼을 놓을 때 호출된다. 


MDI 메시지 핸들러
OnMDIActivate : MDI child 윈도우가 활성화되거나 비활성화될 때 호출된다. 


클립보드 메시지 핸들러
OnAskCbFormatName : 클립보드의 소유자가 클립보드의 내용을 나타낼 때 클립보드 뷰어 애플리케이션에 의해서 호출된다.
OnChangeCbChain : 특정 윈도우가 체인에서 제거되었는지를 통지한다.
OnDestroyClipboard : 클립보드가 윈도우 EmptyClipboard 함수의 호출에 의해서 비워지는 경우에 호출된다.
OnDrawClipboard : 문장이 변경되었을 때 호출된다.
OnHScrollClipboard : 클립보드의 소유주가 클립보드의 이미지를 스크롤해야 하고 적절한 섹션을 무효화할 때 호출되며, 스크롤 바의 값들을 갱신한다.
OnPaintClipboard : 클립보드 뷰어의 클라이언트 영역이 다시 그려져야 할 때 호출된다.
OnRenderAllForamts : 소유주 애플리케이션이 파괴되고 있고 모든 포맷들을 다시 만들 필 요가 있을 때 호출된다.
OnSizeClipboard : 클립보드 뷰어 윈도우의 클라이언트 영역의 크기가 변하는 경우에 호출 된다.
OnVSrollClipboard : 소유주가 크립보드 이미지 스크롤해야 하는 경우에 호출되며, 적절한 섹션을 무효화하고, 스크롤바 값들을 갱신한다. 


메뉴 루프 통지
OnEnterMenuLoop : 메뉴의 모달 루프가 수행되는 경우에 호출된다.
OnExitMenuLoop : 메뉴의 모달 루프가 마치는 경우에 호출된다. 
 
 
반응형
BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase); 
▶hWnd:무효 영역을 설정할 윈도우의 핸들. NULL일 경우 모든 윈도우를 무효화한다.
▶lpRect:무효화할 영역. NULL이면 작업 영역 전체가 무효화된다.
▶bErase:무효 영역의 배경을 먼저 지울 것인가를 지정한다. TRUE이면 BeginPaint 함수가 배경을 먼저 지운 후 작업 영역을 그린다.

설명:WM_PAINT를 직접 호출하지는 않지만 특정 영역을 무효화하여 시스템이 WM_PAINT를 호출
시스템은 무효화 영역을 캐취하면 WM_PAINT를 호출한다. 직접 호출하지 않으니
시스템이 message queue에 있는 다른 메세지를 처리 후 WM_PAINT를 호출하므로 딜레이 발생.
참고: http://www.winapi.co.kr/reference/Function/InvalidateRect.htm

BOOL UpdateWindow(HWND hWnd);
▶ hWnd : 윈도우 핸들
윈도우 프로시저로 WM_PAINT 메시지를 보내 작업영역을 강제로 그리도록 한다.
다른 어떤 메시지보다 WM_PAINT를 먼저 처리해야 할 경우 이 함수를 호출하여 즉시 처리.
(메시지 큐를 통하지 않고 호출하므로 적용이 빠르다.)
작업영역을 완전히 다시 즉시 그리려면 InvalidateRect함수로 작업영역 무효화 후 이 함수 호출
참고: http://www.winapi.co.kr/reference/Function/UpdateWindow.htm
반응형

<출처: http://rayfeel.co.kr/63 >

※ 인덱스란?
  인덱스는 테이블이나 클러스트에서 쓰여지는 선택적인 객체로서, 오라클 데이터베이스 테이블내의
원하는 레코드를 빠르게 찾아갈 수 있도록 만들어진 데이터 구조
입니다.  

자동 인덱스 : 프라이머리 키 또는 uinque 제한 규칙에 의해 자동적으로 생성되는 인덱스 입니다.
수동 인덱스 : CREATE INDEX 명령을 실행해서 만드는 인덱스들 입니다.  

※  Index를 생성하는 것이 좋은 Column
① WHERE절이나 join조건 안에서 자주 사용되는 컬럼
② null 값이 많이 포함되어 있는 컬럼
③ WHERE절이나 join조건에서 자주 사용되는 두 개이상의 컬럼들
※  다음과 같은 경우에는 index 생성이 불필요 합니다.

① table이 작을 때
③ 테이블이 자주 갱신될 때

※  오라클 인덱스는 B-tree(binary search tree)에 대한 원리를 기반으로 하고 있습니다.
B-tree인덱스는 컬럼안에 독특한 데이터가 많을 때 가장 좋은 효과를 냅니다.
이 알고리즘 원리는
 ① 주어진 값을 리스트의 중간점에 있는 값과 비교합니다.     
     만약 그 값이 더 크면 리스트의 아래쪽 반을 버립니다.
     만약 그 값이 더 작다면 위쪽 반을 버립니다.
 ② 하나의 값이 발견될 때 까지 또는 리스트가 끝날 때까지 그와 같은 작업을 다른 반쪽에도
     반복합니다.

※  인덱스는 B-tree 구조를 가지며 크게 다음 네 가지로 분류될수 있습니다.
Bitmap 인덱스
  비트맵 인덱스는 각 컬럼에 대해 적은 개수의 독특한 값이 있을 경우에 가장 잘 작동합니다.
  그러므로 비트맵 인덱스는 B-tree 인덱스가 사용되지 않을 경우에서 성능을 향상 시킵니다.
  테이블이 매우 크거나 수정/변경이 잘 일어나지 않는 경우에 사용할수 있습니다.

SQL>CREATE BITMAP INDEX emp_deptno_indx
ON emp(deptno);

Unique 인덱스
  Unique 인덱스는 인덱스를 사용한 컬럼의 중복값들을 포함하지 않고 사용할 수 있는 장점이 있습니다.
프라이머리키 와 Unique 제약 조건시 생성되는 인덱스는 Unique 인덱스입니다.

SQL>CREATE UNIQUE INDEX emp_ename_indx
ON  emp(ename);

③ Non-Unique 인덱스
   Non-Unique 인덱스는 인덱스를 사용한 컬럼에 중복 데이터 값을 가질수 있습니다.

SQL>CREATE INDEX  dept_dname_indx
ON  dept(dname);

④ 결합 (Concatenated(=Composite)) 인덱스
   복수개의 컬럼에 생성할 수 있으며 복수키 인덱스가 가질수 있는 최대 컬럼값은 16개입니다

SQL>CREATE UNIQUE INDEX emp_empno_ename_indx
ON  emp(empno, ename);

※  인덱스의 삭제
 - 인덱스의 구조는 테이블과 독립적이므로 인덱스의 삭제는 테이블의 데이터에는 아무런 영향도 미치지
않습니다.
 - 인덱스를 삭제하려면 INDEX의 소유자이거나 DROP ANY INDEX권한을 가지고 있어야 합니다.
 - INDEX는 ALTER를 할 수 없습니다.
SQL>DROP INDEX emp_empno_ename_indx ;

※  인덱스에 대한 정보는 USER_INDEXES 뷰 또는 USER_IND_COLUMNS뷰를 통해 검색할 수
      있습니다.


반응형


포스팅에서 많이 언급했던 "인간 존재의 흥미로움"이란 글이 수록된 책이라고 한다.
그 문구를 읽었을때 가슴으로 동화하고 머리로써 많은 사색에 잠겼었다.
파울로 코엘료의 대표작이라고 할 수 있는 "연금술사"를 읽고 이 책을 꼭 읽어보고 싶어졌다.
그전에도 관심을 갖고 있었지만 코엘료의 책을 읽고 보니 더욱 읽어보고 싶은 맘이 들었다.

- 흐르는 강물처럼 中 -
 한 남자가 내 친구 제이미 코인에게 물었다.
"사람의 가장 우스운 점은 뭐라고 생각하십니까?"
코인이 대답했다.
"모순이죠. 어렸을 땐 어른이 되고 싶어 안달하다가도,
막상 어른이 되어서는 잃어버린 유년을 그리워해요.
돈을 버느라 건강 따위는 안중에도 없다가도,
훗날 건강을 되찾는데 전 재산을 투자합니다.
미래에 골몰하느라 현재를 소홀히 하다가,
결국에는 현재도 미래도 놓쳐버리고요.
영원히 죽지 않을 듯 살다가 살아보지도 못한 것처럼 죽어가죠."

// 2009.12.09  그냥 심란한 마음에 질러버렸다...^^

//2010.03.10
파울로 코엘료 책을 읽을 때마다 참 많은 것을 느끼게 해주는 것 같다.
그리고 많은 것들을 생각하게 하기도 한다. 그리고 자신의 상황에 빗대어 보고
자기가 생각하고자 하는 대로 해석을 하는 것 같기도 하다. 나의 경우에는 그러했다.
어느새 30대를 향하는 나에게 꿈과 현실사이의 기로에서 회피하던 나의 경우는 그러했다.
나를 되돌아 보고 내가 생각하고 싶은대로 의 하나의 꺼리가 되도록 해석해 나가는 것이다.
물론 작가의 의도 또한 그러할지도 모르겠다. 코엘료의 책은 가슴에 담을 이야기들이 많은것 같다.
책의 내용을 기억하기 보다 그 짧은 글 들이 이야기 하는 것들을 담는 것이다.
특히 "흐르는 강물처럼"은 흐르는 강물에 자신을 비추어 본다는 느낌으로 읽어 볼만한 책이다.
그리고 책 표지가 무엇보다 마음에 든다.. 나와 같은 생각을 갖는 사람이 있을것이라 생각해 본다.^^
반응형

해보지 않으면 아무것도 얻을 수 없다

1 내 입맛에 맞는 인생을 찾아라
2 특별히 금지되지 않은 건 허용된 것이다
3 틀린 것보다 맞는 것을 먼저 본다
4 완벽하게 늦기보다 불완전하게 시작하는 게 낫다
5 행동할 땐 생각을 버려라
6 행복은 목적이 수단을 정당화할 때 온다
7 주는 만큼 받는다
8 핑계로는 앞으로 나아가지 못한다
9 운명은 내가 내린 선택에서 시작된다
10 성공은 머릿속에서 시작된다
11 믿는 자만이 변할 수 있다
12 산을 옮기는 것은 행동이다

기회는 지금, 바로 여기에 있다!

예전에 위 책에 내용을 인용한 적이 있다. "현명한 베아테와 같은 사람을 만나고 싶다"는...
갑자기 베아테란 인물이 궁금해서 검색을 해보았다.. 이 책을 찾을 수 있었다.
지금 나에게 필요한 책이 아닐까 하는 생각이 들었다. 그리고 찜!!! 구매 예정 목록으로..
태그를 달던중 "샐리의 법칙"이 생각났다. 나에게 샐리의 법칙을 가슴에 담으라던 한 친구..

반응형

지인의 추천으로 구매하게 된 책이다.
이외수님의 "청춘불패"도 꽤 많이 알려져 있지만 우선 글쓰기에 관심이 생겨서
글쓰기의 공중부양이라는 책을 구매하게 되었다.
이전에 구매해서 현재 읽고 있는 쇼펜하우어의 책은 "사색"이라는 것에 중점을 두고
많은 부분에서 도움이 되고 흥미롭게 읽고 있다. 후반부는 쫌 ^^;;; 이지만... ㅎㅎ
대여를 해서 볼까 아님 구매를 할까 고민하다 꽤 많은 할인을 받고 구매한책..
내용이 알차고 소장 가치가 있을만한 책이였으면 좋겠다. ㅋㅋ

//2009.12.31
올 한해가 벌써 저물어 가고 있다. 앞으로 30분 그리고 나는 지금 회사에....
일년이란 시간동안을 이맘때쯤마다 되돌아 보면 참 후회가 많이 남는거 같다.
그리고 그 긴 시간동안 나는 무엇을 이루어 왔나 생각하고 또 새로운 일년을 맞이한다.
하지만 많은 후회를 지나가는 세월에 남겨두기 보다는 내가 이룬 것들을 다시 되새기며
더 높은 목표를 세우고 "내 남자의 길"에 더 멀리 발걸음을 내딪어 본다.
올 한해 계획 했던 것중 보람을 느끼는 것은 책 읽기가 아닌가 싶다.
무작정 읽어보자고 시작했던 것이 "문장론"이란 책을 읽음으로 통해 사색으로의 길로 들어섰고
내 머릿속에 조각이 되어 뿔뿔히 흩어져있는 것들을 사색을 통해 맞추어 진다.
올해의 쾌거는 이것이 아닐까 싶다. 그리고 많은 세미나와 컨퍼런스의 참석등...
마지막으로 나의 블로그가 어느정도 자신의 색깔을 찾아 자리를 잡는게 아닐까 싶다.
새해에도 "내 남자의 길~!!"이다~ 가자.. 세상을 향한 펀치를 날려라~~~

//2010.02.08
한해가 시작된지 벌써 한달이 지났다. 그리고 새로운 일터로 옮긴지도 오늘로 3개월이다.
여러가지 출퇴근 시간이라던가 교통여건등 많은 시간적 여유가 주어졌지만.. 예전에 비해
많이 나태해진 내 모습에 자신감을 잃어 가고 있다. 새로운 환경에서으 적응 그리고 스트레스
주어진 시간만큼의 시간 활용은 예전보다 나아지기는 커녕 퇴보하고 있는듯 하다.
꽤 오랜시간 동안 읽어왔고 겨우 끝장 페이지를 넘기긴 했지만 무슨 내용인지...
아마도 오랜시간 동안 질질 끌며 한장 읽고 이틀 덮고 한장 읽고 삼일 덮어놓고..
딱히 책 내용이 나쁜것은 아니다.. 그저 나에게 필요한 책은 아니였든듯 싶다..
진짜 글쓰기에 관심이 있고 그 내용대로 시간을 할애할 글을 쓰는 분들을 위한 책인듯..
책도 그 주인을 잘 만나야 그 가치를 인정받는 것이구나 하는 생각이 들었다..
그저 읽어보았다는 아무 가치 없는 만족감을 느끼며 마지막 장을 덮고서 다른 책을 한권 집어들었다.
예전부터 읽고 싶었던 "흐르는 강물처럼"  파울로 코엘료
책을 읽을때 단순한 글 읽기를 탈피해 진정한 사색을 탐닉할수 있는 소양이 내게도 생기기를..

+ Recent posts