📄 mediaright.cpp
字号:
// MediaRight.cpp : implementation file
//
#include "stdafx.h"
#include "Media.h"
#include "MediaRight.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMediaRight
IMPLEMENT_DYNCREATE(CMediaRight, CView)
CMediaRight::CMediaRight()
{
m_x = 0;
m_y = 0;
m_z = 0;
IsRotate = FALSE;
}
CMediaRight::~CMediaRight()
{
}
BEGIN_MESSAGE_MAP(CMediaRight, CView)
//{{AFX_MSG_MAP(CMediaRight)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMediaRight drawing
void CMediaRight::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
ASSERT_VALID(pDoc);
Drawscene();
pDC->SetTextColor(RGB(0,0,255));
CString str = "LCD的RGB->Lab三维彩色视图";
pDC->TextOut(15,15,str);
}
/////////////////////////////////////////////////////////////////////////////
// CMediaRight diagnostics
#ifdef _DEBUG
void CMediaRight::AssertValid() const
{
CView::AssertValid();
}
void CMediaRight::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMediaRight message handlers
int CMediaRight::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_pDC = new CClientDC(this);
ASSERT(m_pDC!=NULL);
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小
1, // 版本号
PFD_DRAW_TO_WINDOW| // 支持在窗口中绘图
PFD_SUPPORT_OPENGL| // 支持 OpenGL
PFD_DOUBLEBUFFER, // 双缓存模式
PFD_TYPE_RGBA, // RGBA 颜色模式
24, // 24 位颜色深度
0,0,0,0,0,0, // 忽略颜色位
0, // 没有非透明度缓存
0, // 忽略移位位
0, // 无累加缓存
0,0,0,0, // 忽略累加位
32, // 32 位深度缓存
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主层
0, // 保留
0,0,0 // 忽略层,可见性和损毁掩模
};
int pixelformat;
int n;
if ((pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0)
{
MessageBox("ChoosePixelformat failed"); //选择像素格式失败
return FALSE;
}
//设置像素格式
if (SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
{
MessageBox("SetPixelFormat failed"); //设置像素格式失败
return FALSE;
}
n=::GetPixelFormat(m_pDC->GetSafeHdc());
::DescribePixelFormat(m_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);
m_hRC = wglCreateContext(m_pDC->GetSafeHdc());
wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
// GetmyLAB();
// SetPointColor();
GetmyLAB1();
SetPointColor1();
return 0;
}
void CMediaRight::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
if(wglGetCurrentContext() != NULL)
{
//make the rendering context not current
//wglMakeCurrent(NULL, NULL)来消除当前RC。
wglMakeCurrent(NULL,NULL);
}
if(m_hRC != NULL)
{
//通过wglDeleteContext来删除RC
wglDeleteContext(m_hRC);
m_hRC = NULL;
}
if ( m_pDC ) //清空删除当前渲染绘制环境
{
delete m_pDC;
}
}
void CMediaRight::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(m_hRC)
wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
else
return;
glViewport(0,0,cx,cy);
// 设置变换模式为投影变换
glMatrixMode(GL_PROJECTION);
// 初始化投影变换矩阵
glLoadIdentity();
// 根据窗口大小设置调整正射投影矩阵
if(cx<=cy)
glOrtho(-4.0,4.0,-4.0*(GLfloat)cy/(GLfloat)cx,
4.0*(GLfloat)cy/(GLfloat)cx,-2.0,2.0);
else
glOrtho(-4.0*(GLfloat)cx/(GLfloat)cy,
4.0*(GLfloat)cx/(GLfloat)cy,-4.0,4.0,-2.0,2.0);
// 设置变换模式为模型变换
glMatrixMode(GL_MODELVIEW);
// 初始化模型变换矩阵
glLoadIdentity();
}
void CMediaRight::Drawscene()
{
if(m_hRC)
wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
else
return;
glRotated(m_x,1,0,0);
glRotated(m_y,0,1,0);
glRotated(m_z,0,1,1);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置背景颜色为黑色不透明
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清颜色缓存与深度缓存
glLineWidth(2.0);
/* glBegin(GL_LINES);
glColor3f( 0.0, 0.0, 0.0); // L
glVertex3f(0.0, 0.0, 0.0);
glColor3f( 1.0, 1.0, 1.0);
glVertex3f(4.0, 0.0, 0.0);
glColor3f( 0.0, 1.0, 0.0); //a
glVertex3f(0.0, -4.0, 0.0);
glColor3f( 1.0, 0.0, 0.0);
glVertex3f(0.0, 4.0, 0.0);
glColor3f( 0.0, 0.0, 1.0); // b
glVertex3f(0.0, 0.0, -4.0);
glColor3f( 1.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, 4.0);*/
glBegin(GL_LINES);//画坐标系,由三条线段组成
glColor3f(1,0,0);
glVertex3f(0,0,0);
glVertex3f(4,0,0);//R坐标(+a)
glColor3f(0,1,0);
glVertex3f(0,0,0);
glVertex3f(-4,0,0);//G坐标(-a)
glColor3f(1,1,1);
glVertex3f(0,-4,0);
glVertex3f(0,4,0);//L坐标
glColor3f(0,0,1);
glVertex3f(0,0,0);
glVertex3f(0,0,-4);//B坐标(-b)
glColor3f(1,1,0);
glVertex3f(0,0,0);
glVertex3f(0,0,4);//Y坐标(+b)
glEnd();
int i;
//画LCD的LAB图
glLineWidth(1.0);
glPointSize(2.5);
glPushMatrix();
for (i = 0; i < 729; i ++)
{
glBegin(GL_POINTS);
glColor3f(mColor1[i][0], mColor1[i][1], mColor1[i][2]);
glVertex3f(mLAB1[i][1],mLAB1[i][0],mLAB1[i][2]);
glEnd();
}
::SwapBuffers(m_pDC->GetSafeHdc()); //设置缓存
}
void CMediaRight::GetmyLAB1()
{
int i, j;
FILE *fp;
fp=fopen("rlab.txt", "rb");
if(!fp)
{
AfxMessageBox("读取LAB数据错误 !");
exit(1);
}
for(i = 0; i < 729; i ++)
{
for (j = 0; j < 3; j ++)
{
fscanf(fp, "%f", &mLAB1[i][j]);
mLAB1[i][j] = mLAB1[i][j]/40.0f; //使坐标值能在坐标轴所给范围内(最大范围为4)显示,每个值除以40;
}
}
fclose(fp);
}
void CMediaRight::SetPointColor1()
{
int i, j;
FILE *fp;
fp=fopen("RGB.txt", "rb");
if(!fp)
{
AfxMessageBox(" 读取RGB数据错误 !");
exit(1);
}
for(i = 0; i < 729; i ++)
{
for (j = 0; j < 3; j ++)
{
fscanf(fp, "%f", &mColor1[i][j]);
mColor1[i][j] = mColor1[i][j]/255;
}
}
fclose(fp);
}
void CMediaRight::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
IsRotate = FALSE;
CView::OnLButtonUp(nFlags, point);
}
void CMediaRight::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(IsRotate == TRUE)
{
m_x = point.x;
m_y = point.y;
m_z = point.x+point.y;
Invalidate(FALSE);
}
CView::OnMouseMove(nFlags, point);
}
void CMediaRight::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
IsRotate = TRUE;
CView::OnLButtonDown(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -