1

从这些 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 );
}
4

1 回答 1

4

来自 MSDN 文档GetClassLong

如果您正在检索指针或句柄,则此函数已被 GetClassLongPtr 函数取代。(指针和句柄在 32 位 Windows 上为 32 位,在 64 位 Windows 上为 64 位。)

简而言之:GetClassLongPtr改为使用。

来自 MSDN 文档GetClassWord

除了设置为 GCW_ATOM 的 nIndex 之外,不推荐使用此函数。提供该功能只是为了与 16 位版本的 Windows 兼容。应用程序应使用 GetClassLongPtr 或 GetClassLongPtr 函数。

这同样适用于SetClassLong和。您需要将所有这些替换为相应的变体,以编写与 32 位 64 位版本的 Windows 兼容的代码。GetWindowLongSetWindowLong*Ptr

此外,你所有的任务cursor_name都相当尴尬。不应该对非常量进行强制 LPSTR转换。对于预定义的游标 ID,一个简单的分配就足够了,例如cursor_name = IDC_ARROW;. 对于用户定义的 ID,您必须使用MAKEINTRESOURCE.

实际加载光标的代码也是错误的(对于 32 位和 64 位构建)。您正在尝试加载预定义形状 ( IDC_ARROW) 或用户定义 ( IDCC_ELXMEN) 的光标资源。预定义游标和用户定义游标需要不同的HINSTANCE参数,最终传递给LoadCursor. 您发布的代码似乎并非如此(尽管您确实省略了那部分代码)。

于 2013-11-05T12:28:17.650 回答