C++学习(一五一)hwnd hdc hglrc

    科技2026-10-03  6

    HWND:h是类型描述,表示句柄(handle),Wnd是变量对象描述,表示窗口,所以hWnd表示窗口句柄。Microsoft Windows运行环境,通过给应用程序中的每个窗体和控件分配一个句柄来标识他们。hWnd属性用于Windows API调用。许多Windows运行环境函数需要活动窗口的hWnd作为参数。在Windows环境中,句柄是用来标识项目的,这些项目包括:             *.模块(module)             *.任务(task)             *.实例(instance)             *.文件(file)             *.内存块(block   of   memory)             *.菜单(menu)             *.控制(control)             *.字体(font)             *.资源(resource),包括图标(icon),光标(cursor),字符串(string)等             *.GDI对象(GDI   object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域(region),以及设备描述表(device   context)。  

    HDC:设备上下文是一种包含有关某个设备的绘制属性信息的Windows数据结构。所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条,形状和文本的Windows API。它并没有直接映射到显卡、显示器等硬件设备,而是映射到一种内存虚拟结构(可以认为就是一个窗口)。

    HGLRC:图形操作描述表。OpenGL Render Contex。在Windows下用GDI作图必须通过DC调用相应的函数;用OpenGL作图也是类似,OpenGL函数是通过Render Context完成三维图形的绘制。Windows下的窗口和设备上下文支持“位图格式”(PIXELFORMAT)属性,和RC有着位图结构上的一致。只要在创建RC时与一个DC建立联系,OpenGL的函数就可以通过RC对应的DC画到相应的显示设备上。

    hWnd是windows给窗口发送消息(事件)用的 hDC是把窗口绘制在屏幕上用的。

    HGLRC是opengl用的。

    在通用型的象素格式下,所有的象素格式和渲染上下文都是通过GDI来实现的。在设备型象素格式下,多数操作是通过设备来实现的。在OpenGL绘图的时候,窗口,位图或设备的象素格式必须设置好,然后产生一个渲染上下文,这之后绘图功能才能生效。

    DC用来产生OpenGL 的渲染上下文,OpenGL使用这个渲染上下文在DC上绘图,最后DC把图形绘制在设备显示上。

    _hwnd = ::CreateWindowEx(extendedStyle, _traits->useCursor ? Win32WindowingSystem::osgGraphicsWindowWithCursorClass.c_str() : Win32WindowingSystem::osgGraphicsWindowWithoutCursorClass.c_str(), _traits->windowName.c_str(), windowStyle, _windowOriginXToRealize, _windowOriginYToRealize, _windowWidthToRealize, _windowHeightToRealize, NULL, NULL, ::GetModuleHandle(NULL), NULL); if (_hwnd==0) { reportErrorForScreen("GraphicsWindowWin32::createWindow() - Unable to create window", _traits->screenNum, ::GetLastError()); return false; } _hdc = ::GetDC(_hwnd); if (_hdc==0) { reportErrorForScreen("GraphicsWindowWin32::createWindow() - Unable to get window device context", _traits->screenNum, ::GetLastError()); destroyWindow(); _hwnd = 0; return false; } // // Set the pixel format according to traits specified // if (!setPixelFormat()) { ::ReleaseDC(_hwnd, _hdc); _hdc = 0; destroyWindow(); return false; } // // Create the OpenGL rendering context associated with this window // _hglrc = createContextImplementation(); if (_hglrc==0) { reportErrorForScreen("GraphicsWindowWin32::createWindow() - Unable to create OpenGL rendering context", _traits->screenNum, ::GetLastError()); ::ReleaseDC(_hwnd, _hdc); _hdc = 0; destroyWindow(); return false; }

    关于RC有以下需要注意的地方:

    1.一个线程只能拥有一个RC,也就是说,用户如果在一个线程内对不同设备作图,只能通过变更与RC对应的DC来完成,而RC在线程中保持不变。

    2.设定DC位图格式等于设定了相应窗口的位图格式,并且DC和窗口的位图格式一旦确认就不能再改变。

    3.一个RC虽然可以更换DC,但在任何时刻只能利用一个DC,但由于一个窗口可以让多个DC作图从而可以让多个线程利用多个RC在该窗口上执行OpenGL操作。

    4.当使用双缓存用OpenGL产生动画时,不能使用GDI函数向该DC作图。

    在使用OpenGL进行绘图之前,需要设置窗口的类型属性中的WS_CLIPCHILDREN和WS_CLIPSIBLINGS,否则函数SetPixelFormat的调用将失败。

    着色正文与设备正文有着相同的象素格式。

     

     

     

    Processed: 0.009, SQL: 9