none
绘制XP风格界面Combo Box出错 RRS feed

  • 常规讨论

  • 需要绘制xp风格的combo box,然后使用下面的代码来做:

    typedef HANDLE HTHEME;
    typedef HTHEME (__stdcall *OPENTHEMEDATA)(HWND hWnd, LPCWSTR pszClassList);
    typedef HRESULT (__stdcall *CLOSETHEMEDATA)(HTHEME hTheme);
    
    HMODULE hUxTheme = NULL;
    
    // 下面一步获取hUxTheme的值不为NULL
    hUxTheme =     ::LoadLibrary(_T("UxTheme.dll"));
    
    OPENTHEMEDATA  OpenThemeData;
    CLOSETHEMEDATA CloseThemeData;
    
    // 下面一步获取OpenThemeData也不为NULL
    OpenThemeData = (OPENTHEMEDATA)::GetProcAddress(hUxTheme, ("OpenThemeData"));
                // 63 63 72 75 6E 2E 63 6F 6D
    CloseThemeData = (CLOSETHEMEDATA)::GetProcAddress(hUxTheme,("CloseThemeData"));
    
    // 很费解不知为何下面一步hTheme的值为NULL
    HTHEME    hTheme = OpenThemeData(NULL, L"ComboBox"); 
                if (NULL==hTheme)
                {
                    LPVOID lpMsgBuf; 
                    DWORD dw = GetLastError();  
    
                    FormatMessage( 
                        FORMAT_MESSAGE_ALLOCATE_BUFFER |  
                        FORMAT_MESSAGE_FROM_SYSTEM, 
                        NULL, 
                        dw, 
                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
                        (LPTSTR) &lpMsgBuf, 
                        0, NULL );   
                    ::MessageBox(NULL,(LPCTSTR)lpMsgBuf,_T("系统错误"), MB_OK|MB_ICONSTOP);  
                    LocalFree(lpMsgBuf);  
                }
    
    
    

     

    上面的GetLastError函数获取的错误信息的图片如下:


        我很奇怪为何加载动态库和获取函数地址都成功了,为何调用函数失败,导致最终xp风格的combo box绘制失败。在另外一个程序中使用uxtheme.dll却能绘制xp风格的combo box,实在令人奇怪,特向大家请教。

      我的编译环境:Win XP + sp3, VS C++ 2005 + sp1。


    前无古人,后无来者
    2009年4月12日 15:52