本帖最后由 jay314159 于 2011-04-01 11:16:26 编辑

解决方案 »

  1.   

    DialogBoxParam最后一个参数:
    dwlnitParam:指定传递到WM_INITDIALOG消息的lParam参数中的对话框过程的值而不是在你的回调函数WndProc中接收
      

  2.   


    谢谢
    那么我可以用什么方法传递参数呢?
    如果在DoModal中用SetWindowLong(hwnd, GWL_USERDATA, (LONG)this);
    然后在WndProc中用GetWindowLong(hwnd, GWL_WNDPROC);
    那么hwnd怎么得来呢?
      

  3.   

    LRESULT CALLBACK MyDlg::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {    
    switch(uMsg){
    case WM_INITDIALOG:
    m_mydlg = (MyDlg*)lParam;    //把lParam存放在类成员变量
    mydlg->SetHwnd(hWnd);
    break;
    }
    }
      

  4.   

    函数原型:int DialogBoxParam(HINSTANCE hlnstance,LPCTSTR IpTemplateName,HWND hWndParent, DLGPROC IPDialogFunc,LPARAM dwlnitParam);
      参数:
      hlnstance:标识一个模块的事例,该模块的可执行文件含有对话框模板。
      IpTemplateName:标识对话框模板。此参数可以指向一个以NULL结尾的字符串的指针,该字符串指定对话框模扳名,或是指定对话框模板的资源标识符的一个整型值。如果此参数指定了一个资源标识符,则它的高位字一定为零,且低位字一定含有标识符。一定用MAKEINTRESOURDE宏指令创建此值。
      hWndParent:指定拥有对话框的窗口。
      IpDirlogFunc:指向对话框过程的指针。有关更详细的关于对话框过程的信息,请参见DialogProc。
      dwlnitaram:指定传递到WM_INITDIALOG消息的IParam参数中的对话框过程的值。
      

  5.   


    用GWL_USERDATA来传递this也是一种方法,Chrome就用了这种方法,在WndProc里用GetWindowLong(hwnd, GWL_USERDATA)来获取this,hwnd直接用WndProc的第一个参数。
      

  6.   

    不是要封装类的话可以简单的在dlg里加个静态成员,domodal时指向自己。
      

  7.   


    SetWindowLong时hwnd怎么得到呢?