在主函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 下添加代码:
static HWND  hwndButton[NUM] ;
     static RECT  rect ;
     static TCHAR szTop[]    = TEXT ("message            wParam       lParam"),
                  szUnd[]    = TEXT ("_______            ______       ______"),
                  szFormat[] = TEXT ("%-16s%04X-%04X    %04X-%04X"),
                  szBuffer[50] ;
     static int   cxChar, cyChar ;
   //  HDC          hdc ;
//     PAINTSTRUCT  ps ;
     int          i ;
 
 switch (wMsg)
 {

 case WM_CREATE:
 
temp_Item = B_Mode_Item_en;
 cxChar = LOWORD (GetDialogBaseUnits ()) ;
          cyChar = HIWORD (GetDialogBaseUnits ()) ;
          
          for (i = 0 ; i < NUM ; i++)
               hwndButton[i] = CreateWindow ( CTRL_STATIC, 
                                  temp_Item[0],
                                   WS_CHILD | WS_VISIBLE | button[i].iStyle,
                                   cxChar, cyChar * (1 + 2 * i),
                                   20 * cxChar, 7 * cyChar / 4,
                                   hWnd, (HMENU) i,
                                   ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
          SetWindowLong (hWnd, DWL_USER, (LONG)hwndButton[i]);
break;
       }  return TRUE;能够在客户区显示创建孔件!
但是在其他函数如或新建.CPP里添加创建函数(和以上相同的(MESSAGE)创建控件函数):BOOL CALLBACK BtnDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam,
                          LPARAM lParam) 下创建如上控件却无法显示,是什么原因啊?

解决方案 »

  1.   

    创建函数添加在
    CALLBACK BtnDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam,
                              LPARAM lParam)
    下面时候,没任何反映,但是在主函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 下添加上面代码,运行后变量是运行的,那些变量我都是添加在BtnDlgProc里的,应该运行的。
      

  2.   

    你注册窗口类时回调函数用的是WndProc还是BtnDlgProc
      

  3.   

    注册窗口类时回调函数用是WndProcwindows程序设计上不是说  创建控件不需要注册吗?
    我要是在其他CPP中创建控件也要注册吗?
    谢谢 
      

  4.   

    控件是在主窗口的回调函数中创建, 
    如果主窗口的回调函数不是BtnDlgProc, 则BtnDlgProc中的代码根本不会运行.
      

  5.   

    谢谢 chehw(chehw) 
    我想你说的对,BtnDlgProc不是主窗口的回调函数,我要做的工程是比较大,要想在BtnDlgProc中调用创建函数创建控件,并且把她显示在客户区中,有没有办法??
      

  6.   

    一般在程序中,根据需要可注册若干个窗口类.你可以再注册一个窗口类"btnDlgClass", 将其回调函数指定为BtnDlgProc, 
    在WndProc的WM_CREATE中,创建一个类名为"btnDlgClass"的子窗口hWndBtnDlg, 
    在WM_SIZE中SetWindowPos(hWndBtnDlg, hWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOZORDER);
      

  7.   

    我注册初始化窗口的时候总是报错:说类型不匹配
    代码如下:int InitBtnDlg (HINSTANCE hInstance) {
        WNDCLASS wcl;    // Register application EditWnd window class.
        wcl.style = 0;                             // Window style
        wcl.lpfnWndProc = BtnDlgProc;             // Callback function
        wcl.cbClsExtra = 0;                        // Extra class data
        wcl.cbWndExtra = 0;                        // Extra window data
        wcl.hInstance = hInstance;                 // Owner handle
        wcl.hIcon = NULL,                          // Application icon
        wcl.hCursor = LoadCursor (NULL, IDC_ARROW);// Default cursor
        wcl.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
        wcl.lpszMenuName =  NULL;                  // Menu name
        wcl.lpszClassName = CTRL_STATIC;               // Window class name    if (RegisterClass (&wcl) == 0) return 1;    return 0;
    }
    BOOL CALLBACK BtnDlgProc (HWND hWnd, UINT message, WPARAM wParam,
                              LPARAM lParam) {     static HWND  hwndButton[NUM] ;
         static RECT  rect ;
         static TCHAR szTop[]    = TEXT ("message            wParam       lParam"),
                      szUnd[]    = TEXT ("_______            ______       ______"),
                      szFormat[] = TEXT ("%-16s%04X-%04X    %04X-%04X"),
                      szBuffer[50] ;
         static int   cxChar, cyChar ;
       //  HDC          hdc ;
    //     PAINTSTRUCT  ps ;
         int          i ;
     
     switch (message)
     {

     case WM_CREATE:
     
    temp_Item = B_Mode_Item_en;
     cxChar = LOWORD (GetDialogBaseUnits ()) ;
              cyChar = HIWORD (GetDialogBaseUnits ()) ;
              
              for (i = 0 ; i < NUM ; i++)
                   hwndButton[i] = CreateWindow ( CTRL_STATIC, 
                                      temp_Item[0],
                                       WS_CHILD | WS_VISIBLE | button[i].iStyle,
                                       cxChar, cyChar * (1 + 2 * i),
                                       20 * cxChar, 7 * cyChar / 4,
                                       hWnd, (HMENU) i,
                                       ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
              SetWindowLong (hWnd, DWL_USER, (LONG)hwndButton[i]);
    break;
           }  return TRUE;
    }
    编译后报错:Compiling...
    Menucreate.cpp
    D:\Source\Project\Menucreate.cpp(1211) : error C2440: '=' : cannot convert from 'int (__cdecl *)(struct HWND__ *,unsigned int,unsigned int,long)' to 'long (__cdecl *)(struct HWND__ *,unsigned int,unsigned int,long)'
            This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    Error executing cl.exe.Menucreate.obj - 1 error(s), 0 warning(s)
      

  8.   

    wcl.lpfnWndProc = (WNDPROC)BtnDlgProc;或将BtnDlgProc声明为LRESULT CALLBACK BtnDlgProc(HWND, UINT, WPARAM, LPARAM);同时注意CTRL_STATIC应避免与Windows控件的类名相同
      

  9.   

    chehw(chehw)  你好
    你的建议“你可以再注册一个窗口类  "btnDlgClass  ",  将其回调函数指定为BtnDlgProc, 在WndProc的WM_CREATE中,创建一个类名为  "btnDlgClass  "的子窗口hWndBtnDlg,    
    在WM_SIZE中SetWindowPos(hWndBtnDlg,  hWnd,  0,  0,  LOWORD(lParam),  HIWORD(lParam),  SWP_NOZORDER); ”我想在BtnDlgProc中的WM_CREATE中创建子窗口不可以吗?WM_SIZE中SetWindowPos  也在BtnDlgProc里的可以吗?
      

  10.   

    SDK编程中, 一般应注册多个窗口类, 其中一个为框架窗口(假设其回调函数为WndProc). 这一窗口在WinMain中创建.在WndProc的WM_CREATE中可创建多个子窗口, 每个子窗口可以有自己的回调函数, 并处理相关的功能. 在WM_SIZE中来调整每个子窗口的位置, 这样在加上scrollbar和toolbar后可以简化客户区布局的处理.
    ttnDlgClass可以作为框架窗口的子窗口, 只处理和它相关的操作. 
    ttnDlgClass中也可创建多个子窗口, 对具体的功能加以细化和分工.
      

  11.   

    您的意思我理解,我也能够在WndProc创建子窗口成功。
    我的意思是,能不能直接在其他回调函数,比如LRESULT CALLBACK BtnDlgProc 直接创建控件窗口,并在主框架(WndProc)客户区显示?LRESULT CALLBACK BtnDlgProc 这个回调函数在其他CPP中新加的,我是新接触的,不好意思。我用过别人的代码可以成功,但我不能够显示出来
      

  12.   

    定义一个全局变量HWND g_hFrame; 保存主框架窗口的句柄;
    在stdafx.h中声明extern HWND g_hFrame;假设btnDlgClass窗口已创建(必须创建,但不一定显示出来, 否则BtnDlgProc不会执行),如果在BtnDlgProc的WM_CREATE中创建控件时将CreateWindow中的hwndParent参数指定为g_hFrame, 则该控件可以在主框架窗口的客户区显示.
      

  13.   

    我更糊涂了,在BtnDlgProc中不已经创建一个窗口类并初始化了吗?(int InitBtnDlg (HINSTANCE hInstance)在WndProc  中的WM_CREATE创建一个类名为  "btnDlgClass  "的子窗口hWndBtnDlg ?
    形式是这样吗:HWND hWndBtnDlg
                  WNDCLASS btnDlgClass;
                  hWndBtnDlg=CreateWindow{ }还要加其他语句吗  我这样做了没显示真不好意思麻烦你
      

  14.   

    留个email, 抽空给你写个示例程序
      

  15.   

    x谢谢  我看了
    我把你的程序 基本全部考到我程序里都不能成功运行。
    我用的不是VC6  
    我是在WINCE下  EVC4.0编译的 
    在WINCE中没  WM_NCCREATE  
    我把源程序发给你看下!