遇到个郁闷的问题,手上有段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里该怎么处理这个问题啊?望高手们帮忙解答,谢谢
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里该怎么处理这个问题啊?望高手们帮忙解答,谢谢
解决方案 »
- 【200】选项卡切换时编辑框焦点不会失去
- 急---vc的tabctrl控件可以用鼠标拖动吗,怎么实现?
- 关于ascii和unicode 字符串问题
- 用GetPixel在液晶(LCD)显示器和纯平(CRT)显示器上截取同样画面的像素值竟然不一样!焦急万分~
- 一个多线程socket程序
- 关于TUXEDO问题?
- 多线程,临界区一个应用出现的问题!高手请指教!
- 初学VC,看好了来两本书,请各位帮看看选那一本?或则再推荐几本好书!!!!
- 是不是VC不支持 Template-nest(模板嵌套)?
- 可能有点深度!需要比较熟悉COM的大侠!帮帮忙!
- 客户端同时接受10 台服务器的视频数据,用udp,请问是开启10个线程10个socket接收和开一个线程一个socket接受,是不是都可行?哪个更好呢?
- 如何将内存中字符串形式的XML文件赋给TiXmlDocument?
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正是这么做的。
// 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)是不可以的。这一段上应该没有什么问题
哦,忘记说了,截图中的pThis是执行 pThis= (CPlot *) pCreate->lpCreateParams;的结果。MFC如果执行下去,到pThis->OnCreate(this->m_hWnd)会出错的