<콘솔 프로그램과 ODBC 연결>

콘솔에서 돌아가는 C 프로그램을 작성하고 있습니다. MS-SQL 서버와 연결하려면 어떻게 해야 합니까.

 MFC를 이용한 응용 프로그램을 사용해 콘솔 프로그램을 만듭니다. 그런 후에 다음처럼 ODBC를 연결하면 됩니다.

 

<버튼을 이용한 익스플로러 실행>

비주얼 C++로 만든 애플리케이션에서 버튼을 눌렀을 때 익스플로러를 실행하고 싶습니다. 특정 사이트가 열리도록 말입니다.

 --- Now Working ---

<keybd_event에서 한글문제>

SendMessage를 이용해 문자를 다른 윈도우에 보내다가 핸들 문제 때문에 keybd_event를 사용하려는데, 영어와 달리 한글의 경우는 전송이 원하는 대로 이뤄지지 않습니다. keybd_event에서 한글은 어떤 식으로 처리해 줘야 합니까.

keybd_event()를 제대로 쓰려면 고려할 사항이 있습니다. 일단 keybd_event()는 사용자가 키를 누르는 동작을 그대로 흉내내는 것이라 이해해야 합니다(즉, SendMessage()와는 아무런 관련이 없습니다). 예를 들어 키보드에서 'A' 키를 누른다고 항상 'A' 가 입력되는 것은 아니라는 말입니다. CAPS_LOCK이 안 눌려 있다면 'A' 키를 눌러도 'a' 로 입력됩니다. 이 경우 keybd_event() 로 CAPS_LOCK 키를 누르고 'A' 키를 눌러야 합니다.

 물론 이전에 CAPS_LOCK 상태를 확인해야 하며, 방법은 다음과 같습니다.

  한글문제도 마찬가지입니다. IME 상태가 한글이라면 'A'키를 누르면 'ㅁ'가 입력되겠죠. 'S'를 누르면 'ㄴ'일테구요, 따라서 한글을 입력하려면 IME 상태를 확인한 후 영문이라면 한글 키를 누르는 과정이 들어가야 합니다. 즉, "My name is 바보." 를 입력하려면 (CAPS_LOCK : off, 한글 : off일 때) 다음과 같이 하면 됩니다.

> (shift down), M, (shift up), Y, (스페이스), N, A, M, E, (스페이스), I, S, (스페이스)
> (한글키), R, L, A, G, U, S, T, M, D, (한글키), .   // HP 그래픽 워크스테이션에서 한글

 이와 같이 이벤트를 발생시킨 다음, 한글키는 다음과 같이 사용합니다.

BOOL bState = GetKeyState(VK_HANGEUL);   // 한글이면 1, 아니면 0

if(!bState) {
   keybd_event(VK_HANGEUL, MapVirtualKey(VK_HANGEUL, 0), 0, 0);
   keybd_event(VK_HANGEUL, MapVirtualKey(VK_HANGEUL, 0), KEYEVENTF_KEYUP, 0);
}

 

<MemDC 내용을 BMP 파일로 만들기>

캡처한 화면을 MemDC에 메모리 비트맵으로 만든 후, 이를 다시 비트맵 파일로 저장하려 합니다. 어떻게 하면 될까요.

 <리스트 4>를 살펴보면 고민이 바로 해결될 것입니다.

<리스트 4> MemDC를 BMP 파일로 만드는 코드

void OnCommandCapture()
{
     HWND hWnd = (HWND)wParam;
     int nNum = (int)lParam;

     BOOL flag = TRUE;
     CBitmap *pBitmap;
     CWnd tmpWnd;
     CClientDC dc(tmpWnd, GetDesktopWindow());
     CDC memDC;
     CRect rectWnd;
     RECT tmpRect;
     TCHAR szImageFileName[255];
     TCHAR szNumber[255];
     TCHAR szFileName[255];

     itoa(nNum, szNumber, 10);
     ::GetSystemDirectory(szImageFileName, 256);
     sprintf(szFileName, "%s\\+%s+.bmp", szImageFileName, szNumber);

     ::GetWindowRect(hWnd, &tmpRect);
     rectWnd.SetRect(tmpRect.left, tmpRect.top, tmpRect.right, tmpRect.bottom)

     memDC.CreateCompatibleDC(&dc);
     
     pBitmap = new CBitmap;
     pBitmap->CreateCompatibleBitmap(&dc, rectWnd.Width(), rectWnd.Height());
     // m_sizeInPixels.cx

     CBitmap *pOldBitmap = memDC.SelectObject(pBitmap);
     memDC.BitBlt(0, 0, rectWnd.Width(), rectWnd.Height(), &dc,
          rectWnd.left, rectWnd.top, SRCCOPY);
     memDC.SelectObject(pOldBitmap);

     CPalette tmpPal;
     HANDLE hDIB = DDBToDIB(*pBitmap, BI_RGB, &tmpPal);
     WriteDIB(szFileName, hDIB);
     GlobalFree(hDIB);

     delete pBitmap;

     return;
}


........ 중략 ..........


     CFile file;
     if(!file.Open(szFile, CFile::
 

--- Now Working ---