鼠标光标在32位但不在64位中变化

时间:2013-11-05 12:09:59

标签: c++ winapi

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

1 个答案:

答案 0 :(得分:3)

来自GetClassLong的MSDN文档:

  

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

简而言之:改为使用GetClassLongPtr

来自GetClassWord的MSDN文档:

  

除了设置为GCW_ATOM的nIndex以外的任何用途,不推荐使用此函数。提供的功能仅用于与16位版本的Windows兼容。应用程序应使用GetClassLongPtr或GetClassLongPtr函数。

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

此外,您对cursor_name的所有作业都相当尴尬。不应该强制转换为非const LPSTR。对于预定义的光标ID,简单的分配应该足够,例如, cursor_name = IDC_ARROW;。对于用户定义的ID,您必须使用MAKEINTRESOURCE

实际加载游标的代码也是错误的(对于32位和64位版本)。您正在尝试加载预定义形状(IDC_ARROW)或用户定义(IDCC_ELXMEN)的游标资源。预定义和用户定义的游标需要最终传递给HINSTANCE的不同LoadCursor参数。您发布的代码似乎不是这种情况(尽管您确实忽略了代码的这一部分)。