点击对话框的系统菜单(如最小化 关闭按钮),没有任何反应是怎么回事啊(一点反应也没有 就包括正常按钮在点击时外观的变化也没有)

解决方案 »

  1.   

    对话框有没有处理 WM_SYSCOMMAND 消息?
      

  2.   

    看看在 OnSysCommand(UINT nID, LPARAM lParam) 函数中,写了什么代码及WindowProc(UINT message, WPARAM wParam, LPARAM lParam)这个函数也看看
      

  3.   

    一般无需处理 WM_SYSCOMMAND 消息。
      

  4.   

    下面是代码
    #include <windows.h>
    #include "resource.h"
    BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
    TCHAR szAppName[]=TEXT("dialog");
    if(-1==DialogBox(hInstance,szAppName,NULL,DlgProc))
    {
    MessageBox(NULL,TEXT("Dialog Create Error"),TEXT("Error"),MB_OK);
    return 0;
    }
    return 0;
    }BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch(message)
    {
    case WM_INITDIALOG:
    //MessageBox(NULL,TEXT("SetWindowLong"),TEXT(""),MB_OK);
    SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) | WS_MINIMIZEBOX);
    break;
    case WM_SYSCOMMAND:
    switch (LOWORD (wParam))
            {
    case SC_CLOSE:
    EndDialog (hwnd, 0) ;
    return TRUE;
    case SC_MINIMIZE:
    MessageBox(NULL,TEXT("最小化"),TEXT(""),MB_OK);
    return TRUE;
    }
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
    }
      

  5.   

    case WM_SYSCOMMAND:
            switch (wParam)
            ....
      

  6.   

    wParam 的高字节好像为空 这样应该也可以吧 你说的我试了 结果一样
      

  7.   

    1)要给DialogBox一个对话框资源。
    2)回调函数最后不使用DefWindowProc,改成 return FALSE;即可。
    #include <windows.h>
    #include "resource.h"BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
        //TCHAR szAppName[]=TEXT("dialog");
        if(-1==DialogBox(hInstance,(LPCTSTR)(IDD_ABOUTBOX),NULL,(DLGPROC)DlgProc))//IDD_ABOUTBOX是个对话框资源ID
        {
            MessageBox(NULL,TEXT("Dialog Create Error"),TEXT("Error"),MB_OK);
            return -1;
        }
        return 0;
    }BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
        case WM_INITDIALOG:
            //MessageBox(NULL,TEXT("SetWindowLong"),TEXT(""),MB_OK);
            SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) | WS_MINIMIZEBOX);
            break;
        case WM_SYSCOMMAND:
            switch (LOWORD (wParam))
            {
            case SC_CLOSE:
                EndDialog (hwnd, 0) ;
                return TRUE;
            case SC_MINIMIZE:
                MessageBox(NULL,TEXT("最小化"),TEXT(""),MB_OK);
                return TRUE;
            }
        }
        return FALSE;
    }
      

  8.   

    另外WM_INITDIALOG部分改成:
        case WM_INITDIALOG:
            //MessageBox(NULL,TEXT("SetWindowLong"),TEXT(""),MB_OK);
            SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE) | WS_MINIMIZEBOX);
            return TRUE;
      

  9.   

    顶,楼上几位
    需要处理
    WM_SYSCOMMAND
    消息
      

  10.   

    感谢 把最后的改成return FALSE 就好用了 
    难道对话框不可以使用默认的消息处理程序么?
      

  11.   

    最后的return FALSE;表示自己没有处理,交给其他窗口处理(如父窗口)。
    自己可以看看msdn中对
    DialogBox的回调函数的说明。