スポンサーリンク

| キーワード:

vtk 9.0で表示(7) + win32api

VTKではなく、自作のウィンドウにレンダリングする方法。

#pragma once

// VTK内でstd::minにひっかからないため
#define NOMINMAX

#include<Windows.h>


// VTK_MODULE_INITに必要
#include <vtkAutoInit.h>

#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkWin32RenderWindowInteractor.h> //win32api対応
#include <vtkInteractorStyleImage.h>

//円筒とその表示に必要
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>


#pragma comment(lib,"vtkCommonCore-9.0.lib")
#pragma comment(lib,"vtkRenderingCore-9.0.lib")
#pragma comment(lib,"vtkInteractionStyle-9.0.lib")
#pragma comment(lib,"vtkFiltersSources-9.0.lib")
#pragma comment(lib,"vtkCommonExecutionModel-9.0.lib")

#pragma comment(lib,"vtkRenderingUI-9.0.lib") //win32api対応
#pragma comment(lib,"vtkRenderingOpenGL2-9.0.lib")

VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);


vtkSmartPointer<vtkRenderWindowInteractor> iren;
vtkSmartPointer<vtkRenderWindow> renWin;

void init_vtk(HWND hwnd);
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {

  RECT rect;
  GetClientRect(hwnd, &rect);

  switch (msg) {
  case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  case WM_ERASEBKGND://背景の描画を処理したことにする(ちらつき防止)
    return TRUE;

  case WM_PAINT:
    if (renWin) {
      //画面描画
      renWin->Render();
    }
    return 0;
  case WM_SIZING:
    //ウィンドウサイズ設定
    renWin->SetSize(rect.right, rect.bottom);
    InvalidateRect(hwnd, nullptr, FALSE);
    return 0;
  }
  return DefWindowProc(hwnd, msg, wp, lp);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  PSTR lpCmdLine, int nCmdShow) {
  HWND hwnd;
  WNDCLASS winc;
  MSG msg;

  winc.style = CS_HREDRAW | CS_VREDRAW;
  winc.lpfnWndProc = WndProc;
  winc.cbClsExtra = winc.cbWndExtra = 0;
  winc.hInstance = hInstance;
  winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  winc.hCursor = LoadCursor(NULL, IDC_ARROW);
  winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  winc.lpszMenuName = NULL;
  winc.lpszClassName = TEXT("VTK-TEST");

  if (!RegisterClass(&winc)) return 0;

  hwnd = CreateWindow(
    TEXT("VTK-TEST"), TEXT("vtk test"),
    WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
    CW_USEDEFAULT, CW_USEDEFAULT,
    500, 500,
    NULL, NULL,
    hInstance, NULL
  );

  if (hwnd == NULL) return 0;

  init_vtk(hwnd);

while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg); return msg.wParam; }
void init_vtk(HWND hwnd) {
  //////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////
  // Create a vtkCylinderSource
  vtkSmartPointer<vtkCylinderSource> cylinderSource = vtkSmartPointer<vtkCylinderSource>::New();
  cylinderSource->SetCenter(0.0, 0.0, 0.0);
  cylinderSource->SetRadius(5.0);
  cylinderSource->SetHeight(7.0);
  cylinderSource->SetResolution(100);
  // Create a mapper and actor
  vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  mapper->SetInputConnection(cylinderSource->GetOutputPort());
  vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
  actor->SetMapper(mapper);

  //////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////

  auto renderer = vtkSmartPointer<vtkRenderer>::New();
  renderer->AddActor(actor);
  renderer->ResetCamera();

  //////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////
  //////////////////////////////////////////////////////////////////
  // VTKの表示領域をWin32apiのウィンドウに貼り付ける

  RECT rect;
  GetClientRect(hwnd, &rect);

  renWin = vtkRenderWindow::New();
  renWin->AddRenderer(renderer);

  renWin->SetParentId(hwnd);
  renWin->SetSize(rect.right, rect.bottom);

  iren = vtkSmartPointer<vtkWin32RenderWindowInteractor>::New();

  vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
    vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();

  iren->SetInteractorStyle(style);
  iren->SetRenderWindow(renWin);

}

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: