2013-03-29 7 views
6

मैं एक संपादन नियंत्रणसंपादित करें नियंत्रण पर कब्जा दर्ज कुंजी

HWND hInput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 
    0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_INPUT, GetModuleHandle(NULL), NULL); 

और एक बटन है:

HWND hSendButton = CreateWindowEx(WS_EX_CLIENTEDGE,"BUTTON","Send!", 
     BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, 
     0,0,0,0,hwnd,(HMENU)IDC_MAIN_SENDBUTTON,GetModuleHandle(NULL),NULL); 

वहाँ देखने के लिए जब दर्ज करते हुए संपादित नियंत्रण में टाइप कुंजी दबाने एक रास्ता है और बटन को दबाए गए संदेश को दबाया गया था?

मुझे लगता है कि शायद

SendMessage(hwnd,WM_COMMAND,(WPARAM)IDC_MAIN_SENDBUTTON,LPARAM(0)); 

संदेश भेजने के लिए काम करते हैं, लेकिन मैं अभी भी कुंजी दर्ज कब्जा करने पर अटक कर रहा हूँ।

अग्रिम धन्यवाद।

+0

ऐसा करने के पारंपरिक तरीके से एक त्वरक तालिका मानचित्रण के रूप में दर्ज परिभाषित करता है कि 'IDC_MAIN_SENDBUTTON' को घोषित करने के लिए है । ध्यान दें कि 'GetModuleHandle (NULL)' सबसे अच्छा अभ्यास नहीं है क्योंकि यह विंडो को बनाए गए मॉड्यूल के बजाए आपकी विंडो को प्राथमिक निष्पादन योग्य के नामस्थान में रखता है। –

उत्तर

10

आपको संपादन नियंत्रण को उप-वर्गीकृत करने और WM_KEYDOWN संदेश को संभालने की आवश्यकता है। यदि यह कुंजी है जो आप चाहते हैं, तो संदेश भेजें, अन्यथा, डिफ़ॉल्ट संपादन नियंत्रण प्रक्रिया को अपना काम करने दें।

कोड इस चाहते हैं:

WNDPROC oldEditProc; 

LRESULT CALLBACK subEditProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_KEYDOWN: 
     switch (wParam) 
     { 
      case VK_RETURN: 
      //Do your stuff 
       break; //or return 0; if you don't want to pass it further to def proc 
      //If not your key, skip to default: 
     } 
    default: 
     return CallWindowProc(oldEditProc, wnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

void somecreateeditproc() 
{ 
    HWND hInput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 
    0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_INPUT, GetModuleHandle(NULL), NULL); 

    oldEditProc = (WNDPROC)SetWindowLongPtr(hInput, GWLP_WNDPROC, (LONG_PTR)subEditProc); 
} 
0

मैं संवाद में यह कार्य करें:

BOOL CDialogObject::PreTranslateMessage(MSG* pMsg) 
{ 
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) 
    { 
     SendMessage(WM_COMMAND, (WPARAM)IDC_BUTTON3,LPARAM(0)); 
    } 
    return CDialog::PreTranslateMessage(pMsg); 
} 
संबंधित मुद्दे