<키보드로 마우스 커서 움직이기>

 제목 그대로 키보드로 마우스 커서를 움직이는 코드입니다. CView에서 OnKeyDown 함수를 다음과 같이 고치면 됩니다.

void CCGhostView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
        // TODO: Add your message handler code here and/or call default
        CPoint ptCurPos;   // 현재 커서의 위치
        if(::GetCursorPos(&ptCurPos)) { // 현재 커서 위치를 얻는다. (스크린 좌표)
                switch(nChar) { // 키값(nChar)에 따라 새로운 커서 위치 설정
                case VK_LEFT :
                        ptCurPos.x -= 30;
                        ::SetCursorPos(ptCurPos.x, ptCurPos.y);
                        break;
                case VK_RIGHT :
                        ptCurPos.x += 30;
                        ::SetCursorPos(ptCurPos.x, ptCurPos.y);
                        break;
                case VK_UP :
                        ptCurPos.y -= 30;
                        ::SetCursorPos(ptCurPos.x, ptCurPos.y);

                        break;
                case VK_DOWN :
                        ptCurPos.y += 30;
                        ::SetCursorPos(ptCurPos.x, ptCurPos.y);
                        break;
                }
        }
        CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

 

<파일 등록정보 보여주기>

 아무 파일이나, 마우스 오른쪽 버튼을 눌러 등록정보를 실행하면 나오는 등록정보 창있죠? 바로 이걸 동작하게 해주는 루틴입니다. 다음은 등록정보를 출력해주는 소스입니다.

  void ShowFileInfo( String FileName )
  {
       SHELLEXECUTEINFO  ExecInfo;
       memset( &ExecInfo, 0, sizeof(SHELLEXECUTEINFO) );
       ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
       ExecInfo.hwnd   = Handle;
       ExecInfo.lpFile = FileName.c_str();
       ExecInfo.lpVerb = "properties";
       ExecInfo.fMask  = SEE_MASK_INVOKEIDLIST;
       ShellExecuteEx( &ExecInfo );
  }

 

<작업표시줄에서 프로그램 숨기기>

 다음은 프로그램을 작업표시줄에서 숨기는 방법입니다.

  ShowWindow( Application.Handle, SW_HIDE );

 

<여러가지 시스템 종료 기법>

  ExitWindowsEx(EWX_FORCE,   0);     // 강제 종료
  ExitWindowsEx(EWX_LOGOFF,  0);     // 로그 오프
  ExitWindowsEx(EWX_POWEROFF,0);    // 셧다운후 시스템 끄기
  ExitWindowsEx(EWX_REBOOT,  0);     // 재부팅
  ExitWindowsEx(EWX_SHUTDOWN,0);   // 셧다운

 

<버튼으로 해당 윈도우 종료하기>

 Visual C++ recodeview 화면에서 버튼으로 해당 화면을 종료하고자 할 때 다음과 같이 구현하면 되요.

  /*******************************************************/
  /* ClassWizard로 CTestApp 클래스에서 ID_APP_EXIT로   */
  /* COMMAND Message를 만들고 거기에 아래와 같이 기술 */
  /*******************************************************/

  void CInfoApp::OnAppExit()
  {
       m_pMainWnd->SendMessage(WM_CLOSE);
  }

  /****************************************************/
  /* 종료 버튼의 이벤트에 다음과 같이 기술 */
  /****************************************************/

  void CTestView::OnExit()
  {
       CTestApp *App = (CTestApp*)AfxGetApp();
       App->OnAppExit();
  }

 

<리스트박스 엔터처리>

  이건 PreTranslateMessage(MSG* pMsg) 를 이용하면 됩니다.

  BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
  {
       if( (pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 13) &&
          (pMsg->hwnd == ::GetDlgItem(GetSafeHwnd(),IDC_LIST_BOX)) )
                // 그리고 나서 여기 아래줄에 실행시킬 함수명을 적어주면 됩니다.
               // 예을들어 SetData();라면..
               SetData();
  }

  void CTestDlg::SetData()
  {
    /// 리스트박스의 선택된 아이템가지고 조작하는 함수
    /// 사용자가 만들어야 겠지요.
  }

  다른 컨트롤들도 이런식으로 하시면 됩니다
  

 

<뷰의 배경색 바꾸기>

 다음의 두 가지 방법이 있습니다. 편한대로 선택하면 됩니다. 효과는 같습니다.

1. PreCreateWindow함수를 사용하는 방법입니다..

BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs)
{
     // TODO: Modify the Window class or styles here by modifying
     // the CREATESTRUCT cs
     cs.lpszClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,
                    LoadCursor(NULL, IDC_ARROW),
                    (HBRUSH)GetStockObject(BLACK_BRUSH),
                    LoadIcon(NULL, IDI_APPLICATION));

     return CView::PreCreateWindow(cs);
}

2. WM_ERASEBKGND 메시지를 사용하는 방법입니다..

BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
     CBrush backBrush(RGB(255, 255, 255)); // <- 흰색칼러로.
     CBrush* pOldBrush = pDC->SelectObject(&backBrush);
     CRect rect; pDC->GetClipBox(&rect);
     pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
     pDC->SelectObject(pOldBrush);
     return TRUE;
}

 

<대화상자에 비트맵 올리기>

아쉽게도 CDC::DrawBitmap이란 함수는 없습니다. 비트맵 자원을 출력하려면 비트맵을 읽어들이고, 출력 장치와 호환되는 메모리 장치 컨텍스트를 생성해야 합니다. 그런 다음 비트맵을 장치 컨텍스트로 선택하고, 장치 컨텍스트를 출력 장치로 전송합니다. 그러면 좌측 상단 구석에 비트맵을 올려놓을 수 있습니다.

  void CSample::OnPaint(){
     CPaintDC dc(this); // 출력에 필요한 장치 컨텍스트
     CDC dcMem;
     //비트맵 자원을 읽는다.
     CBitmap bitmap;
     bitmap.LoadBitmap(IDB_BITMAP)
     //출력 장치와 호환되는 메모리 장치 컨텍스트를 생성한다.
     dcMem.CreateCompatibleDC(&dc)
     //비트맵을 메모리 장치 컨텍스트로 선택한다.
     CBitmap* pOldBitmap = dcMem.SelectObject(&stBitmap)
     //비트맵의 크기를 구한다.
     BITMAP stBitmap;
     bitmap.GetObject(sizeof(BITMAP), &stBitmap);
     //출력 장치에 비트맵을 그린다.
     dc.BitBlt(0, 0, stBitmap.bwWidth stBitmap.bmHeight, &dcMem, 0, 0, SRCCOPY);
     //메모리 장치 컨텍스트부터 컨텍스트로부터 비트맵을 꺼낸다.
  }

 

< 다이얼로그 리소스대로 폼뷰 크기 설정하기>

OnInitialUpdate 멤버 함수에 다음 두 라인을 첨가한다.

 ResizeParentToFit() 함수를 두 번 호출하였는데, 첫 번째 호출은 뷰가 확장되도록 하기위한 것이며, 두 번째 호출은 뷰의 크기가 다이얼로그 리소스에 맞게 축소되도록 하기 위한 것이다.

 

< CD, 플로피등의 디스크 삽입 자동 판단루틴>

    윈도우즈 커맨더나, 탐색기등을 사용하다보면 디스크를 넣거나 뺐을 때, 이걸 감지하고 자동으로 자료를 갱신해주죠?

  보통 프로그램 자체적으로 타이머를 돌려서 감지하는 수도 있겠지만, 윈도우즈 커맨더처럼 프로그램이 활성화될때만 감지하도록 하는 편이 좋을 것 같네요. ^^

  다음은 디스크가 있는지 유무를 판단하는 루틴입니다. 이를 이용해서 이전에 디스크가 있었는데, 검사결과 없었다면 디스크를 빼낸것이고, 그와 반대로 없었다가 검사결과 있다면 삽입한 것이겠지요.

  < 함수 설명 >
  DriveIndex : 검사하고자 하는 드라이브 번호입니다.
              A드라이브는 0, B드라이브는 1, C드라이브는 2.. 순입니다.
  반환값은 디스크가 있으면 true, 없으면 false를 반환합니다.

  bool CheckDriveNotify( int DriveIndex )
  {
  char  *DriveName = "X:\\";
  DriveName[0] = 'A' + DriveIndex;
  return  SetCurrentDir( DriveName );
  }