C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[6707] Re:[질문]현재의 입력 모드가 한글인지 어케 알죠?
경호 [ansoni19] 2962 읽음    2001-04-10 10:46
안녕하세요 경호입니다.

이곳의 팁란에보면 임프님이 자세하게 설명해 놓으신게 있는데 ^^
그대로 옮겨 드리죠 ...

먼저.. 현재의 한영 상태와 코딩으로 한영 전환하는 방법부터 알아봅시다.
현재의 한영상태를 알아내는 함수의 소스는...

bool __fastcall TForm1::GetHanMode(void)
{
    unsigned long Conversion, Sentence;
    HIMC Mode = ImmGetContext(Application->Handle);
    ImmGetConversionStatus(Mode, &Conversion, &Sentence);
    return (Conversion == IME_CMODE_HANGEUL);
}

이렇게 하면 됩니다. 이와 비슷하게, 한영상태를 토글하려면,

void __fastcall TForm1::ToggleHanMode(void)
{
    unsigned long Conversion, Sentence;
    HIMC Mode = ImmGetContext(Application->Handle);
    ImmGetConversionStatus(Mode, &Conversion, &Sentence);
    if (Conversion == IME_CMODE_HANGEUL)
        ImmSetConversionStatus(Mode, IME_CMODE_ALPHANUMERIC, IME_CMODE_ALPHANUME
RIC);
    else
        ImmSetConversionStatus(Mode, IME_CMODE_HANGEUL, IME_CMODE_HANGEUL);
}

비교적 간단하지요? ^^

자아.. 다음 단계로 넘어갑시다.
일반 사용자는 한영전환키로 시프트+스페이스 키에 무척 익숙하죠. 그럼 이 키도
지원을 해줘야겠는데.. 제어판의 키보드 종류를 다시 세팅함으로서 디폴트로 이
핫키를 지원하게 해주는 방법도 있습니다만, 어플리케이션에서 시스템 전체의 세팅
을 손댄다는 것은 좀 그렇지요? 그럼 직접 시프트+스페이스 키를 처리해주면 되겠
는데... 이것 뿐만 아니라, 상태바에 한영 상태를 표시해주면 더욱 좋겠죠?

그런데, 쉽게 생각할 수 있듯이, 키보드 입력컨트롤(예를 들어 에디트나 메모 등)
의 OnKeydown에서 처리하려고 연구를 하다보면, 어플리케이션 내에 여러개의 에디트
컨트롤이 있을 경우, 그 OnKeyDown 핸들러를 모두 작성해줘야 하는 무식하기 짝이
없는 코딩이 되겠죠? 다행히 이 핸들러의 내용들이 각각의 처리가 필요없어 여러
에디트 컨트롤에서 공유할 수 있다면 조금은 줄어들겠습니다만, 역시 여러개의 폼이
있을 경우는 대책이 없죠.

이러한 경우, 어플리케이션 수준에서 WM_KEYDOWN 메시지를 먼저 검사하여 처리해
주는 것이 좋겠죠? 이렇게 해주려면, TApplication 의 이벤트인 OnMessage 를 이용
하면 됩니다. 긴 말을 늘어놓기 보단.. 소스를 봅시다.

void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
    static bool ShiftPressed = false;

    switch (Msg.message)
    {
        case WM_KEYDOWN:
        switch(Msg.wParam)
        {
            case VK_SHIFT:
            ShiftPressed = true;
            return;

            case VK_SPACE:
            if(!ShiftPressed)
                return;
            ToggleHanMode();
            ShowHanEngStatus();
            Handled = true;
            return;

#define VK_HANENG 21
            case VK_HANENG:
            ShowHanEngStatus();
            return;
        }
        break;

        case WM_KEYUP:
        if(Msg.wParam == VK_SHIFT)
            ShiftPressed = false;
    }
}

물론, 이 핸들러를 실제로 어플리케이션의 OnMessage에 연결하기 위해 다음과 같은
코드가 더 필요하죠.

void __fastcall TForm1::FormShow(TObject *Sender)
{
    Application->OnMessage = AppMessage;
    ShowHanEngStatus();
}

뭐, OnCreate에서 해줘도 상관없습니다만 굳이 OnShow에서 해준 것은 두번째 라인인
상태바 출력까지 한 함수에서 다 해버리려구 한거죠.

void __fastcall TForm1::ShowHanEngStatus(void)
{
    AnsiString StatString = GetHanMode() ? "한글" : "영문";
    StatusBar1->Panels->Items[1]->Text = StatString;
    Form2->StatusBar1->Panels->Items[1]->Text = StatString;
}

마지막 줄은, 어플리케이션에 여러개의 폼이 있고, 그 폼 역시 상태바에 한영상태를
표시해줘야 할 경우를 위한 것입니다. 만약 상태바가 하나만 필요하다면 마지막
라인은 필요없겠죠.

여기까지 해서, 한영처리에 대한 모든 것은 끝입니다. 이제 이 어플의 모든
에디팅 컨트롤에서의 한영처리는 모두 시프트+스페이스 키를 사용할 수 있을 뿐
아니라, 시프트+스페이스 키 뿐 아니라 키보드의 한영키를 누를때마다 상태바에
현재 한영상태가 표시됩니다.

다 된거 같지요? 실행해보면 잘 됩니다. 실제로 제가 써먹고 있는 코드의 일부니까
요. 하지만.. 여기에 한가지 좀 부족한 면이 있습니다.
만약 한글모드이고, 이 상태에서 한글이 조합중이라면, 즉 'ㄱ'키를 눌러놓고
이상태에서 시프트+스페이스 키를 누르면 한영전환이 안됩니다. 조합중일때는
WM_KEYDOWN이 아닌 WM_IME_~ 계열의 다른 메시지가 전달되는 거 같습니다만..
바쁜 시간 관계로 찾아보지 못했어요. T.T
담에 시간나면 찾아서 보완하기로 하구요.. 이정도로도 쓰기엔 별 불편함은
없더군요.

그럼 도움되시길 바라면서, 이만..

다음번에는 검색을 해보셔요 ^^

+ -

관련 글 리스트
6703 [질문]현재의 입력 모드가 한글인지 어케 알죠? 조경달 2145 2001/04/09
6707     Re:[질문]현재의 입력 모드가 한글인지 어케 알죠? 경호 2962 2001/04/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.