从这些MAKEINTRESOURCE,GetClassLong,LOWORD((LPSTR)cursor_name)和LoadCursor是否与64位不兼容?如果不是那么解决方案是什么,我的代码工作正常32位但不是64位,代码是一个巨大的应用程序,使用的主要功能如上所列... 该函数有参数mouse_form
HCURSOR c_cursor, n_cursor;
LPSTR cursor_name;
switch( mouse_form )
{
case MOUSE_WIN_ARROW:
cursor_name = (LPSTR)IDC_ARROW;
break;
case MOUSE_ARROW:
cursor_name = (LPSTR)IDC_ARROW;
#if (!(defined WIN32) && !(defined WIN64))
if( environ_get_window_id() != -1 ) cursor_name = (LPSTR)IDCC_ELXHND;
#endif
break;
case MOUSE_CURSOR:
cursor_name = (LPSTR)IDC_IBEAM;
break;
case MOUSE_HOURGLASS:
cursor_name = (LPSTR)IDC_WAIT;
break;
case MOUSE_POINTING_HAND:
#if ((defined WIN32) || (defined WIN64))
cursor_name = (LPSTR)IDC_ARROW;
#else
cursor_name = (LPSTR)IDCC_ELXHND;
#endif
break;
case MOUSE_OPEN_HAND:
cursor_name = (LPSTR)IDC_ARROW;
break;
case MOUSE_THIN_CROSS:
cursor_name = (LPSTR)IDC_CROSS;
break;
case MOUSE_THICK_CROSS:
cursor_name = (LPSTR)IDC_CROSS;
break;
case MOUSE_OUTLINED_CROSS:
cursor_name = (LPSTR)IDC_SIZE;
break;
case MOUSE_MENU_ARROW:
cursor_name = (LPSTR)IDCC_ELXMEN;
break;
default:
cursor_name=(LPSTR)MAKEINTRESOURCE( mouse_form );
}
n_cursor = environ_wload_cursor( cursor_name );
#if ((defined WIN32) || (defined WIN64))
if( environ_control->w_param)
c_cursor = (HCURSOR)GetClassLong( environ_control->w_param->awindow,(ELX_LONG) GCLP_HCURSOR );
else
c_cursor = (HCURSOR)GetWindowLong( GetForegroundWindow(),(ELX_LONG) GCLP_HCURSOR );
#else
c_cursor = GetClassWord( environ_control->w_param->awindow, GCW_HCURSOR );
#endif
#if ((defined WIN32) || (defined WIN64))
if( environ_control->w_param)
{
#endif
if( !n_cursor )
{
if( environ_control->win_cptr->window_id == -1 )
{
n_cursor = ewcore_control.orig_cclient;
}
else
{
n_cursor = ewcore_control.orig_cchild;
}
}
else environ_control->win_cptr->prev_cursor = c_cursor;
#if ((defined WIN32) || (defined WIN64))
}
else
{
if( !n_cursor )
{
n_cursor = ewcore_control.orig_cclient;
}
//else
//environ_control->win_cptr->prev_cursor = c_cursor;
}
#endif
#if ((defined WIN32) || (defined WIN64))
if(environ_control->w_param)
SetClassLong( environ_control->w_param->awindow, GCLP_HCURSOR,(ELX_LONG)n_cursor );
else
SetWindowLong( GetForegroundWindow(), GCLP_HCURSOR, (ELX_LONG)n_cursor );
#else
SetClassWord( environ_control->w_param->awindow,GCW_HCURSOR, n_cursor );
#endif
SetCursor( n_cursor );
}
答案 0 :(得分:3)
来自GetClassLong
的MSDN文档:
如果要检索指针或句柄,则此函数已被GetClassLongPtr函数取代。 (指针和句柄在32位Windows上为32位,在64位Windows上为64位。)
简而言之:改为使用GetClassLongPtr
。
来自GetClassWord
的MSDN文档:
除了设置为GCW_ATOM的nIndex以外的任何用途,不推荐使用此函数。提供的功能仅用于与16位版本的Windows兼容。应用程序应使用GetClassLongPtr或GetClassLongPtr函数。
同样适用于SetClassLong
,GetWindowLong
和SetWindowLong
。您需要使用相应的*Ptr
变体替换所有这些变体,以编写与32位64位版本的Windows兼容的代码。
此外,您对cursor_name
的所有作业都相当尴尬。不应该强制转换为非const LPSTR
。对于预定义的光标ID,简单的分配应该足够,例如, cursor_name = IDC_ARROW;
。对于用户定义的ID,您必须使用MAKEINTRESOURCE
。
实际加载游标的代码也是错误的(对于32位和64位版本)。您正在尝试加载预定义形状(IDC_ARROW
)或用户定义(IDCC_ELXMEN
)的游标资源。预定义和用户定义的游标需要最终传递给HINSTANCE
的不同LoadCursor
参数。您发布的代码似乎不是这种情况(尽管您确实忽略了代码的这一部分)。