遇到个郁闷的问题,手上有段SDK给的代码,是用WIN32写的,但是改到MFC后总是不对。请大家指点到底哪里改错了……
MFC强制类型转换的结果是这样的:但是用WIN32转换的结果是这样的:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  // Get the plot object that was saved when the window was created.
  CPlot *pThis = (CPlot *) GetWindowLong(hWnd, GWL_USERDATA);  switch (message) 
  {
    case WM_CREATE:
      {
        // Save away the clock object passed to CreateWindow.
        CREATESTRUCT *pCreate = (CREATESTRUCT *) lParam;  
        SetWindowLong(hWnd, GWL_USERDATA, 
          (long) pCreate->lpCreateParams);        pThis = (CPlot *) pCreate->lpCreateParams;
      }      // If plot initialization fails, exit.
      if (!pThis->OnCreate(hWnd))
        DestroyWindow(hWnd);
      // Register for timer messages once a second.
      break;
      return 0;
  }
}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ //....省略掉系统自动生成的代码
//My code here
CPlot* pThis;
// Save away the clock object passed to CreateWindow.
CREATESTRUCT *pCreate = (CREATESTRUCT *) lpCreateStruct;  
SetWindowLong(this->m_hWnd, GWL_USERDATA, 
(long) pCreate->lpCreateParams); pThis = (CPlot *) pCreate->lpCreateParams;
// If plot initialization fails, exit.
if (!pThis->OnCreate(this->m_hWnd))
this->DestroyWindow();
// Register for timer messages once a second.
return 0;
}
这里问题有几个,请老大们帮忙解释下,小弟实在不懂
1.一个是强制类型转换结果为什么两者不同?
2.MFC里的OnCreate和Win32的WM_CREATE消息有什么不同?
3.这段代码我通过重写这个类的WindowProc过程,捕获WM_CREATE消息,然后按WIN32的做法做还是不对,MFC的WindowProc过程和Win32的WndProc过程是否相同?
4.WndProc过程顶部的代码在MFC里应该放在哪儿?他是每次进入消息循环就做的吧,而且每次值可能不同,所以要多次赋值,不能通过MFC的构造函数初始化,这里又不是全局的,不知道MFC里该怎么处理这个问题啊?望高手们帮忙解答,谢谢

解决方案 »

  1.   

    你在WM_CREATE中调用一个OnCreate函数,那就一样了。你强制转换的二者不是一样东西,怎么会一样呢?如果没记错,你就是在CreateWindow之后再SetWindowLong设置GWL_USERDATA的。CreateWindow有个参数LPVOID lpParam,你可以通过这个传递给WM_CREATE消息:
    lpParam
    [in] Pointer to a value to be passed to the window through the CREATESTRUCT structure passed in the lpParam parameter the WM_CREATE message. If an application calls CreateWindow to create a multiple-document interface (MDI) client window, lpParam must point to a CLIENTCREATESTRUCT structure. 
    MFC的OnCreate正是这么做的。
      

  2.   

    谢谢楼上的回答。你让我在WM_CREATE中调用OnCreate函数,但是MFC自动生成的OnCreate传入的参数不就是一个lpCreateStruct,看命名规则就是一个指向CreateStruct的指针。那么和WIN32代码应该没有什么区别的说。WIN32的lParam不就是一个指向CreateStruct的指针,现在MFC不也是?所以我怎么总觉得在强制转换同一样东西,不知我这里哪里理解错了。另外一点,直接写在WndProc下的那句话怎么处理啊,每次进入消息循环的时候都要执行,MFC里有这样的消息么,我写到MFC的WindowProc下行么?
      

  3.   

    你的调用:pThis->OnCreate(hWnd);MFC的调用类似:pThis->OnCreate(lParam),不是一个东西。
      

  4.   

    我的WIN32代码上市传入了一个窗体句柄
    // If plot initialization fails, exit.
    if (!pThis->OnCreate(hWnd))
    所以我的MFC代码用
    // If plot initialization fails, exit.
    if (!pThis->OnCreate(this->m_hWnd))这里的m_hWnd(CWnd->m_hWnd)不就是WIN32的hWnd么。因为OnCreate没有传入LPARAM的重载,所以pThis->OnCreate(lParam)是不可以的。这一段上应该没有什么问题
      

  5.   

    你传入hWnd,就只能还原为hWnd,但是你强转为其他类型,就不对了。
      

  6.   

    代码里我强制转化的不是hWnd句柄,而是OnCreate传入的那个参数。首先,Win32中WM_CREATE消息的LPARAM就是MFC中OnCreate函数传入的lpCreateStruct。所以WIN32里我把LPARAM强转成了CREATESTRUCT,而MFC里我把lpCreateStruct也强转成了CREATESTRUCT至于后面的pThis->OnCreate(HWND)函数都是传入了一个窗口句柄,这个窗体句柄没有强制转换过。
    哦,忘记说了,截图中的pThis是执行 pThis= (CPlot *) pCreate->lpCreateParams;的结果。MFC如果执行下去,到pThis->OnCreate(this->m_hWnd)会出错的
      

  7.   

    我也遇到这个问题,估计是程序等调用完CreateWindow才会设置成员hWnd,而OnCreate是在调用CreateWindow时候就已经调用了,就是这个时候hWnd还没有设置吧,估计是,但是也不敢保证,因为如果那样hwnd应该是0才对