무엇이 우리의 성과를 방해하는가

무엇이 우리의 성과를 방해하는가

토니 슈워츠 등저 / 박세연

이제 직장인에게 필요한 것은 ‘당근과 채찍’이 아니다!
매슬로 욕구이론을 성과창출 이론에 도입한 혁신적 경영해법

‘에너지 프로젝트energy project’의 CEO이자, 리더십 컨설턴트인 저자 토니 슈워츠는 기업의 경영자와 관리자로부터 “어떻게 해야 직원들로부터 열정을 끌어내 성과를 낼 수 있을까요?”라는 질문을 종종 받는다고 한다. 보통의 경영 컨설턴트라면 “금전적 보상을 자주 하라.” “건설적인 경쟁을 시켜라.” “운동시설 설치, 의무휴가 제도 확립 등 복리후생을 강화하라.” 등의 해법을 내놓을 것...




저자 : 토니 슈워츠

목차
들어가며
PART1 일과 휴식에 관한 이분법적 사고의 한계
    에너지 점검에서 시작하기
    지금까지의 업무방식에서 벗어나라
PART2 오래 일하는 사람이 성과를 낼 확률이 높다?
    휴식과 재충전에 대한 욕구
    월화수목금금금, 평평해진 신체리듬
    안 자면 죽는다 
    에너지 리듬에 맞춰 일하기
    운동을 하면 업무능력이 향상된다
    신체리듬을 망가뜨리는 직장인들의 식습관
    근무시간 평가시스템의 위험한 함정
PART3 어쨌거나 경쟁만이 성과를 가져온다?
    인정과 관계에 대한 욕구
    감정 상태가 성과를 좌우한다
    강력한 성과는 최고의 동료가 있을 때 나온다
    리더의 진심어린 인정과 격려의 효과
PART4 멀티태스킹은 이 시대에 꼭 필요한 자질이다?
    몰입에 대한 욕구
    업무량이 아니라 업무방식이 문제다
    몰입을 방해하는 요인 없애기 
    우뇌 개발을 통한 집중력 높이기
    부하직원에게 이어폰을 허하라
PART5 가장 확실한 동기부여는 금전적 보상이다?
    일의 가치에 대한 욕구
    성공과 가치, 두 마리 토끼를 잡는 법
    열정은 어디에서 오는가


사촌누나한테 빌려서 본 책인데요
제목 밑의 블랙박스 안에 "야근, 특근... 업무시간은 느는데 왜 성과는 줄어들까?" 라고 써있습니다.
제목과 더불어 굉장히 끌리는 문구입니다.

PART1 일과 휴식에 관한 이분법적 사고의 한계
성과를 내려면 휴식을 줄이고 업무시간을 늘려야 된다는 생각은 우리 마음 속에 깊이 박혀있는것 같습니다.
이 책에서도 여러 외쿡인들을 소개하며 그들의 휴식 없는 삶을 얘기합니다.
1장에선 이러한 인간의 의지력의 한계를 넘어서는 방식은 바뀌어야 하며 여러가지 습관형성을 제시하며 효율적인 업무방식을 말합니다.

PART2 오래 일하는 사람이 성과를 낼 확률이 높다?
"월화수목금금금" 과연 효과가 있을까요?
신체리듬이 깨지면 업무효율도 줄어들며 신체에너지를 관리해야 한다고 얘기합니다.

휴식을 통해 재충전의 시간이 필요하며
재충전은,
적당한 수면시간 - 7~9시간, 잠이 부족하면 업무효율 하락, 자면서도 뇌는 학습
에너지 리듬에 맟춰 일하기 - 업무 중간의 휴식 필요, 낮잠의 효과, 휴가의 효과
규칙적인 운동 - 운동이 업무효율을 높인다
식습관 - 아침 안 먹고 다른 식사 폭식->신체리듬 망가짐.
을 통해 이루어진다고 합니다.

PART3 어쨌거나 경쟁만이 성과를 가져온다?
최근 오픈소스의 상승세를 봐도 알 수 있듯이 협력이 더 좋은 성과를 냅니다.
경쟁을 유도하는 분위기는 오히려 업무효율을 떨어뜨립니다.
책에서는 진정한 리더를 '최고 에너지 관리자'라고 표현하며 리더의 핵심 과제는
직원들의 에너지를 결집하고, 자극하고, 재충전함으로써 최고의 능력을 이끌어내는 일이라고 합니다.
이러한 리더와 경쟁이 아닌 협력하는 동료가 있을 때 강력한 성과가 나옵니다.

PART4 멀티태스킹은 이 시대에 꼭 필요한 자질이다?
앞에서 업무시간이 많다고 해서 성과가 높지 않다 했습니다.
중요한 것은 집중력입니다. 출근해서 8시간 동안 모니터 앞에 앉아있었지만 하루종일 뭐 했는지 모르는 날이 있진 않습니까?
멀티태스킹은 오히려 업무효율을 떨어뜨립니다. 컴퓨터도 동시에 일을 하는 것이 아니라 빠르게 프로세스를 넘나드는 것이며
이는 context switching을 동반하며 오버헤드가 발생합니다. 인간도 마찬가지로 여러 일을 한 번에 하는 것은 부담입니다.
우선순위를 정하여 일에 임하는 것이 중요합니다.
또한 몰입을 방해하는 요소를 없애는 것이 중요하다 합니다.
소니 유럽의 인사팀 부사장인 로이 화이트는 조직의 업무효율성과 창조적인 능력을 심각하게 위축시키고 있는 두 가지 요인으로,
이메일과 회의를 꼽았습니다.
수많은 이메일 중 업무진행에 꼭 필요한 것이 그렇게 많지 않은데 이를 읽고 답장하는데 시간이 낭비되며
자신의 업무와 별로 상관없는 수많은 회의에 참석하느라 에너지를 소비한다고 말합니다.
파티션으로 분리된 환경도 꼬집었는데요, 사실 파티션은 '분리된'공간을 제공하지 않습니다.
별도의 공간으로 분리된 환경이 업무효율이 높으며, 오히려 파티션 없이 완전이 오픈된 환경보다도 업무효율이 낮다는 연구결과가 있습니다.
집중력 향상을 위해 개인적/조직적으로 해야 할 일을 제시하고 있으며, 직원의 자율권을 높이는 것을 권장하고 있습니다.
소니 영국의 인사 책임자 휴 에반스는
"어떤 직원이 하고 있는 일을 상사가 모조리 다 알고 있다면, 그 직원은 물론 상사 또한 제 역할을 못하고 있는 것입니다."라고 합니다.
자율근무제도 이러한 차원에서 소개하고 있습니다.

PART5 가장 확실한 동기부여는 금전적 보상이다?
단지 돈을 벌기 해위 일을 한다는 것은 참으로 슬픈 일입니다.
이러한 마음가짐으로 임한다면 삶의 만족도는 높지 않을것입니다.
클리블랜드 클리닉 중환자실 간호사들은 업무 강도가 일에 만족하며 일에 대한 열정을 잃지 않고 있었습니다.
반면 외과의사들은 상대적으로 환경과 대우가 좋은데도 불구하고 만족도가 낮았습니다.
간호사들은 환자들과 교감하며 그들을 치료하는 과정에서 자신들이 중요한 일을 한다는 믿음을 얻고 에너지가 충전되지만
외과의사들은 대부분 수술실에서 마취되어 의식없는 환자들을 만나기 때문에 그렇지 못했습니다.
책에서는 리더가 중요한 역할을 해야된다고 합니다.
구성원들에게 가치와 목표를 분명히 제시하여 인도하는 관리자가 되야한다는거죠.
구성원들은 그 가치와 목표를 바라보며 일에 대한 열정을 불태우지 않을까요? 


갑의 제정신이 아닌것 같은 요구들을을 들어주다보면 야근, 특근은 어쩔 수 없이 하게되는거 같습니다.

리더가 지혜롭게 갑의 요구사항에 대해 들어줄건 들어주고 쳐내야될건 쳐내고 하면 좋을텐데요

제가 리더가 아니라서 잘은 모르겠네요...





MFC 컴파일 시에 아래와 같은 에러가 발생할 때가 있다.


"fatal error C1010: 미리 컴파일된 헤더를 찾는 동안 예기치 않은 파일의 끝이 나타났습니다. '#include "stdafx.h"'을(를) 소스에 추가하시겠습니까?"


Precompiled Header 때문에 발생하는 에러이다.

자세한 내용 및 해결 방안은 아래 링크 참조


http://myblue0324.tistory.com/55

  1. 화면 그리기의 구조
    1. CWnd::RedrawWindow()
      - WM_PAINT 메시지를 발생시켜 윈도우를 다시 그리도록 한다.
    2. 윈도우의 크기를 변경하여 빠른 속도로 윈도우가 다시 그려지도록 하면 화면이 깜빡이거나 현상 발생
    3. WM_ERASEBKGND 메시지
      - WM_PAINT 메시지와 더불어 윈도우를 다시 그릴 때 발생
      - WM_ERASEBKGND 메시지 핸들러 함수는 윈도우의 배경을 그리는 코드 수행
      - 클라이언트 영역을 다시 그릴 때 WM_PAINT 메시지에 앞서 WM_ERASEBKGND 메시지 발생
        (비클라이언트 영역을 다시 그리는 메시지는 WM_NCPAINT)
      - 윈도우가 깜빡이는 주요 원인 중 하나
      - WM_ERASEBKGND 메시지 핸들러 함수를 등록하여 상위 클래스의 멤버를 호출하지 않도록 하면 깜박임이 줄어듬
    4. BOOL CRedrawDemoView::OnEraseBkgnd(CDC* pDC) 
      {
          return TRUE;
          // return CView::OnEraseBkgnd(pDC);
      }
      

    - 위 기법과 더블 버퍼링을 함께 사용하면 깜빡임이 전혀 없는 인터페이스를 구현 가능

  2. 눈속임의 미학
    1. 클라이언트 뷰의 자식 윈도우로 있는 윈도우가 배경을 그릴 때(WM_ERASEBKGND 메시지가 발생했을 때) 자신의 부모 윈도우의 OnEraseBkgnd() 메시지 핸들러 함수를 명시적으로 호출하여 배경 이미지 획득 후 이미지 출력하여 투명해 보이는 효과 얻음
    2. 클라이언트 뷰의 OnEraseBkgnd() 함수
      - 전달받은 DC에 이미지를 로드하여 출력
    3. BOOL CTransparentDemoView::OnEraseBkgnd(CDC* pDC)
      {
      	CRect Rect;
      	GetClientRect(&Rect);
      	pDC->FillSolidRect(&Rect, RGB(255, 255, 255));
      
      	CImage ImageBackground;
      	ImageBackground.LoadFromResource(AfxGetInstanceHandle(), IDB_Background);
      	ImageBackground.BitBlt(pDC->m_hDC, 0, 0);
      
      	return TRUE;
      //	return CView::OnEraseBkgnd(pDC);
      }
    4. 클라이언트 뷰의 자식 윈도우의 OnEraseBkgnd() 함수
      - 메모리 DC에 부모 윈도우의 배경을 획득 후 자식 윈도우에 출력
    5. BOOL CTransparentWnd::OnEraseBkgnd(CDC* pDC)
      {
      	// 자식 윈도우의 왼쪽 위가 부모 윈도우 기준으로 어딘지 좌표 계산
      	CRect Rect, ParentRect;
      	GetClientRect(&Rect);
      	GetParent()->GetClientRect(&ParentRect);
      
      	CPoint ptLeftTop = CPoint(0, 0);
      	ClientToScreen(&ptLeftTop);
      	GetParent()->ScreenToClient(&ptLeftTop);
      
      	// 메모리 DC에 적절한 CBitmap 클래스 객체 생성하여 선택
      	CDC MemDC;
      	CBitmap Bmp;
      
      	MemDC.CreateCompatibleDC(NULL);
      	Bmp.CreateBitmap(ParentRect.Width(), ParentRect.Height(),
      						MemDC.GetDeviceCaps(PLANES),
      						MemDC.GetDeviceCaps(BITSPIXEL), NULL);
      	CBitmap* pOldBmp = MemDC.SelectObject(&Bmp);
      
      	// 메모리 DC의 핸들을 메시지 파라미터로 부모 윈도우에 WM_ERASEBKGND 메시지 송신
      	GetParent()->SendMessage(WM_ERASEBKGND, (WPARAM)MemDC.m_hDC);
      	pDC->BitBlt(0, 0, Rect.Width(), Rect.Height(),
      						&MemDC, ptLeftTop.x, ptLeftTop.y, SRCCOPY);
      
      	MemDC.SelectObject(pOldBmp);
      
      	return TRUE;
      //	return CWnd::OnEraseBkgnd(pDC);
      }
      
  3. 더블 버퍼링(Double Buffering)
    1. 윈도우의 깜빡임을 제거하는 최선의 방법
    2. 메모리 DC(버퍼 DC)에 모든 그리기 작업을 수행한 후, 메모리 DC의 내용을 화면 DC로 복사하는 기법
    3. 그리는 과정이 화면에 출력되지 않으므로 깜빡임이 사라짐
    4. CBufferDC 클래스
      - BufferDC.h
    5. class CBufferDC : public CDC  
      {
      
      private:
      	CBufferDC() { }
      	CBufferDC(const CBufferDC &src) { }
      	CBufferDC& operator=(const CBufferDC &src) { }
      
      protected:
      	BOOL Attach(HDC hDC);
      	HDC Detach();
      
      private:
      	CWnd*			m_pParent;						//대상 윈도우에 대한 포인터
      	CDC*			m_pTarget;						//대상 윈도우 DC에 대한 포인터
      	PAINTSTRUCT		m_PaintStruct;
      	CRect			m_RcClient, m_RcWindow;			//대상 윈도우의 크기 정보
      
      	CDC				m_MemoryDC;						//버퍼 DC
      	CBitmap			m_MemoryBmp, *m_pOldMemoryBmp;	//버퍼링을 위한 비트맵
      
      public:
      	CBufferDC(CWnd *pParent);
      	~CBufferDC();
      
      public:
      	inline CRect ClientRect() const { return m_RcClient; }
      	inline CRect WindowRect() const { return m_RcWindow; }
      	inline CRect UpdateRect() const { return m_PaintStruct.rcPaint; }
      
      	operator HDC() const { return m_MemoryDC.m_hDC; }       //  DC handle for API functions
      };
      

      - BufferDC.cpp

      //////////////////////////////////////////////////////////////////////
      // Construction/Destruction
      //////////////////////////////////////////////////////////////////////
      CBufferDC::CBufferDC(CWnd *pParent)
          : m_pParent(pParent)
      {
      	ASSERT(pParent);
      
      	//대상 윈도우에 대한 정보를 수집한다.
      	m_pTarget = m_pParent->BeginPaint(&m_PaintStruct);
      	m_pParent->GetClientRect(&m_RcClient);
      	m_pParent->GetWindowRect(&m_RcWindow);
      
      	//대상 윈도우에 대한 DC를 생성한다.
      	m_MemoryDC.CreateCompatibleDC(m_pTarget);
      	//대상 DC에 대한 메모리 비트맵을 생성하여 Select 한다.
      	m_MemoryBmp.CreateBitmap(m_RcClient.Width(), m_RcClient.Height(), 
      		m_MemoryDC.GetDeviceCaps(PLANES),
      		m_MemoryDC.GetDeviceCaps(BITSPIXEL), 0);
      	m_pOldMemoryBmp = m_MemoryDC.SelectObject(&m_MemoryBmp);
      
      	//메모리 버퍼에 Attach한다.
      	Attach(m_MemoryDC);
      }
      
      //////////////////////////////////////////////////////////////////////
      CBufferDC::~CBufferDC()
      {
      	//메모리 DC의 내용을 대상 윈도우에 출력한다.
      	//내부적으로 비트맵에 출력한 것이므로 해당 비트맵을 1:1로 복사한다.
      	m_pTarget->BitBlt(
      		m_PaintStruct.rcPaint.left,
      		m_PaintStruct.rcPaint.top, 
      		m_PaintStruct.rcPaint.right - m_PaintStruct.rcPaint.left, 
      		m_PaintStruct.rcPaint.bottom - m_PaintStruct.rcPaint.top, 
      		&m_MemoryDC,
      		m_PaintStruct.rcPaint.left,
      		m_PaintStruct.rcPaint.top, SRCCOPY);
      
      	m_MemoryDC.SelectObject(m_pOldMemoryBmp);
      	m_pParent->EndPaint(&m_PaintStruct);
      
      	Detach();
      }
      
      //////////////////////////////////////////////////////////////////////
      BOOL CBufferDC::Attach(HDC hDC)
      {
          return CDC::Attach(hDC);
      }
      
      //////////////////////////////////////////////////////////////////////
      HDC CBufferDC::Detach()
      {
          return CDC::Detach();
      }
      
    6. WM_ERASEBKGND 메시지 핸들러 함수를 등록하여 아무런 처리도 하지 않도록 코드를 수정하고 OnPaint() 함수에서 CBufferDC 클래스를 활용하여 더블 버퍼링을 구현한다면 화면 깜빡임을 완벽히 해결할 수 있음
      - 1.(3) 참조

WYSWYG(What You See What You Get)

  • 눈에 보이는 것과 프린터 출력물이 일치한다는 의미
  • MS 워드나 한글 같은 워드프로세서에 있어 이런 기능은 당연


  1. 윈도우 영역
    1. 윈도우 영역의 구분
      1. 클라이언트(Client) 영역
      2. 비클라이언트(Non-client) 영역
    2. TextRgn 예제
      - 별도의 영역 만들기
    3. void CTextRgnView::OnPaint()

      {

      CPaintDC dc(this); // device context for painting

      // TODO: 여기에 메시지 처리기 코드를 추가합니다.

      // 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.

      //임의의 두 사각형을

      //각기 다른 색상(붉은색과 회색)으로 칠한다.

      CRect rectLeft = CRect(50, 50, 250, 150);

      CRect rectRight = CRect(250, 50, 450, 150);

      dc.FillSolidRect(&rectLeft, RGB(192, 0, 0));

      dc.FillSolidRect(&rectRight, RGB(192, 192, 192));


      //앞서 만든 두 사각형을 별도의 영역으로 만든다.

      CRgn rgnLeft, rgnRight;

      rgnLeft.CreateRectRgnIndirect(rectLeft);

      rgnRight.CreateRectRgnIndirect(rectRight);


      LOGFONT lf;

      ::ZeroMemory(&lf, sizeof(lf));

      lf.lfHeight = 72;

      wsprintf(lf.lfFaceName, _T("%s"), _T("Arial Black"));

      CFont NewFont;

      NewFont.CreateFontIndirect(&lf);

      CFont* pOldFont = dc.SelectObject(&NewFont);


      dc.SetBkMode(TRANSPARENT);

      //dc.TextOut(60, 65, TEXT("TEST STRING"));


      //왼쪽 영역을 선택하여 문자열을 출력한다.

      dc.SetTextColor(RGB(192, 192, 192));

      dc.SelectClipRgn(&rgnLeft);

      dc.TextOut(60, 65, TEXT("TEST STRING"));


      //오른쪽 영역을 선택하여 문자열을 출력한다.

      dc.SetTextColor(RGB(192, 0, 0));

      dc.SelectClipRgn(&rgnRight);

      dc.TextOut(60, 65, TEXT("TEST STRING"));


      //영역해제

      dc.SelectClipRgn(NULL);


      dc.SelectObject(pOldFont);

      }

      • CreateRectRgnIndirect()
        • 인자로 주어진 RECT 구조체의 정보를 근거로 새로운 윈도우 영역을 생성
      • CreateRectRgn()
        • CreateRectRgnIndirect()와 동일하지만 RECT 구조체의 주소가 아니라 네 개의 int형 값을 받으며, 각각은 사각형을 그리기 위한 좌표
      • SelectClipRgn()
        • 인자로 주어진 CRgn 클래스 객체로 윈도우 영역을 변경
        • SelectClipRgn() 함수 호출 코드를 수행한 직후에는 특정 영역을 벗어난 그리기 결과는 화면에 출력되지 않음
        • SelectClipRgn(NULL) 코드로써 영역해제
    4. FrameRgn 예제
      - 영역을 조합하기
    5. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

      {

      if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

      return -1;


      if (!m_wndStatusBar.Create(this))

      {

      TRACE0("상태 표시줄을 만들지 못했습니다.\n");

      return -1;      // 만들지 못했습니다.

      }

      m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));


      // 두 영역 및 조합된 영역을 주어진 좌표로 생성한다.

      m_RgnRect1.CreateRectRgn(0, 0, 100, 100);

      m_RgnRect2.CreateRectRgn(70, 70, 170, 170);


      // 이 영역은 조합된 결과가 저장될 영역이므로 좌표는 의미가 없다.

      m_RgnTotal.CreateRectRgn(0, 0, 0, 0);


      // 두 영역을 조합한 새로운 영역을 만든다.

      m_RgnTotal.CombineRgn(&m_RgnRect1, &m_RgnRect2, RGN_XOR);


      // 조합된 영역이 CMainFrame 윈도우의 영역이 되도록 한다.

      SetWindowRgn((HRGN)m_RgnTotal, TRUE);


      return 0;

      }

      • CombineRgn()
        • 두 영역을 조합한다.
        • RGN_XOR, RGN_OR, RGN_AND, RGN_DIFF, RGN_COPY 등이 있다.
      • SetWindowRgn()
        • 윈도우 자체의 영역을 바꾼다.
        • 반면에 SelectClipRgn()함수는 CDC 클래스의 멤버로 윈도우 자체의 영역을 변경하는 것이 아니라 그리기 결과가 출력되는 DC의 영역을 일시적으로 변경한다.
        • 메인 프레임 윈도우는 응용 프로그램에서 최상위 부모 윈도우가 되므로 이 윈도우의 영역을 변경하면 자식 윈도우들에게도 직접적으로 영향을 주게 된다.
  2. 그리기(Drawing) 모드
    - 펜을 이용한 그리기 코드를 실행할 때 출력 대상인 화면 DC의 이미지와 펜이 그린 이미지를 어떻게 조합할 것인지 설정
    1. DrawModeDemo 예제
      • SetCapture()
        • 마우스가 해당 윈도우를 벗어나도 메시지를 받을 수 있다.
      • GetCapture()
        • 마우스를 캡쳐하고 있는 윈도우의 핸들을 리턴한다.
        • 캡쳐하는 윈도우가 없으면 NULL
      • ReleaseCapture()
        • 캡쳐 해제
      • SetROP2()
  3. 매핑(Mapping) 모드
    - 좌표계 변경
    1. MapModeDemo 예제
      • SetMapMode()
      • SetWindowExt()
        • 윈도우와 연결된 DC의 논리적인 폭과 높이를 설정
      • SetViewportExt()
        • 뷰포트의 크기를 설정
        • SetWindowExt()함수로 DC의 크기를 가로/세로 100으로 설정했는데 뷰포트의 크기를 가로/세로 300으로 했다면 300% 확대하는 이치
      • SetViewportOrg()
        • 물리적으로 (0, 0)에 해당하는 좌표를 설정
        • 기본 값은 (0, 0) (왼쪽 위 구석)
        • SetViewportOrg(300, 300)으로 설정했다면 왼쪽 위 구석은 (-300, -300)이 됨
  4. 프린터 출력
    1. 기본적으로 모니터 출력과 프린터 출력은 크게 다르지 않다
    2. MFC의 문서/뷰(Document/View) 구조를 통한 구현
    3.  함수명

      설명 

       OnPaint()

      모니터 화면에 출력 

       OnPrint()프린터에 출력 
       OnDraw()

      모니터 화면과 프린터 모두에 출력 

    4. 프린터 출력과 상관없는 화면 출력은 OnPaint() 함수를 이용하는 것이 MFC가 권고하는 프로그래밍 기법
    5. 관련 함수들
      • IsPrinting()
        • CDC 클래스의 메서드로서 DC가 프린터 DC인지 아닌지를 BOOL형으로 반환
      • 문서/뷰 구조의 SDI 형식의 프로젝트 생성 시 기본 재정의 함수들
        • OnPreparePrinting()
          • 프린터 출력에 앞서 인쇄 대화 상자를 출력하기 직전에 호출
          • DoPreparePrinting() 함수를 호출하여 인쇄 대화 상자가 화면에 나타남
          • 프린터 출력에 앞서 인쇄할 전체 문서의 길이가 얼마나 되는지 계산하는 코드가 주로 들어감
          • CPrintInfo 구조체의 멤버 중에 SetMaxPage() 함수를 통해 출력 문서의 전체 길이 설정 가능
        • OnBeginPrinting()
          • 문서 출력 시작 시점에 호출
        • OnEndPrinting()
          • 문서 출력 완료 시점에 호출
    6. MFC의 프린터 출력 구조


http://imgsoul.blog.me/140113627087

http://thakddkrl.tistory.com/136

http://blog.naver.com/knight50?Redirect=Log&logNo=80102653818

http://blog.daum.net/sharer77/6900065

http://selection.datavisualization.ch/ 

select to_char(SYSDATE, 'month "of the" dd') from dual;

select to_char(SYSDATE, 'month "of the" ddth') from dual;

select to_char(SYSDATE, 'month "of the" ddsp') from dual;

select to_char(SYSDATE, 'month "of the" ddspth') from dual;

select to_char(SYSDATE, 'month "of the" ddthsp') from dual;


TO_CHAR(SYSDATE,'MONTH"OFTHE"DD')
november of the 23
 Record Count: 1; Execution Time: 1ms View Execution Plan  link
TO_CHAR(SYSDATE,'MONTH"OFTHE"DDTH')
november of the 23rd
 Record Count: 1; Execution Time: 1ms View Execution Plan  link
TO_CHAR(SYSDATE,'MONTH"OFTHE"DDSP')
november of the twenty-three
 Record Count: 1; Execution Time: 1ms View Execution Plan  link
TO_CHAR(SYSDATE,'MONTH"OFTHE"DDSPTH')
november of the twenty-third
 Record Count: 1; Execution Time: 1ms View Execution Plan  link
TO_CHAR(SYSDATE,'MONTH"OFTHE"DDTHSP')
november of the twenty-third
 Record Count: 1; Execution Time: 56ms View Execution Plan  link

+ Recent posts