2010-07-20 15 views
7

से प्राप्त मैं सी # .net में अपने एकल लाइन पाठ बॉक्स नियंत्रण 3.5एक कस्टम पाठ बॉक्स में IME लाना, नियंत्रण

मैं इस खरोंच पूरी तरह से से लिखा है, मेरे अपने चयन कोड सहित, स्क्रॉल बनाया है, कॉपी/पेस्ट इत्यादि। यह बाएं से दाएं पाठ का चयन भी कर सकता है, न कि मैं कभी भी इसका उपयोग करूँगा ...

मेरी समस्या आईएमई (इनपुट विधि संपादक) एकीकरण के साथ है। आईएमई कुछ हद तक काम करता है, लेकिन मुझे कुछ समस्याएं हैं। मैं बस उनमें से एक को सूचीबद्ध करूंगा।

आम तौर पर, टेक्स्टबॉक्स का उपयोग करके, आईएमई निर्माण टेक्स्टबॉक्स के अंदर प्रस्तुत किया जाता है। हालांकि, मेरे नियंत्रण में, आईएमई स्क्रीन के निचले दाएं भाग पर प्रदर्शित होता है। मैंने अन्य कस्टम नियंत्रणों को देखने की कोशिश की, जिसमें शार्प डेवलपमेंट में इस्तेमाल किया गया था। हालांकि, यह एक ही समस्या थी। चीनी, जापानी, या कोरियाई में टाइपिंग ने स्क्रीन के निचले दाएं भाग में आईएमई सामान किया है।

मुझे अपने खुद के टेक्स्टबॉक्स में यह करने के तरीके पर कुछ पॉइंटर्स चाहिए, और मैंने आईएमई के लिए विंडोज एपीआई देखा, लेकिन बहुत सारे काम हैं, और मुझे नहीं पता कि कहां से शुरू करना है।

तो, कोई विचार?

यह ठीक है अगर कोई कोड नमूने C++ (प्रबंधित/अप्रबंधित) या VB.net में हैं। मैं इसे आसानी से पर्याप्त स्थानांतरित कर सकता हूं।

उत्तर

10

ठीक है, ऐसा लगता है कि स्टैक ओवरफ्लो पर कई आईएमई विशेषज्ञ नहीं हैं ... या कोई भी दिलचस्पी नहीं लेता है।

वैसे भी, मैंने इसे समझ लिया।

असल में, मैं जाल के लिए निम्न विंडोज संदेश:

WM_INPUTLANGCHANGE = 0x51 
WM_KEYUP = 0x101 
WM_CHAR = 0x102 
WM_CONVERTREQUESTEX = 0x108 
WM_IME_STARTCOMPOSITION = 0x10D 
WM_IME_ENDCOMPOSITION = 0x10E 
WM_IME_COMPOSITION = 0x10F 
WM_IME_SETCONTEXT = 0x281 
WM_IME_NOTIFY = 0x282 
WM_IME_CONTROL = 0x283 
WM_IME_COMPOSITIONFULL = 0x284 
WM_IME_SELECT = 0x285 
WM_IME_CHAR = 0x286 
WM_IME_REQUEST = 0x0288 
WM_IME_KEYDOWN = 0x290 
WM_IME_KEYUP = 0x291 

मैं WM_KEYUP और WM_CHAR फँसाने रहा हूँ, क्योंकि अगर मैं एक कोरियाई चरित्र संयोजन के बीच में कहीं पर क्लिक करें, मैं एक संरचना नहीं मिलता है संदेश, लेकिन मुझे उस चरित्र को मेरे टेक्स्ट बॉक्स में फिर भी जोड़ने की ज़रूरत है। यह एक अजीब व्यवहार है, मुझे आश्चर्य है कि यह एक बग है।

एक बार ऐसा होता है, कोरियाई, चीनी और जापानी के बीच अलग-अलग व्यवहार होते हैं।

कोरियाई वास्तव में एक आसान है (मुझे हांजा कनवर्ट करने के बारे में निश्चित नहीं है, क्योंकि मुझे नहीं पता कि वैसे भी इसका उपयोग कैसे करें)।

असल में, सभी भाषाओं के लिए, जब भी मुझे WM_IME_COMPOSITION मिलता है, मुझे को Imm32.dll में कॉल करना होगा जैसा कि मैंने this question के उत्तर में वर्णित किया है। मैं इसे प्रगति पर एक रचना के रूप में प्रदर्शित करता हूं, लेकिन इसे अपने संग्रहीत पाठ में नहीं जोड़ता हूं।

जब एक स्ट्रिंग को मिश्रित किया गया है तो प्रत्येक आईएमई के लिए विंडोज से संदेश अलग है। हर बार, मैं इसे WM_IME_COMPOSITION संदेश से प्राप्त कर सकता हूं।

कोरियाई में, LParam बस GCS_RESULTSTR हो जाएगा, और WParam में प्रवेश किया चरित्र है, जो मैं सिर्फ char

पर कास्ट कर सकते जापानी 'lParam' में GCS_RESULTREADSTR | GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE हो जाएगा हो जाएगा। मुझे ImmGetCompositionString के परिणाम का उपयोग करना है जिसे मैंने पिछले WM_IME_COMPOSITION संदेश से संग्रहीत किया था, क्योंकि इस समय यह एक खाली स्ट्रिंग होगी।

चीनी में, LParamGCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE होगा। यह जापानी जैसा ही है, सिवाय इसके कि पहले संग्रहीत ImmGetCompositionString खाली है, इस स्थिति में मुझे WParam को चार में डालना होगा।

सभी तीन मामलों में, मुझे यह सुनिश्चित करना होगा कि प्रगति में मेरा प्रदर्शित कंप साफ़ हो गया है।

मैं WM_IME_STARTCOMPOSITION प्राप्त करते हैं, मैं एक संयोजन ध्वज सेट (और प्रगति में संयोजन स्ट्रिंग प्रदर्शित)

मैं WM_IME_ENDCOMPOSITION मिले, तो मुझे लगता है कि झंडा स्पष्ट (और प्रगति में संयोजन स्ट्रिंग साफ़ करें)।

कभी-कभी मुझे WM_IME_ENDCOMPOSITION प्राप्त नहीं होता है, इसलिए मैं WM_CHAR प्राप्त करने पर अपना ध्वज साफ़ करता हूं।


सभी सब में, यह एक बहुत ही दिलचस्प अधिगम अनुभव है, और एक अभी भी प्रगति पर है कि था - लेकिन IME पिछले पर अब, मेरे नियंत्रण पर प्रयोग करने योग्य है! मैं इसे पूरा करने के लिए 1 बजे तक काम पर रहा।

+1

बस पाया गया http://stackoverflow.com/questions/434048/how-do-you-use-ime, पहले देखा होगा अच्छा होगा! –