vtk中的win32窗口
在用VS ide新建win32工程的选项中,一个叫“Win32控制台应用程序”,另一个叫“Win32应用程序”,其区别的细节这里跳过不讲,最显著的就是win32控制台没有GUI窗口,只弹出一个命令行黑框;而win32应用程序有GUI窗口,但没黑框。
但是!如以下demo,vtk example中统统都有命令行黑窗口,又有GUI显示窗口。都是win32控制台工程,它的GUI显示窗口是从哪儿来的呢?
int main(int , char *[])
{//↓↓↓↓↓↓↓↓↓↓double p0[3] = {0.0, 0.0, 0.0};double p1[3] = {1.0, 0.0, 0.0};double p2[3] = {1.0, 1.0, 0.0};double p3[3] = {0.0, 1.0, 0.0};// Add the points to a vtkPoints objectvtkPoints *points = vtkPoints::New();... ... ... ...//↑↑↑↑↑以上都是数据结构,未见OPENGL相关绘制内容↑↑↑↑// Setup actor and mapper // 反射机制 在win32下自动反射到vtkOpenGLPolyDataMapper,这里有传统的OPENGL代码vtkPolyDataMapper*mapper = vtkPolyDataMapper::New();mapper->SetInput(polydata);vtkActor*actor = vtkActor::New();actor->SetMapper(mapper);// Setup render window, renderer, and interactorvtkRenderer*renderer =vtkRenderer::New();vtkRenderWindow*renderWindow =vtkRenderWindow::New();renderWindow->SetWindowName("Quad");renderWindow->AddRenderer(renderer);vtkRenderWindowInteractor*renderWindowInteractor = vtkRenderWindowInteractor::New();renderWindowInteractor->SetRenderWindow(renderWindow);renderer->AddActor(actor);renderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;
}
最初,我一直觉得理所当然,因为VTK的底层是OpenGL嘛,当然是OpenGL的窗口啦,那丑不拉几的样子,一看就是OpenGL的窗口,网上所有的OpenGL教程都长这个样子。随着慢慢对OpenGL的了解,发现我又一次被表象蒙蔽了,事实并不是看到的这样,只是长的像而已。。。凡是用到OpenGL显示的程序,都会绑定另外一个包含UI的框架,类似GLUT,Qt,MFC,FLTK,OpenGL自己是不能显示出来的!!!必须绑定一个UI!!!必须绑定一个UI!!!必须绑定一个UI!!!NND,鄙人愚笨,被忽悠这么多年,一直以为OpenGL自己就能绘制窗口。
OpenGL只负责绘制场景,并不会负责窗口,窗口是另外一个框架的。想要在桌面上看到OpenGL场景,就必须与一个绘制UI的框架绑定!
下面看看vtk example为什么能在Win32控制台应用程序下弹出窗口+命令行:
找到类vtkWin32OpenGLRenderWindow,根据名字就可以知道这个类的功能:vtk + Win32 + OpenGL + RenderWindow,可以理解为vtk在win32下将OpenGL与RenderWindow绑定!
// Initialize the window for rendering.
void vtkWin32OpenGLRenderWindow::WindowInitialize (void)
{int x, y, width, height;GLenum type;static int count = 1;char *windowName;x = ((this->Position[0] >= 0) ? this->Position[0] : 5);y = ((this->Position[1] >= 0) ? this->Position[1] : 5);width = ((this->Size[0] > 0) ? this->Size[0] : 300);height = ((this->Size[1] > 0) ? this->Size[1] : 300);// create our own window if not already setif (!this->WindowId){WNDCLASS wndClass;int len = strlen( "Visualization Toolkit - Win32OpenGL #") + (int)ceil( (double) log10( (double)(count+1) ) )+ 1; windowName = new char [ len ];sprintf(windowName,"Visualization Toolkit - Win32OpenGL #%i",count++);this->SetWindowName(windowName);delete [] windowName;// has the class been registered ?if (!GetClassInfo(this->ApplicationInstance,"vtkOpenGL",&wndClass)){wndClass.style = CS_HREDRAW | CS_VREDRAW;wndClass.lpfnWndProc = vtkWin32OpenGLRenderWindow::WndProc;wndClass.cbClsExtra = 0;wndClass.hInstance = this->ApplicationInstance;wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);wndClass.lpszMenuName = NULL;wndClass.lpszClassName = "vtkOpenGL";// vtk doesn't use these extra 4 bytes, but app writers// may want them, so we provide them.wndClass.cbWndExtra = 4;RegisterClass(&wndClass);}// use real mutexvtkWin32OpenGLRenderWindow::WindowMutex->Lock();if (vtkWin32OpenGLRenderWindow::TempPointerToThis){vtkErrorMacro("Two windows being created at the same time");}vtkWin32OpenGLRenderWindow::TempPointerToThis = this;/* create window */if (this->ParentId){this->WindowId = CreateWindow("vtkOpenGL", this->WindowName,WS_CHILD | WS_CLIPCHILDREN /*| WS_CLIPSIBLINGS*/,x, y, width, height,this->ParentId, NULL, this->ApplicationInstance, NULL);}else{this->WindowId = CreateWindow("vtkOpenGL", this->WindowName,WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN /*| WS_CLIPSIBLINGS*/,x,y, width+2*GetSystemMetrics(SM_CXFRAME),height+2*GetSystemMetrics(SM_CYFRAME) +GetSystemMetrics(SM_CYCAPTION),NULL, NULL, this->ApplicationInstance, NULL);}vtkWin32OpenGLRenderWindow::TempPointerToThis = NULL;vtkWin32OpenGLRenderWindow::WindowMutex->Unlock();if (!this->WindowId){vtkErrorMacro("Could not create window, error: " << GetLastError());return;}// extract the create info/* display window */ShowWindow(this->WindowId, SW_SHOW);//UpdateWindow(this->WindowId);this->OwnWindow = 1;}else{SetWindowLong(this->WindowId,GWL_USERDATA,(LONG)this);this->DeviceContext = GetDC(this->WindowId);if (this->StereoCapableWindow){this->SetupPixelFormat(this->DeviceContext, PFD_SUPPORT_OPENGL |PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER |PFD_STEREO, this->GetDebug(), 32, 32);}else{this->SetupPixelFormat(this->DeviceContext, PFD_SUPPORT_OPENGL |PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER,this->GetDebug(), 32, 32);}this->SetupPalette(this->DeviceContext);this->ContextId = wglCreateContext(this->DeviceContext);wglMakeCurrent(this->DeviceContext, this->ContextId);this->OpenGLInit();}this->Mapped = 1;} else {wglMakeCurrent(this->DeviceContext, this->ContextId); // hsrthis->OpenGLInit();}// set the DPIthis->SetDPI(GetDeviceCaps(this->DeviceContext, LOGPIXELSY));
}
上面这段代码就是创建win32窗口的方法,能清晰的看到
1、WNDCLASS,CreateWindow,SetupPixelFormat,
窗口win32应用窗口的接口函数,也是常见的标准方法。
2、wglCreateContext,wglMakeCurrent。
调用windows系统中的gl接口。
3、OpenGLInit初始化函数
void vtkWin32OpenGLRenderWindow::OpenGLInit()
{glMatrixMode( GL_MODELVIEW );glDepthFunc( GL_LEQUAL );glEnable( GL_DEPTH_TEST );glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
.......
}
解释到这里,应该算比较清楚了,vtk在“Win32控制台应用程序”中,调用win32应用程序窗口窗口的接口,自己画了一个UI,然后把OpenGL绑上去。
貌似有一段时间没写blog了~
看破游戏规则,回归核心价值。
“如果给我1个小时解答一道决定我生死的问题,我会花55分钟来弄清楚这道题到底是在问什么。”
---爱因斯坦?
vtk中的win32窗口相关推荐
- 在C#中调用Win32函数EnumWindows枚举所有窗口。
原文 http://www.cnblogs.com/mfm11111/archive/2009/06/30/1514322.html 开发旺旺群发软件,难点及重要技术点分析(一) 一. ...
- 在控制台程序中隐藏控制台窗口
在控制台程序中隐藏控制台窗口 大家都知道,当编写一个win32 console application时,当运行此类程序的时候 默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只 ...
- Win32窗口编程基础知识——主函数
2019独角兽企业重金招聘Python工程师标准>>> 虽然说编程重要的是思想,用什么语言实现都是鸡肋,但是并不是说你对一个语言一点也不会看一遍就可以精通,我的经历就是以前只注意C/ ...
- Win32窗口--XBox游戏手柄--C++--方向轮和按键捕获
文章目录 1.关键函数 1.1 joySetCapture 1.2 joyReleaseCapture 2.游戏窗口消息 3.简单案例 4.作者答疑 在 WINDOWS 下编程控制游戏手柄比较主流 ...
- 《OpenGL v1.1》——(1)接入Win32窗口,并描绘基本图元
准备: 创建OpenGL窗口的通常步骤: 创建一个扩展的Windows窗口(注册类,创建窗口,取得句柄hwnd,取得设备场景hdc: 提供一个像素格式(结构),让Windows寻找匹配的格式,并给场景 ...
- Windows下游戏制作(1)---win32窗口创建(2)
写出一个窗口 之前我们简单的认识了一下win32主函数,下面我们来讨论一下如何用这个主函数作为起点来写出一个win32窗口程 序. int WINAPI WinMain( HINSTANCEhIn ...
- Win32窗口程序实例
转自:http://blog.csdn.net/earbao/article/details/8638348 <pre name="code" class="cpp ...
- WinAPI入门: 第一个标准Win32窗口程序 [改进详细注释版]
WinAPI入门: 第一个标准Win32窗口程序 下载链接: 若想立即看到本程序的运行结果,可点击EXE文件的免费下载链接; HelloWin_v1.sfx.exe;–带语音和背景音乐; 相关链接: ...
- DirectX3D 11 总结 —— 1 绘制 win32 窗口
directX 3D 是什么 DirectX 3D是一种应用程序的接口(API),它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音的效果,并提供设计人员一个共同的硬 ...
最新文章
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用
- 基于互联网大脑架构的阿里巴巴未来趋势分析【系列2】
- LoadRunner测试结果分析
- Jquery 获取对象的几种方式介绍
- java 基础(匿名内部类)
- 中国智能语音产业发展白皮书十大观点发布!科大讯飞市占率国内第一
- 003 Android之线性布局与基础控件
- vuejs构建的单页面应用history模式子页面微信分享在iOS中遇到的问题
- Head First HTML与CSS阅读笔记(二)
- Php中跳转语句goto,phpgoto语句
- css线条伸缩_CSS3弹性伸缩布局(一)——box布局
- numpy 矩阵拼接_Python实践代码总结第10集(Numpy)
- Linux 用户空间审计系统
- 91卫图助手下载器永久免费啦!
- 冰点还原8.57 官方中文版下载
- 数据挖掘实战系列 之 Kaggle 练习项目快速入门
- matlab实例一之Forward Collision Warning Using Sensor Fusion (视觉和毫米波雷达)
- 今日头条文章量如何打造爆款
- 路由器DMZ简单解说
- 暴力破解键盘上所有组合的密码需要多久?
热门文章
- 相册里的WEB3 Festivals香港记忆
- were passed to component but could not be automatically inherited because component renders fragment
- whistle-安卓手机配置代理
- 鸿蒙系统(HarmonyOS)--第一章
- Python之禅——个人翻译
- centos7 安装mysql8.0超详细步骤
- 小程序海报二维码生成插件
- antd picker 使用 如何_antd-RangePicker
- Web前端开发三剑客是做什么的?
- win7恢复计算机图标不见了怎么办,win7桌面图标找不到的五种恢复方法