各位大侠:我用SDK写了一个对话框 也就是程序就是个对话框 该程序可以运行 但是消息处理函数WndProc 不起作用(感觉是没有调用该函数),此程序是在修改得来的,原程序是通过菜单弹出一个对话框,现在我就修改了创建方式,直接 CreateDialog(),对话框在rc里面用VC做的。请高手指点下。
#include <windows.h>
#include "resource.h"LRESULT  CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     PSTR szCmdLine, int iCmdShow)
{
      static TCHAR  szAppName[] = TEXT ("IDR_MENU1") ;
      MSG           msg ;
      HWND          hwnd ;
WNDCLASS      wndclass ;
   // HMENU hMenu ;

      wndclass.style          = CS_HREDRAW | CS_VREDRAW ;
      wndclass.lpfnWndProc    = WndProc;
      wndclass.cbClsExtra     = 0 ;
      wndclass.cbWndExtra     = 0 ;
      wndclass.hInstance      = hInstance ;
      wndclass.hIcon          = LoadIcon (hInstance, szAppName) ;
      wndclass.hCursor        = LoadCursor (hInstance,IDC_HELP) ;
      wndclass.hbrBackground  = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
      wndclass.lpszMenuName   = szAppName ;
      wndclass.lpszClassName  = szAppName ;
     
      if (!RegisterClass (&wndclass))
      {
           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                szAppName, MB_ICONERROR) ;
           return 0 ;
      }
       
   hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(ABOUTBOX), 0,NULL) ;
// hMenu = LoadMenu (hInstance, MAKEINTRESOURCE (IDR_MENU1)) ;
     // hwnd = CreateWindow ( szAppName, TEXT ("About Box Demo Program"),
                           // WS_OVERLAPPEDWINDOW,
                           // CW_USEDEFAULT, CW_USEDEFAULT,
                           // CW_USEDEFAULT, CW_USEDEFAULT,
                           // NULL, hMenu, hInstance, NULL) ;
     
      ShowWindow (hwnd, iCmdShow) ;
     // UpdateWindow (hwnd) ; 
     
      while (GetMessage (&msg, NULL, 0, 0))
      {
    //MessageBox(hwnd,"aa","ddd",0);
           TranslateMessage (&msg) ;
           DispatchMessage (&msg) ;
//MessageBox(hwnd,"aa","ddd",0);
      }
      //return msg.wParam ;
return 0;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    //MessageBox(hwnd,"aa","ddd",0); 
TCHAR szBuffer[20] ; int nu;
      switch (message)
      {
      case  WM_INITDIALOG :
          //MessageBox(hDlg,"aa","bb",0);
SetWindowText (hwnd, TEXT ("Dialog Box Caption")) ;
return TRUE ;
          
      case  WM_COMMAND :
           switch (LOWORD (wParam))
           {
           case  IDOK :
EndDialog(hwnd, 0);
return TRUE;
           case  IDCANCEL :
                EndDialog (hwnd, 0) ;
                return TRUE ;
case  IDC_BLUE:
wsprintf (szBuffer, TEXT ("%d"), IDC_BLUE) ;
SetDlgItemText (hwnd, IDC_EDIT1, szBuffer) ;
                    break;
             case  IDC_YELLOW:
nu=IDC_YELLOW;
                    break;
             case  IDC_RED:
nu=IDC_RED;
                    break;
              case  IDC_BLACK:
                  nu=IDC_BLACK;
                    break;
  
case IDC_CHECK1:
nu=IDC_CHECK1;
                    break;
case IDC_CHECK2:
nu=IDC_CHECK2;
                    break;
          }

      case  WM_DESTROY :
           PostQuitMessage (0) ;
           return 0 ;
          
     }
      return DefWindowProc (hwnd, message, wParam, lParam) ;
}
/////////////////////////////////////////////////////////////////////////////////////////
原程序下面
/////////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include "resource.h"LRESULT  CALLBACK WndProc       (HWND, UINT, WPARAM, LPARAM) ;
BOOL     CALLBACK AboutDlgProc  (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     PSTR szCmdLine, int iCmdShow)
{
      static TCHAR  szAppName[] = TEXT ("IDR_MENU1") ;
      MSG           msg ;
      HWND          hwnd ;
WNDCLASS      wndclass ;
      HMENU hMenu ;

      wndclass.style          = CS_HREDRAW | CS_VREDRAW ;
      wndclass.lpfnWndProc    = WndProc ;
      wndclass.cbClsExtra     = 0 ;
      wndclass.cbWndExtra     = 0 ;
      wndclass.hInstance      = hInstance ;
      wndclass.hIcon          = LoadIcon (hInstance, szAppName) ;
      wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
      wndclass.hbrBackground  = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
      wndclass.lpszMenuName   = szAppName ;
      wndclass.lpszClassName  = szAppName ;
     
      if (!RegisterClass (&wndclass))
      {
           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                szAppName, MB_ICONERROR) ;
           return 0 ;
      }
       hMenu = LoadMenu (hInstance, MAKEINTRESOURCE (IDR_MENU1)) ;
   //hMenu = LoadDialog (hInstance, MAKEINTRESOURCE (IDR_MENU1)) ;
      hwnd = CreateWindow ( szAppName, TEXT ("About Box Demo Program"),
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT, CW_USEDEFAULT,
                            CW_USEDEFAULT, CW_USEDEFAULT,
                           NULL, hMenu, hInstance, NULL) ;
     
      ShowWindow (hwnd, iCmdShow) ;
      UpdateWindow (hwnd) ; 
     
      while (GetMessage (&msg, NULL, 0, 0))
      {
           TranslateMessage (&msg) ;
           DispatchMessage (&msg) ;
      }
      return msg.wParam ;
}LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
      static HINSTANCE hInstance ;
      switch (message)
      {
      case  WM_CREATE :
           hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
           return 0 ;
          
      case  WM_COMMAND :
           switch (LOWORD (wParam))
           {
           case IDM_APP_ABOUT :
                DialogBox (hInstance, MAKEINTRESOURCE (ABOUTBOX), hwnd, AboutDlgProc) ;
//MessageBox(hwnd,"aa","bb",0);
                break ;
           }
           return 0 ;
          
      case  WM_DESTROY :
           PostQuitMessage (0) ;
           return 0 ;
      }
      return DefWindowProc (hwnd, message, wParam, lParam) ;
}BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{       
TCHAR szBuffer[20] ;
int nu;
      switch (message)
      {
      case  WM_INITDIALOG :
          //MessageBox(hDlg,"aa","bb",0);
SetWindowText (hDlg, TEXT ("Dialog Box Caption")) ;
return TRUE ;
          
      case  WM_COMMAND :
           switch (LOWORD (wParam))
           {
           case  IDOK :
//MessageBox(hDlg,"success","success",0);
return TRUE;
           case  IDCANCEL :
                EndDialog (hDlg, 0) ;
                return TRUE ;
case  IDC_BLUE:
wsprintf (szBuffer, TEXT ("%d"), IDC_BLUE) ;
SetDlgItemText (hDlg, IDC_EDIT1, szBuffer) ;
                    break;
             case  IDC_YELLOW:
nu=IDC_YELLOW;
                    break;
             case  IDC_RED:
nu=IDC_RED;
                    break;
              case  IDC_BLACK:
                  nu=IDC_BLACK;
                    break;
  
case IDC_CHECK1:
nu=IDC_CHECK1;
                    break;
case IDC_CHECK2:
nu=IDC_CHECK2;
                    break;
          }

     
           break ;
     }
   return FALSE ;
}

解决方案 »

  1.   

    原来的程序DialogBox创建的是模式对话框,CreateDialog创建非模式对话框
      

  2.   

    hDlgModeless = CreateDialog(...);  
    ShowWindow (hDlgModeless,SW_SHOW);
    与模态对话框和消息框的消息不同,非模态对话框的消息要经过程序式的消息队列。要将这些消息传送给对话框窗口消息处理程序,则必须改变消息队列。方法如下:当您使用CreateDialog建立非模态对话框时,应该将从呼叫中传回的对话框句柄储存在一个整体变量(如hDlgModeless)中,并将消息循环改变为:
    while (GetMessage(&msg,NULL,0,0))        
    {        
        if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
        {
            TranslateMessage (&msg);
            DispatchMessage  (&msg);        
        }        
    }
      

  3.   

    你可以去下一本WINDOWS程序设计来看看,网上很多地方都有的。
      

  4.   

    谢谢laiyiling,但问题还是没有解决
    如果用int 型存createDialog()的返回值就会出现错误,是不可以的 因为类型都不一样,我改成 HWND 类型 程序可以运行 但是还是不能接受消息 很郁闷
    我就是在看 侯捷 老师的那本WINDOWS程序设计的时候有点迷茫 一个程序 我想变通下 就不正常了。
      

  5.   

    发到我信箱来,我看看:[email protected]
      

  6.   

    这样当然不行啦
    你在createdialog的时候在最后一个参数里定义回调函数啊
    你把你对话框的回调函放到回调函数里调当然不行啦
    你在createdialog的时候应该改成这样:
    hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(ABOUTBOX), 0,WndProc) ;
    然后再ShowWindow(hwnd, SW_SHOW);
    就ok了~
    PS:按照命名的一般习惯 WndProc应该命名主回调函数
    你试试看
      

  7.   

    发给我马上帮你改:[email protected]
      

  8.   

    hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(ABOUTBOX), 0,WndProc) ;
    这个我弄了的 有错误:
    --------------------Configuration: paper - Win32 Debug--------------------
    Compiling...
    paper.cpp
    C:\Documents and Settings\paper\paper\paper\paper.cpp(35) : error C2664: 'CreateDialogParamA' : cannot convert parameter 4 from 'long (struct HWND__ *,unsigned int,unsigned int,long)' to 'int (__stdcall *)(struct HWND__ *,unsigned int,unsi
    gned int,long)'
            None of the functions with this name in scope match the target type
    Error executing cl.exe.paper.exe - 1 error(s), 0 warning(s)
      

  9.   

    CreateDialog(hInstance, MAKEINTRESOURCE(ABOUTBOX), 0,WndProc) ;
    改成 CreateDialog(hInstance, MAKEINTRESOURCE(ABOUTBOX), 0,(DLGPROC)WndProc) ;
    这样没问题了,还有细节问题CreateDialog创建的对话框要用DestroyWindow销毁,不要用EndDialog,除了这一点,其他的和模态对话框没什么两样,还有上面说的
    while (GetMessage(&msg,NULL,0,0))        
    {        
        if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
        {
            TranslateMessage (&msg);
            DispatchMessage  (&msg);        
        }        
    }
    也要注意
      

  10.   

    看了一下你的程序,确实是楼上说的那样,还有一点就是
    case  WM_COMMAND :后面应该加一个break,否则,受到任何WM_COMMAND消息都会执行WM_COMMAND下面那个语句块。
    case  WM_DESTROY :
        PostQuitMessage (0) ;
        return 0 ;
    程序就直接退出了。
    :)
      

  11.   

    哈哈,我忘了如果那样弄得话callback函数要改改:)
      

  12.   

    声明成BOOL WINAPI WndProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam):)