zoukankan      html  css  js  c++  java
  • 如何使对话框中接收到WM_CHAR消息(Windows编程)

     我们大家都知道,对话框是有的时候捕获不到WM_CHAR消息的.比如,你想使对话框里的Edit控件所键入的全部变为大写.我们毫不犹豫的写到:
     
     #include
    //Declare the Dialog Procedure
    BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

    int WINAPI WinMain(
     HINSTANCE hInstance,  // handle to current instance
     HINSTANCE hPrevInstance,  // handle to previous instance
     LPSTR lpCmdLine,      // pointer to command line
     int nCmdShow          // show state of window
    )
    {
        int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc, 0);
     return(ret != IDOK);
    }

    BOOL CALLBACK DialogProc(
      HWND hwndDlg,  // handle to dialog box
      UINT uMsg,     // message
      WPARAM wParam, // first message parameter
      LPARAM lParam  // second message parameter
      ){ 
     HWND hWndEdit;
     switch (uMsg) {
     case WM_INITDIALOG:
      //Get a handle to the edit control
      hWndEdit = GetDlgItem(hwndDlg, IDC_EDIT1);
      return TRUE;

    break;
     case WM_CHAR:
      wParam=toupper(wParam);
      break;
     case WM_COMMAND:
      switch(LOWORD(wParam)){
      case IDOK:
      case IDCANCEL:
       //Close the dialog
       EndDialog(hwndDlg, LOWORD(wParam));
      }
      return TRUE;
     }
     return
    FALSE;
    }
    很遗憾,我敢肯定地告诉你你将会失败,为什么,问题就是出在WM_CHAR上,你可以试一试,当你不把光标移动到Edit控件时,对话框可以捕获到
    WM_CHAR消息,但是一旦你把光标移动到Edit控件时,就捕获不到WM_CHAR了.

    出现了这种情况,有什么方法可以捕获到WM_CHAR呢?我想对于MFC编程,小Case了,只需重载PreTranslateMessage.
    可是对于Windows编程,利用API来写有点麻烦,这里我提供2种方法来达到变为大写的目的.
    1)捕获WM_CHAR消息,在这里其实不是对话框真正的捕获WMC_CHAR.多话不说,还是提供代码吧,大家自己去看.

    #include
    //Declare the Dialog Procedure
    BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK NewEditProc(HWND, UINT, WPARAM, LPARAM);

    //Define a gloabal var
    WNDPROC g_Edit;
    int WINAPI WinMain(
     HINSTANCE hInstance,  // handle to current instance
     HINSTANCE hPrevInstance,  // handle to previous instance
     LPSTR lpCmdLine,      // pointer to command line
     int nCmdShow          // show state of window
    )
    {
        int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc, 0);
        return(ret != IDOK);
    }

    BOOL CALLBACK DialogProc(
      HWND hwndDlg,  // handle to dialog box
      UINT uMsg,     // message
      WPARAM wParam, // first message parameter
      LPARAM lParam  // second message parameter
      ){ 
     HWND hWndEdit;
     switch (uMsg) {
     case WM_INITDIALOG:
      hWndEdit = GetDlgItem(hwndDlg, IDC_EDIT1);
      //Subclass the Edit control
      g_Edit = (WNDPROC)SetWindowLong(hWndEdit, GWL_WNDPROC, (LONG)NewEditProc);
      return TRUE;
      
     case WM_COMMAND:
      switch(LOWORD(wParam)){
      case IDOK:
      case IDCANCEL:
       EndDialog(hwndDlg, LOWORD(wParam));
      }
      return TRUE;
     }
     return FALSE;
    }

    LRESULT CALLBACK NewEditProc (HWND hwnd, UINT message,
                                 WPARAM wParam, LPARAM lParam)
    {
     TCHAR chCharCode;
     switch (message)
     {
     case WM_CHAR:
      wParam=toupper(wParam);
      break;
     }
     return CallWindowProc (g_Edit, hwnd, message, wParam, lParam);
    }

    2)第二种方法有点土了,不过达到目的就是好方法.还是提供原代码吧.


    #include
    //Declare the Dialog Procedure
    BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

    int WINAPI WinMain(
     HINSTANCE hInstance,  // handle to current instance
     HINSTANCE hPrevInstance,  // handle to previous instance
     LPSTR lpCmdLine,      // pointer to command line
     int nCmdShow          // show state of window
    )
    {
        int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc, 0);
        return(ret != IDOK);
    }

    BOOL CALLBACK DialogProc(
      HWND hwndDlg,  // handle to dialog box
      UINT uMsg,     // message
      WPARAM wParam, // first message parameter
      LPARAM lParam  // second message parameter
      ){ 
     HWND hWndEdit;
     switch (uMsg) {
     case WM_INITDIALOG:
      hWndEdit = GetDlgItem(hwndDlg, IDC_EDIT1);
      return TRUE;
      
     case WM_COMMAND:
      switch(LOWORD(wParam)){
      case IDC_EDIT1:
      if(HIWORD(wParam)==EN_CHANGE)
      {
       TCHAR szString[100]={0};
       GetDlgItemText(hwndDlg,IDC_EDIT1,szString,99);
       int nLen=0;
       int index=0;
       nLen=lstrlen(szString);
       for(index=0;index   {
        if(szString[index]<='z'&&szString[index]>='a')
        {
         szString[index]-=32;
        }
       }
             szString[nLen]=0;
     
          SendMessage(GetDlgItem(hwndDlg,IDC_EDIT1),WM_SETTEXT,(WPARAM)0,(LPARAM)(LPCSTR)szString);
             SendMessage(GetDlgItem(hwndDlg,IDC_EDIT1),EM_SETSEL,lstrlen(szString),lstrlen(szString));
             }
        break;
      case IDOK:
      case IDCANCEL:
       EndDialog(hwndDlg, LOWORD(wParam));
      }
      return TRUE;
     }
     return FALSE;
    }

    以上均在VC6.0上通过


  • 相关阅读:
    北京燃气IC卡充值笔记
    随机分析、随机控制等科目在量化投资、计算金融方向有哪些应用?
    量化交易平台大全
    Doctor of Philosophy in Computational and Mathematical Engineering
    Institute for Computational and Mathematical Engineering
    Requirements for the Master of Science in Computational and Mathematical Engineering
    MSc in Mathematical and Computational Finance
    万字长文:详解多智能体强化学习的基础和应用
    数据处理思想和程序架构: 使用Mbedtls包中的SSL,和服务器进行网络加密通信
    31-STM32+W5500+AIR202/302基本控制篇-功能优化-W5500移植mbedtls库以SSL方式连接MQTT服务器(单向忽略认证)
  • 原文地址:https://www.cnblogs.com/confach/p/112110.html
Copyright © 2011-2022 走看看