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
[23043] Re:Re:Re:keypress 이벤트에서 한글키값을 읽을수 있는방법 알려주세요
유영인.Chris [cuperido] 3963 읽음    2002-12-05 20:06
안녕하세요.

제가 질문을 신중하게 읽지 못해서 조금 실수를 하였네요.
일단, 키 이벤트가 3개가 있는데, 각각 한글을 처리할때 조금씩 틀립니다.

1. OnKeyDown
한글을 입력하면 VK_PROCESSKEY 라는 Key 값만 발생함

2. OnKeyPress
한글 한자를 모두 입력시에만 발생. 흔히 입력을 하는 도중의 상황을 Caret 이라고 표현을 하는데, 이 상태에서는 표현되지 않습니다.

3. OnKeyUp
한글 코드가 영문과 동일하게 키 값으로 바뀌어서 출력.


가장 간단한 방법은, KeyUp 등에서 한글모드일때, 전의 문자를 비교하는 방법입니다.

void __fastcall TForm1::Memo1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{

unsigned char     chChar;


if(Memo1->SelStart <= 0) return;
chChar = Memo1->Lines->Text[Memo1->SelStart];

if(chChar > 128) Label1->Caption = Memo1->Lines->Text.SubString(Memo1->SelStart - 1, 2);
             else Label1->Caption = (char)chChar;

}


물론, 다른 방식으로 처리를 하는 방법도 있습니다. 후킹이나 메세지 처리를 하는 방법입니다.
어떤 작업을 하시려는지 알려주시면, 그에 가장 맞는 방법을 추천해 드리기가 더욱 쉬울것 같습니다.



홍석구 님이 쓰신 글 :
: 답변을 해주셔서 감사합니다.
: 그러면 Keypress 이벤트에서 파라미터로 넘어오는 char &Key 값은 무엇을 의미하는지요.
: 한글 입력 상태에서 메모 컴포넌트에서 "가"를 입력해서 Keypress 이벤트를 발생시키고
: 다시 "나"를 입력해서 Keypress 이벤트를 발생시키면
: 두글다 영문 'K' 한글 'ㅏ'가 마지막으로 입력되었는데 그러면 '가' 와 '나'를 구분할수 있는
: 방법은 없는지요.
:
: 제가 입력해서 확인해보니  
: 한글모드에서 '가' 입력시 Key 값은 0xB0  (176)
: 한글모드에서 '나' 입력시 Key 값은 0xB3  (179)
: 영문모드에서 K 입력시 Key 값은 0x4B  (75)
: 이렇게 Key값이 읽여집니다.
:
: 하지만 '가'라는 한글코드는 임프님이 쓰신것처럼 2Byte로 0xB0 0xA1
: '나' 는 '0xB3 0xAA 입니다.
:
: Keypress에서는 첫번째 바이트 값만 읽어오는데 2번째 바이트 값을 읽을 방법은 없는건지요.
:
: 개발환경
: Windows XP
: C++Builder 5.0 Enterprise
: Memo 컴포넌트 설정값
:     Font Charset HANGEUL_CHARSET
:     imeMode imDontCare
:     imeName 한국어 입력 시스템(IME 2000)
:
: 방법을 알고 있으시면 꼭 답변 부탁드립니다.
: 감사합니다.
:
:
: 유영인.Chris 님이 쓰신 글 :
: : 한글 코드가 꼭 따로 아스키 코드로 있는것은 아닙니다. 예를 들어, '하' 의 경우, KeyPress 가 2번 작동되겠지만, '늘' 의 경우에는 3번 작동됩니다.
: :
: : 따라서, 석구님께서 말씀하신대로 한글 코드가 2Byte 인것과는 KeyPress와는 상관이 없습니다. KeyPress에서는 눌려진 키 값을 반환해 줍니다. 이것은 편하게 그냥 키보드의 위치 값과 똑같다고 생각하시면 됩니다.
: :
: : 따라서, 'a' 와 'ㅁ' 의 경우 똑같은 아스키 값을 넘겨주게 됩니다. 다른 처리를 원하신다면, 한글 상태인지 영문 상태인지 알아본 다음, 처리를 따로 해주셔야 합니다
: :
: : 한글 영문 상태를 강제로 치환하는 방법은, 아래와 같이 처리하시면 됩니다.
: :
: :
: : HIMC              hiMode = ImmGetContext(Application->Handle);
: :
: : // 영문 자판
: : ImmSetConversionStatus(hiMode, IME_CMODE_ALPHANUMERIC, IME_CMODE_ALPHANUMERIC);
: : // 한글 자판
: : ImmSetConversionStatus(hiMode, IME_CMODE_HANGEUL, IME_CMODE_HANGEUL);
: :
: :
: :
: :
: :
: : 홍석구 님이 쓰신 글 :
: : : memo 컴포넌트에서 keypress 이벤트 등록했습니다.
: : : char로 넘어오는 키값을 한글에 대해서 읽을수 있나요.
: : : Q&A 찾아보고 Tip'N Tricks을 찾아봐도 keypress 이벤트에서
: : : 한글코드를 읽어오는 것은 못찾겠습니다.
: : : Tip'N Tricks에 임프님이 쓴글도 char [] 배열에 한글코드가 들어가 있는
: : : 데서 시작해서 sendmessage 하는 것인데 한글코드 자체를 읽어오지 못하니
: : :
: : : 아시는 분있으시면 꼭 답변 부탁합니다.
: : : c++builder 5.0
: : : windows xp 에서 개발하고 있습니다.
: : :
: : : void __fastcall TForm1::memoKeyKeyPress(TObject *Sender, char &Key)
: : : {
: : :     // Key 영문에 대해서는 작동하지만 한글코드는 알아내지 못하고 있습니다.
: : :     // 한글코드는 2byte인데 파라미터는 char로 넘어옵니다.
: : :     // 해결방법을 아시는 분이 계십니까
: : : }
: : :
: : : 감사합니다.

+ -

관련 글 리스트
23004 keypress 이벤트에서 한글키값을 읽을수 있는방법 알려주세요 홍석구 1242 2002/12/04
23009     Re:keypress 이벤트에서 한글키값을 읽을수 있는방법 알려주세요 유영인.Chris 1263 2002/12/04
23019         Re:Re:keypress 이벤트에서 한글키값을 읽을수 있는방법 알려주세요 홍석구 1346 2002/12/04
23043             Re:Re:Re:keypress 이벤트에서 한글키값을 읽을수 있는방법 알려주세요 유영인.Chris 3963 2002/12/05
23051                 Re:Re:Re:Re:keypress 이벤트에서 한글키값을 읽을수 있는방법 알려주세요 홍석구 1569 2002/12/06
23061                     Re:Re:Re:Re:Re:keypress 이벤트에서 한글키값을 읽을수 있는방법 알려주세요 유영인.Chris 2400 2002/12/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.