OpenCASCADE 6.5.0이상에서는 단 한줄의 코드로 Gradient Background color를 설정할 수 있습니다.
---------------------------------------------------------------------------------
원문은 아래에서 확인하실 수 있습니다.
http://sondra.egloos.com/5446008
MFC를 사용한다면 OnSize Mehtod에 원문의 코드를 넣으면 됩니다.
원문에 있는 코드를 사용해보니 윈도우의 크기가 변경될 때마다 gradient 색상이 조금씩 차이가 나는걸 발견하였습니다.
그 이유를 수소문해보니(?) 윈도우의 크기에 따라 opengl의 직교 좌표계의 범위를 OCC가 계산하여 설정하는 것을 알았습니다.
즉 우리가 layer에서 SetOrtho 함수를 사용하여 좌표계의 범위를 주어도 OCC에서 그댈 사용하지 않고 다시 계산하여 최종적으로 그 값을 사용하는 것입니다.
다행히 OCC에서 소스를 제공하니 소스에서 좌표계를 계산하는 루틴을 알수가 있습니다.
그 값을 적용하여 gradient를 그려주면 윈도우의 크기가 변경될때 마다 색상 차이가 나는 것을 방지할 수 있습니다.
---------------------------------------------------------------------------------
원문은 아래에서 확인하실 수 있습니다.
http://sondra.egloos.com/5446008
MFC를 사용한다면 OnSize Mehtod에 원문의 코드를 넣으면 됩니다.
원문에 있는 코드를 사용해보니 윈도우의 크기가 변경될 때마다 gradient 색상이 조금씩 차이가 나는걸 발견하였습니다.
그 이유를 수소문해보니(?) 윈도우의 크기에 따라 opengl의 직교 좌표계의 범위를 OCC가 계산하여 설정하는 것을 알았습니다.
즉 우리가 layer에서 SetOrtho 함수를 사용하여 좌표계의 범위를 주어도 OCC에서 그댈 사용하지 않고 다시 계산하여 최종적으로 그 값을 사용하는 것입니다.
다행히 OCC에서 소스를 제공하니 소스에서 좌표계를 계산하는 루틴을 알수가 있습니다.
그 값을 적용하여 gradient를 그려주면 윈도우의 크기가 변경될때 마다 색상 차이가 나는 것을 방지할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | if(aBackgroundLayer.IsNull()) { Standard_Boolean aSizeDependant = Standard_True; //each window to have particular mapped layer? aBackgroundLayer = newVisual3d_Layer(m_hView->Viewer()->Viewer(), Aspect_TOL_UNDERLAY, aSizeDependant); } aBackgroundLayer->Clear(); //! make sure we draw on a clean layer aBackgroundLayer->Begin(); Standard_Integer w, h; Handle(Aspect_Window) hWin = m_hView->Window(); hWin->Size(w, h); aBackgroundLayer->SetViewport (w ? w : 1, h ? h : 1); aBackgroundLayer->SetOrtho(0, 10, 0, 10, Aspect_TOC_TOP_LEFT); double left = 0,bottom = 0; double right=10,top = 10, delta = 0.0; const doubledAspectRatio = float(w) / float(h); if(dAspectRatio >= 1.0) { /*fenetre horizontale */ delta = (float)((top - bottom)/2.0); /*Aspect_TOC_TOP_LEFT */ bottom = top - 2*delta/dAspectRatio; } else { /*fenetre verticale */ delta = (float)((right - left)/2.0); /*Aspect_TOC_TOP_LEFT */ right = left + 2*delta*dAspectRatio; } aBackgroundLayer->BeginPolygon(); aBackgroundLayer->SetColor(Quantity_NOC_BLACK); aBackgroundLayer->AddVertex (left,top); aBackgroundLayer->AddVertex (right,top); aBackgroundLayer->SetColor (Quantity_NOC_MATRAGRAY); aBackgroundLayer->AddVertex (right,bottom); aBackgroundLayer->AddVertex (left,bottom); aBackgroundLayer->ClosePrimitive(); aBackgroundLayer->End(); | cs |
댓글
댓글 쓰기