Win32 OpenGL窗口生锈:无法加载某些函数指针 #[cfg(windows)]外部机箱winapi; #[cfg(windows)]使用winapi::shared::windef::HWND; #[cfg(windows)]使用winapi::s

Win32 OpenGL窗口生锈:无法加载某些函数指针 #[cfg(windows)]外部机箱winapi; #[cfg(windows)]使用winapi::shared::windef::HWND; #[cfg(windows)]使用winapi::s,winapi,opengl,rust,Winapi,Opengl,Rust,Win32 OpenGL窗口生锈:无法加载某些函数指针 #[cfg(windows)]外部机箱winapi; #[cfg(windows)]使用winapi::shared::windef::HWND; #[cfg(windows)]使用winapi::shared::windef::HMENU; #[cfg(windows)]使用winapi::shared::windef::HBRUSH; #[cfg(windows)]使用winapi::shared::minwindef::HINSTAN

Win32 OpenGL窗口生锈:无法加载某些函数指针
#[cfg(windows)]外部机箱winapi;
#[cfg(windows)]使用winapi::shared::windef::HWND;
#[cfg(windows)]使用winapi::shared::windef::HMENU;
#[cfg(windows)]使用winapi::shared::windef::HBRUSH;
#[cfg(windows)]使用winapi::shared::minwindef::HINSTANCE;
#[cfg(windows)]使用winapi::shared::minwindef::UINT;
#[cfg(windows)]使用winapi::shared::minwindef::DWORD;
#[cfg(windows)]使用winapi::shared::minwindef::WPARAM;
#[cfg(windows)]使用winapi::shared::minwindef::LPARAM;
#[cfg(windows)]使用winapi::shared::minwindef::LRESULT;
#[cfg(windows)]使用winapi::um::winnt::LPCWSTR;
#[cfg(windows)]使用winapi::um::winuser::WS\u重叠窗口;
#[cfg(windows)]使用winapi::um::winuser::WS_VISIBLE;
#[cfg(windows)]使用winapi::um::winuser::WNDCLASSW;
#[cfg(windows)]使用std::os::windows::ffi::OsStrExt;
#[cfg(windows)]使用std::ffi::OsStr;
#[cfg(windows)]使用std::os::raw::c_void;
#[cfg(windows)]使用winapi::um::libloaderapi::GetProcAddress;
#[cfg(windows)]使用gl::Type::*;
//顶点数据
静态顶点_数据:[GLfloat;6]=[0.0,0.5,0.5,-0.5,-0.5,-0.5,-0.5];
//着色器源
静态VS_SRC:&'static str='
#版本150
在vec2位置;
void main(){
gl_位置=vec4(位置,0.0,1.0);
}";
静态FS_SRC:&'static str='
#版本150
out vec4 out_颜色;
void main(){
out_color=vec4(1.0,1.0,1.0,1.0);
}";
德国劳埃德船级社
{
包括!(concat!(env!(“OUT_DIR”),“/bindings.rs”);
}
#[cfg(windows)]
fn到字符串(str:&str)->Vec
{
让我们来看一下:Vec=
OsStr::new(str).encode_wide().chain(Some(0).into_iter()).collect();
v
}
#[cfg(windows)]
发布不安全外部“系统”fn窗口程序(h\U wnd:HWND,
msg:UINT,w_参数:WPARAM,l_参数:LPARAM)->LRESULT
{
如果msg==winapi::um::winuser::WM\u{
winapi::um::winuser::PostQuitMessage(0i32);
}
返回winapi::um::winuser::DefWindowProcW(h_wnd,msg,w_param,l_param);
}
fn绘制场景(窗口宽度:i32,窗口高度:i32,
h_dc:winapi::shared::windef::HDC)
{
不安全的
{
让module=winapi::um::libloaderapi::LoadLibraryW(to_wstring(“opengl32.dll”).as_ptr();
//gl::使用(| s | GetProcAddress)加载_(模块,
//s.as_ptr()as*const i8)as*const c_void);
gl::Viewport::使用(| s | GetProcAddress)加载_(模块,
s、 as_ptr()as*const i8)as*const c_void);
如果gl::Viewport::已加载(){
gl::视口(0,0,窗宽,窗高);
}否则{
惊慌失措!(“未加载gl::Viewport”)
}
gl::ClearColor::使用(| s | GetProcAddress)加载_(模块,
s、 as_ptr()as*const i8)as*const c_void);
如果gl::ClearColor::已加载(){
gl::ClearColor(0.12109375f32、0.12109375f32、0.12109375f32、1.0f32);
}否则{
惊慌失措!(“gl::ClearColor未加载”)
}
gl::GetError::使用(| s | GetProcAddress)加载_(模块,
s、 as_ptr()as*const i8)as*const c_void);
让错误检查值:GLenum=gl::GetError();
/*
gl::CreateShader::使用(| s | GetProcAddress)加载_(模块,
s、 as_ptr()as*const i8)as*const c_void);
让mut vertex_shader_id=0u32;
如果gl::CreateShader::已加载(){
顶点着色器\u id=gl::CreateShader(gl::顶点着色器);
}否则{
惊慌失措!(“未加载gl::CreateShader”)
}
*/
/*
让c_str=std::ffi::CString::new(VS_SRC.as_bytes()).unwrap();
gl::ShaderSource::使用(| s | GetProcAddress)加载_(模块,
s、 as_ptr()as*const i8)as*const c_void);
如果gl::ShaderSource::已加载(){
gl::ShaderSource(顶点着色器id,1,&c_str.as_ptr(),std::ptr::null_mut());
}否则{
//恐慌!(“未加载gl::ShaderSource”)
}
gl::CompileShader::使用(| s | GetProcAddress)加载_(模块,
s、 as_ptr()as*const i8)as*const c_void);
如果gl::CompileShader::已加载(){
gl::CompileShader(顶点着色器id);
}否则{
//惊慌失措!(“未加载gl::CompileShader”)
}
设mut-vertex_-array_-id:GLuint=0u32;
gl::GenVertexArray::使用(| s | GetProcAddress)加载_(模块,
s、 as_ptr()as*const i8)as*const c_void);
如果gl::GenVertexArrays::已加载(){
gl::genvertexarray(1,&mut vertex_数组_id为*mut u32);
}否则{
惊慌失措!(“未加载gl::GenVertexArray”)
}
*/
gl::Clear::使用(| s | GetProcAddress)加载_(模块,
s、 as_ptr()as*const i8)as*const c_void);
如果gl::Clear::已加载(){
gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT |;
}否则{
惊慌失措!(“未加载gl::Clear”)
}
winapi::um::wingdi::SwapBuffers(h_dc);
}
}
fn main()
{
不安全的
{
让class_name=to_wstring(“OpenGL”);
让h_instance=winapi::um::libloaderapi::GetModuleHandleW(std::ptr::null_mut());
设wnd=WNDCLASSW{
样式:0,
lpfnWndProc:一些(窗口程序),
cbClsExtra:0,
cbWndExtra:0,
hInstance:h_实例,
hIcon:winapi::um::winuser::LoadIconW(0作为HINSTANCE,
winapi::um::winuser::IDI_应用程序),
hCursor:winapi::um::winuser::LoadCursorW(0作为HINSTANCE,
winapi::um::winuser::IDI_应用程序),
hbrBackground:16作为HBRUSH,
LPSzMenuame:0作为LPCWSTR,
lpszClassName:class_name.as_ptr(),
};
winapi::um::winuser::RegisterClassW(&wnd);
设窗宽=640;
让窗户高度=480;
设h_wnd_window=winapi::um::winuser::CreateWindowExW(0,类名称.as_ptr(),
作为_ptr(),WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0,0,窗口宽度,
#[cfg(windows)] extern crate winapi;

#[cfg(windows)] use winapi::shared::windef::HWND;
#[cfg(windows)] use winapi::shared::windef::HMENU;
#[cfg(windows)] use winapi::shared::windef::HBRUSH;
#[cfg(windows)] use winapi::shared::minwindef::HINSTANCE;

#[cfg(windows)] use winapi::shared::minwindef::UINT;
#[cfg(windows)] use winapi::shared::minwindef::DWORD;
#[cfg(windows)] use winapi::shared::minwindef::WPARAM;
#[cfg(windows)] use winapi::shared::minwindef::LPARAM;
#[cfg(windows)] use winapi::shared::minwindef::LRESULT;
#[cfg(windows)] use winapi::um::winnt::LPCWSTR;

#[cfg(windows)] use winapi::um::winuser::WS_OVERLAPPEDWINDOW;
#[cfg(windows)] use winapi::um::winuser::WS_VISIBLE;
#[cfg(windows)] use winapi::um::winuser::WNDCLASSW;

#[cfg(windows)] use std::os::windows::ffi::OsStrExt;
#[cfg(windows)] use std::ffi::OsStr;

#[cfg(windows)] use std::os::raw::c_void;
#[cfg(windows)] use winapi::um::libloaderapi::GetProcAddress;
#[cfg(windows)] use gl::types::*;

// Vertex data
static VERTEX_DATA: [GLfloat; 6] = [0.0, 0.5, 0.5, -0.5, -0.5, -0.5];

// Shader sources
static VS_SRC: &'static str = "
#version 150
in vec2 position;
void main() {
    gl_Position = vec4(position, 0.0, 1.0);
}";

static FS_SRC: &'static str = "
#version 150
out vec4 out_color;
void main() {
    out_color = vec4(1.0, 1.0, 1.0, 1.0);
}";

mod gl
{
    include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
}

#[cfg(windows)]
fn to_wstring(str : &str) -> Vec<u16>
{
    let v : Vec<u16> =
            OsStr::new(str).encode_wide().chain(Some(0).into_iter()).collect();
    v
}

#[cfg(windows)]
pub unsafe extern "system" fn window_proc(h_wnd :HWND,
    msg :UINT, w_param :WPARAM, l_param :LPARAM) -> LRESULT
{
    if msg == winapi::um::winuser::WM_DESTROY {
        winapi::um::winuser::PostQuitMessage(0i32);
    }
    return winapi::um::winuser::DefWindowProcW(h_wnd, msg, w_param, l_param);
}

fn draw_gl_scene(window_width: i32, window_height: i32,
        h_dc: winapi::shared::windef::HDC)
{
    unsafe
    {
        let module = winapi::um::libloaderapi::LoadLibraryW(to_wstring("opengl32.dll")  .as_ptr());

        // gl::load_with(|s| GetProcAddress(module,
        //         s.as_ptr() as *const i8) as *const c_void);

        gl::Viewport::load_with(|s| GetProcAddress(module,
                s.as_ptr() as *const i8) as *const c_void);
        if gl::Viewport::is_loaded() {
            gl::Viewport(0, 0, window_width, window_height);
        } else {
            panic!("gl::Viewport was not loaded")
        }

        gl::ClearColor::load_with(|s| GetProcAddress(module,
                s.as_ptr() as *const i8) as *const c_void);
        if gl::ClearColor::is_loaded() {
            gl::ClearColor(0.12109375f32, 0.12109375f32, 0.12109375f32, 1.0f32);
        } else {
            panic!("gl::ClearColor was not loaded")
        }

        gl::GetError::load_with(|s| GetProcAddress(module,
                s.as_ptr() as *const i8) as *const c_void);
        let error_check_value: GLenum = gl::GetError();

        /*
        gl::CreateShader::load_with(|s| GetProcAddress(module,
                s.as_ptr() as *const i8) as *const c_void);
        let mut vertex_shader_id = 0u32;
        if gl::CreateShader::is_loaded() {
            vertex_shader_id = gl::CreateShader(gl::VERTEX_SHADER);
        } else {
            panic!("gl::CreateShader was not loaded")
        }
        */

        /*
        let c_str = std::ffi::CString::new(VS_SRC.as_bytes()).unwrap();
        gl::ShaderSource::load_with(|s| GetProcAddress(module,
                s.as_ptr() as *const i8) as *const c_void);
        if gl::ShaderSource::is_loaded() {
            gl::ShaderSource(vertex_shader_id, 1, &c_str.as_ptr(), std::ptr::null_mut());
        } else {
            // panic!("gl::ShaderSource was not loaded")
        }
        gl::CompileShader::load_with(|s| GetProcAddress(module,
                s.as_ptr() as *const i8) as *const c_void);
        if gl::CompileShader::is_loaded() {
            gl::CompileShader(vertex_shader_id);
        } else {
            // panic!("gl::CompileShader was not loaded")
        }
        let mut vertex_array_id: GLuint = 0u32;
        gl::GenVertexArrays::load_with(|s| GetProcAddress(module,
                s.as_ptr() as *const i8) as *const c_void);
        if gl::GenVertexArrays::is_loaded() {
            gl::GenVertexArrays(1, &mut vertex_array_id as *mut u32);
        } else {
            panic!("gl::GenVertexArrays was not loaded")
        }
        */

        gl::Clear::load_with(|s| GetProcAddress(module,
                s.as_ptr() as *const i8) as *const c_void);
        if gl::Clear::is_loaded() {
            gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT |     gl::STENCIL_BUFFER_BIT);
        } else {
            panic!("gl::Clear was not loaded")
        }
        winapi::um::wingdi::SwapBuffers(h_dc);
    }
}

fn main()
{
  unsafe
  {
    let class_name = to_wstring("OpenGL");

    let h_instance = winapi::um::libloaderapi::GetModuleHandleW(std::ptr::null_mut());
    let wnd = WNDCLASSW {
        style: 0,
        lpfnWndProc: Some(window_proc),
        cbClsExtra: 0,
        cbWndExtra: 0,
        hInstance: h_instance,
        hIcon: winapi::um::winuser::LoadIconW(0 as HINSTANCE,
                                              winapi::um::winuser::IDI_APPLICATION),
        hCursor: winapi::um::winuser::LoadCursorW(0 as HINSTANCE,
                                                  winapi::um::winuser::IDI_APPLICATION),
        hbrBackground: 16 as HBRUSH,
        lpszMenuName: 0 as LPCWSTR,
        lpszClassName: class_name.as_ptr(),
    };

    winapi::um::winuser::RegisterClassW(&wnd);

    let window_width = 640;
    let window_height = 480;
    let h_wnd_window = winapi::um::winuser::CreateWindowExW(0, class_name.as_ptr(),
                       to_wstring("OpenGL Example").as_ptr(), WS_OVERLAPPEDWINDOW |     WS_VISIBLE,
                       0, 0, window_width, window_height, 0 as HWND, 0 as HMENU,    h_instance,
                       std::ptr::null_mut());

    let mut msg = winapi::um::winuser::MSG {
        hwnd : 0 as HWND,
        message : 0 as UINT,
        wParam : 0 as WPARAM,
        lParam : 0 as LPARAM,
        time : 0 as DWORD,
        pt : winapi::shared::windef::POINT { x: 0, y: 0, },
    };

    let h_dc = winapi::um::winuser::GetDC(h_wnd_window);
    let pfd = winapi::um::wingdi::PIXELFORMATDESCRIPTOR {
        nSize: std::mem::size_of::<winapi::um::wingdi::PIXELFORMATDESCRIPTOR>() as u16,
        nVersion: 1,
        dwFlags: winapi::um::wingdi::PFD_DRAW_TO_WINDOW
                | winapi::um::wingdi::PFD_SUPPORT_OPENGL |  winapi::um::wingdi::PFD_DOUBLEBUFFER,
        iPixelType: winapi::um::wingdi::PFD_TYPE_RGBA,
        cColorBits: 64,
        cRedBits: 0,
        cRedShift: 0,
        cGreenBits: 0,
        cGreenShift: 0,
        cBlueBits: 0,
        cBlueShift: 0,
        cAlphaBits: 0,
        cAlphaShift: 0,
        cAccumBits: 0,
        cAccumRedBits: 0,
        cAccumGreenBits: 0,
        cAccumBlueBits: 0,
        cAccumAlphaBits: 0,
        cDepthBits: 32,
        cStencilBits: 8,
        cAuxBuffers: 0,
        iLayerType: winapi::um::wingdi::PFD_MAIN_PLANE,
        bReserved: 0,
        dwLayerMask: 0,
        dwVisibleMask: 0,
        dwDamageMask: 0,
    };

    let pixel_format = winapi::um::wingdi::ChoosePixelFormat(h_dc,
            &pfd as *const winapi::um::wingdi::PIXELFORMATDESCRIPTOR);
    winapi::um::wingdi::SetPixelFormat(h_dc, pixel_format,
            &pfd as *const winapi::um::wingdi::PIXELFORMATDESCRIPTOR);
    let h_rc = winapi::um::wingdi::wglCreateContext(h_dc);
    winapi::um::wingdi::wglMakeCurrent(h_dc, h_rc);
    winapi::um::winuser::ShowWindow(h_wnd_window, winapi::um::winuser::SW_SHOW);

    loop
    {
        if winapi::um::winuser::PeekMessageW(&mut msg, 0u32 as HWND, 0u32, 0u32,
                                             winapi::um::winuser::PM_REMOVE) > 0i32 {
            if msg.message == winapi::um::winuser::WM_QUIT {
                break;
            } else {
                winapi::um::winuser::TranslateMessage(&mut msg);
                winapi::um::winuser::DispatchMessageW(&mut msg);
            }

        } else {
            draw_gl_scene(window_width, window_height, h_dc);
        }
    }
  }
}