1、
恩。。我想处理一个控件的消息。。比如在一个BUTTON上按F1。。
我想截取这个消息  
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    {
        case WM_INITDIALOG:
            return TRUE;        case WM_CLOSE:
            EndDialog(hwndDlg, 0);
            return TRUE;
        case WM_KEYDOWN:            break;        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDC_BTN_QUIT:
                    EndDialog(hwndDlg, 0);
                    return TRUE;                case IDC_BTN_TEST:
                    MessageBox(hwndDlg, "You clicked \"Test\" button!", "Information", MB_ICONINFORMATION);
                    return TRUE;
            }
    }    return FALSE;
}
消息处理函数是这么写的,不过捕获的好像是在主窗口上的,而不是BUTTON上的
如果一个窗口上有一个控件,那么主窗体不就获取不到消息了么?
该怎么写针对某个对象的消息处理?
-----------------------------------
2、                case IDC_BTN_QUIT:
                    EndDialog(hwndDlg, 0);
                    return TRUE;                case IDC_BTN_TEST:
                    MessageBox(hwndDlg, "You clicked \"Test\" button!", "Information", MB_ICONINFORMATION);
                    return TRUE;IDC_BTN_QUIT和IDC_BTN_TEST是两个在资源文件中定义的BUTTON的值
通过上面两个case,可以处理Click事件,那我如果想处理DoubleClick该怎么写?
恩。。就是SDK中是通过什么来区分消息的区别的

解决方案 »

  1.   

    坏哥能说详细点么。。
    我不是很明白。。
    我是用WINDOWS SDK写的。。
      

  2.   

    VC中有个PreTranslateMessage好像可以将消息映射为全局。。然后再处理,不知道SDK中怎么实现
      

  3.   

    1、用SetWindowLongPtr重设按钮的DWLP_DLGPROC,然后在自己的函数中判断键盘消息。
    2、if (HIWORD(wParam) == BN_DBLCLK)则是双击。
      

  4.   

    1.对于鼠标点击的消息,控件会向父窗口发送通知消息。
    要处理在Button上按F1的消息,需要拦截Button本身的消息处理过程。通过SetWindowLong或SetWindowLongPtr 进行窗口子类化来做:LONG lpPrevWndFunc = SetWindowLong( hWnd, //button的窗口句柄
          GWL_WNDPROC, 
          (LONG)NewButtonProc//新的窗口处理过程函数 的指针
          );LRESULT CALLBACK NewButtonProc(HWND hwnd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
    )
    {
      //处理 按键消息。如 WM_KEYDOWN
         switch( uMsg )
         {
              case WM_KEYDOWN: 
         }      CallWindowProc( (WNDPROC)lpPrevWndFunc, //原窗口处理过程函数指针,
            hWnd,
            Msg,
            wParam,
            Param
            );
    }
    2.case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                    case IDC_BTN_QUIT:
                        {
                        switch( HIWORD(wParam) )  //wParam高字节 表示 消息的code
                            case BN_CLICKED: 
                                 break;
                            case BN_DOUBLECLICKED:
                                 break; 
       
                        return TRUE;
                        }
                } 
      

  5.   

    #include <windows.h>
    #include "resource.h"
    /*  Declare Windows procedure  */
    BOOL CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);/*  Make the class name into a global variable  */
    char szClassName[ ] = "CodeBlocksWindowsApp";int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nCmdShow)
    {
        DialogBox(hThisInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,WindowProcedure);
    return 0;}LRESULT CALLBACK NewButtonProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam);LRESULT CALLBACK NewButtonProc(HWND hwnd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
    )
    {
      //处理 按键消息。如 WM_KEYDOWN
        switch( uMsg )
        {
            case BN_CLICKED:
                MessageBox(NULL,TEXT("单击"),TEXT("NULL"),MB_OK);
                break;
            case BN_DOUBLECLICKED:
                MessageBox(NULL,TEXT("双击"),TEXT("NULL"),MB_OK);
                break;
        }    CallWindowProc( (WNDPROC)WindowProcedure, //原窗口处理过程函数指针,
            hwnd,
            uMsg,
            wParam,
            lParam
            );
    return 1;
    }/*  This function is called by the Windows function DispatchMessage()  */
    BOOL CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_INITDIALOG:
                return TRUE;
    case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDC_BUTTON1:
      LONG lpPrevWndFunc = SetWindowLong( hwnd, //button的窗口句柄
                          GWL_WNDPROC,
                          (LONG)NewButtonProc//新的窗口处理过程函数 的指针
                          );
    return TRUE;

    }

    return TRUE;
    case WM_CLOSE:
                EndDialog(hwnd, 0);
                return TRUE;
        }
        return FALSE;
    } 我想在NewButtonProc中响应鼠标单击、双击事件。。
    请大家再帮我看下吧,应该是传递消息传错了,导致再NewButtonProc中无法响应
      

  6.   

    在dialog的WM_INITDIALOG 处 对button进行SetWindowLongBN_CLICKED,BN_DOUBLECLICKED是控件对父窗口发出的通知消息,在dialog的消息处理过程里处理。
    case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                    case IDC_BTN_QUIT:
                        {
                        switch( HIWORD(wParam) )  //wParam高字节 表示 消息的code
                            case BN_CLICKED:
                                break;
                            case BN_DOUBLECLICKED:
                                break;
     
                        return TRUE;
                        }
                } 
    如果要把鼠标的左键点击消息在 button的消息处理过程里处理的话,应该如下
    LRESULT CALLBACK NewButtonProc(HWND hwnd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
    )
    {
      //处理 按键消息。如 WM_KEYDOWN
        switch( uMsg )
        {
            case WM_LBUTTONDOWN :
      
                break;
            case WM_LBUTTONUP:            break;
        }    return CallWindowProc( (WNDPROC)WindowProcedure, //原窗口处理过程函数指针,
            hwnd,
            uMsg,
            wParam,
            lParam
            );} 
      

  7.   


    BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch(uMsg)
        {
            case WM_INITDIALOG:
                /*
                 * TODO: Add code to initialize the dialog.
                 */            return TRUE;        case WM_CLOSE:
                EndDialog(hwndDlg, 0);
                return TRUE;        case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                    /*
                     * TODO: Add more control ID's, when needed.
                     */                case IDC_BTN_QUIT:
                               EndDialog(hwndDlg, 0);
                               return TRUE;    //                return TRUE;                case IDC_BTN_TEST:
                        MessageBox(hwndDlg,"test","",MB_OK);
                        return TRUE;
                }    }    return FALSE;
    }
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
        hInst = hInstance;    // The user interface is a modal dialog box
        return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, DialogProc);
    }
    这是个没做相应的源码。。麻烦帮我修改下。。我刚试了下把SetWindowLong 写到了
            case WM_INITDIALOG:
    中。。结果那按钮没了。。郁闷。弄了半天了,唉~
      

  8.   

    LRESULT CALLBACK NewButtonProc(HWND hwnd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
    )
    {
      //处理 按键消息。如 WM_KEYDOWN
        switch( uMsg )
        {
            case WM_LBUTTONDOWN :
    MessageBox(NULL,"test","",MB_OK);
                return 0;
            case WM_LBUTTONUP:

                break;
        }
        return CallWindowProc( (WNDPROC)g_preButtonProc, 
            hwnd,
            uMsg,
            wParam,
            lParam
            );
    } BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch(uMsg)
        {
            case WM_INITDIALOG:
    {
    HWND hwndButton = ::GetDlgItem( hwndDlg, IDC_BUTTON );//IDC_BUTTON为测试用的按钮的ID
    g_preButtonProc = ::SetWindowLong( hwndButton, GWL_WNDPROC, (LONG)NewButtonProc );            return TRUE;
    }
            case WM_CLOSE:
                EndDialog(hwndDlg, 0);
                return TRUE;        case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                    /*
                    * TODO: Add more control ID's, when needed.
                    */
        //            case IDC_BTN_QUIT:
        //                      EndDialog(hwndDlg, 0);
        //                      return TRUE;    ////                return TRUE;                case IDC_BUTTON:
                     //   MessageBox(hwndDlg,"test","",MB_OK);
                        return TRUE;
                }
        }
        return FALSE;

      

  9.   

    SetWindowLong和GetWindowLong是什么意思呢?