在用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窗口相关推荐

  1. 在C#中调用Win32函数EnumWindows枚举所有窗口。

    原文 http://www.cnblogs.com/mfm11111/archive/2009/06/30/1514322.html 开发旺旺群发软件,难点及重要技术点分析(一) 一.        ...

  2. 在控制台程序中隐藏控制台窗口

    在控制台程序中隐藏控制台窗口 大家都知道,当编写一个win32 console application时,当运行此类程序的时候 默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只 ...

  3. Win32窗口编程基础知识——主函数

    2019独角兽企业重金招聘Python工程师标准>>> 虽然说编程重要的是思想,用什么语言实现都是鸡肋,但是并不是说你对一个语言一点也不会看一遍就可以精通,我的经历就是以前只注意C/ ...

  4. Win32窗口--XBox游戏手柄--C++--方向轮和按键捕获

    文章目录 1.关键函数 1.1 joySetCapture 1.2 joyReleaseCapture 2.游戏窗口消息 3.简单案例 4.作者答疑   在 WINDOWS 下编程控制游戏手柄比较主流 ...

  5. 《OpenGL v1.1》——(1)接入Win32窗口,并描绘基本图元

    准备: 创建OpenGL窗口的通常步骤: 创建一个扩展的Windows窗口(注册类,创建窗口,取得句柄hwnd,取得设备场景hdc: 提供一个像素格式(结构),让Windows寻找匹配的格式,并给场景 ...

  6. Windows下游戏制作(1)---win32窗口创建(2)

    写出一个窗口 之前我们简单的认识了一下win32主函数,下面我们来讨论一下如何用这个主函数作为起点来写出一个win32窗口程 序. int WINAPI WinMain(   HINSTANCEhIn ...

  7. Win32窗口程序实例

    转自:http://blog.csdn.net/earbao/article/details/8638348 <pre name="code" class="cpp ...

  8. WinAPI入门: 第一个标准Win32窗口程序 [改进详细注释版]

    WinAPI入门: 第一个标准Win32窗口程序 下载链接: 若想立即看到本程序的运行结果,可点击EXE文件的免费下载链接; HelloWin_v1.sfx.exe;–带语音和背景音乐; 相关链接: ...

  9. DirectX3D 11 总结 —— 1 绘制 win32 窗口

    directX 3D 是什么 DirectX 3D是一种应用程序的接口(API),它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音的效果,并提供设计人员一个共同的硬 ...

最新文章

  1. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用
  2. 基于互联网大脑架构的阿里巴巴未来趋势分析【系列2】
  3. LoadRunner测试结果分析
  4. Jquery 获取对象的几种方式介绍
  5. java 基础(匿名内部类)
  6. 中国智能语音产业发展白皮书十大观点发布!科大讯飞市占率国内第一
  7. 003 Android之线性布局与基础控件
  8. vuejs构建的单页面应用history模式子页面微信分享在iOS中遇到的问题
  9. Head First HTML与CSS阅读笔记(二)
  10. Php中跳转语句goto,phpgoto语句
  11. css线条伸缩_CSS3弹性伸缩布局(一)——box布局
  12. numpy 矩阵拼接_Python实践代码总结第10集(Numpy)
  13. Linux 用户空间审计系统
  14. 91卫图助手下载器永久免费啦!
  15. 冰点还原8.57 官方中文版下载
  16. 数据挖掘实战系列 之 Kaggle 练习项目快速入门
  17. matlab实例一之Forward Collision Warning Using Sensor Fusion (视觉和毫米波雷达)
  18. 今日头条文章量如何打造爆款
  19. 路由器DMZ简单解说
  20. 暴力破解键盘上所有组合的密码需要多久?

热门文章

  1. 相册里的WEB3 Festivals香港记忆
  2. were passed to component but could not be automatically inherited because component renders fragment
  3. whistle-安卓手机配置代理
  4. 鸿蒙系统(HarmonyOS)--第一章
  5. Python之禅——个人翻译
  6. centos7 安装mysql8.0超详细步骤
  7. 小程序海报二维码生成插件
  8. antd picker 使用 如何_antd-RangePicker
  9. Web前端开发三剑客是做什么的?
  10. win7恢复计算机图标不见了怎么办,win7桌面图标找不到的五种恢复方法