?? cmyview.cpp
字號:
// CmyView.cpp : implementation of the CCmyView class
//
#include "stdafx.h"
#include "Cmy.h"
#include "MainFrm.h"
#include "CmyDoc.h"
#include "CmyView.h"
#define ABS(x) ((x)<0?-(x):(x>0)?(x):0)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCmyView
IMPLEMENT_DYNCREATE(CCmyView, CView)
BEGIN_MESSAGE_MAP(CCmyView, CView)
//{{AFX_MSG_MAP(CCmyView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_BUTTON32771, OnButton32771)
ON_WM_TIMER()
ON_COMMAND(ID_BUTTONleaf, OnBUTTONleaf)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCmyView construction/destruction
CCmyView::CCmyView()
{
// TODO: add construction code here
my_pDC=NULL;
mytbar=FALSE;
mysbar=FALSE;
leafnum=0;
leafkey=TRUE;
jb=0.0f;
}
CCmyView::~CCmyView()
{
}
BOOL CCmyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style=WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPCHILDREN;
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CCmyView drawing
void CCmyView::OnDraw(CDC* pDC)
{
CCmyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
static BOOL bBusy=FALSE;
if(bBusy) return;
bBusy=TRUE;
glClearColor(0.5f,0.5f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//glMatrixMode(GL_MODELVIEW);
// glLoadIdentity();
//mydraw();
//glFinish();
glPushMatrix();
mydraw();
glPopMatrix();
SwapBuffers(wglGetCurrentDC());
bBusy=FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CCmyView printing
BOOL CCmyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CCmyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CCmyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CCmyView diagnostics
#ifdef _DEBUG
void CCmyView::AssertValid() const
{
CView::AssertValid();
}
void CCmyView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CCmyDoc* CCmyView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCmyDoc)));
return (CCmyDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCmyView message handlers
int CCmyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
first();
return 0;
}
void CCmyView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
KillTimer(1);
HGLRC hrc;
hrc=::wglGetCurrentContext();
::wglMakeCurrent(NULL,NULL);
if (hrc)
::wglDeleteContext(hrc);
if(my_pDC)
delete my_pDC;
}
void CCmyView::first()
{
PIXELFORMATDESCRIPTOR pfd;
int n;
HGLRC hrc;
my_pDC=new CClientDC(this);
ASSERT(my_pDC!=NULL);
if (!mypixelformat())return;
n=::GetPixelFormat(my_pDC->GetSafeHdc());
::DescribePixelFormat(my_pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);
hrc=wglCreateContext(my_pDC->GetSafeHdc());
wglMakeCurrent(my_pDC->GetSafeHdc(),hrc);
GetClientRect(&my_oldRect);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
BOOL CCmyView::mypixelformat()
{
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,
0,
0,
0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0,
};
int pixelformat;
if ((pixelformat=ChoosePixelFormat(my_pDC->GetSafeHdc(),&pfd))==0)
{
MessageBox("choosepixeformat failed");
return FALSE;
}
if (SetPixelFormat(my_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
{
MessageBox("setpixwlformat failed");
return FALSE;
}
return true;
}
void CCmyView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if (cy>0)
{
my_oldRect.right=cx;
my_oldRect.bottom=cy;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0*cy/cx,1.0*cy/cx,5.0,40.0);
glViewport(0,0,cx,cy);
}
RedrawWindow();
}
void CCmyView::mydraw()
{
//glClearColor(0.2f,0.2f,0.2f,0.9f);
// glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0f,0.0f,-5.0f);
myfog();
SetTimer(1,120,NULL);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_SRC_ALPHA_SATURATE);
glRotated(11,1.0,0.0,0.0);
glPushMatrix();
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glColor3f(0.8f,0.2f,0.0f);
wall();
glTranslatef(2.0f,0.0f,0.0f);
wall();
glColor3f(0.5f,0.5f,0.0f);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
wall();
glTranslatef(-2.0f,0.0f,0.0f);
wall();
glColor3f(0.1f,0.0f,0.1f);
land();
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glColor3f(0.1f,0.2f,0.1f);
land();
glPopMatrix();
for (int k=0;k<leafnum;k++)
{
glPushMatrix();
glTranslatef(leafbh[k][0],leafbh[k][2],-34.0f*leafbh[k][1]+1.5f);
glScalef(1.0f-leafbh[k][1],1.0f-leafbh[k][1],1.0f-leafbh[k][1]);
if (leafbh[k][2]==-0.6f)
{
glRotated(-90,1.0,0.0,0.0);
glRotated(leafbh[k][5]*180,0.0,0.0,1.0);
}
else{
glRotated(leafbh[k][5]*180,0.0,1.0,0.0);
glRotated(leafbh[k][3]*180,1.0,0.0,0.0);
glRotated(leafbh[k][4]*180,0.0,0.0,1.0);
}
glScalef(0.5f,0.5f,0.5f);
glColor3f(leafbh[k][3],leafbh[k][4]/1.1f,0.0f);
myleaf2();
glColor3f(leafbh[k][3]/1.1f,leafbh[k][4]/1.2f,0.0f);
myleaf2();
glPopMatrix();
}
glDisable(GL_BLEND);
glDisable(GL_POLYGON_SMOOTH);
glDisable(GL_LINE_SMOOTH);
glDisable(GL_FOG);
}
void CCmyView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMainFrame* pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pframe->xyshow(point.x,point.y);
if (pframe->fullscreenkey)
{
if (point.y<5)
{
if (!mytbar)
{
mytbar=TRUE;
pframe->PostMessage(WM_COMMAND,ID_VIEW_TOOLBAR);
}
else
{
if (mytbar)
{
mytbar=FALSE;
pframe->PostMessage(WM_COMMAND,ID_VIEW_TOOLBAR);
}
}
}
}
CView::OnMouseMove(nFlags, point);
}
void CCmyView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMainFrame* pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pframe->xyshow(point.x,point.y);
if (pframe->fullscreenkey)
{
if (!mysbar)
{
pframe->PostMessage(WM_COMMAND,ID_VIEW_STATUS_BAR);
mysbar=TRUE;
}
}
CView::OnLButtonDown(nFlags, point);
}
void CCmyView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMainFrame* pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pframe->xyshow(point.x,point.y);
if (pframe->fullscreenkey)
{
if (mysbar)
{
pframe->PostMessage(WM_COMMAND,ID_VIEW_STATUS_BAR);
mysbar=FALSE;
}
}
CView::OnLButtonUp(nFlags, point);
}
void CCmyView::OnButton32771()
{
// TODO: Add your command handler code here
CMainFrame* pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
if (pframe->fullscreenkey)
{ if (!mysbar)
{
pframe->PostMessage(WM_COMMAND,ID_VIEW_STATUS_BAR);
mysbar=TRUE;
}
}else
{
if (mysbar)
{
pframe->PostMessage(WM_COMMAND,ID_VIEW_STATUS_BAR);mysbar=FALSE;
}
}
pframe->fullscreenkey=!pframe->fullscreenkey;
}
void CCmyView::land()
{
BOOL kl=0;
kl=0;
for(int i=0;i<160;i++){
glLineWidth(6.0f-0.16f*i);
glBegin(GL_QUAD_STRIP);
for(int j=0;j<22;j++){
glVertex3f(-1.0f+0.2f*j-kl*0.1f,-0.61f,1.2f-0.25f*i);
kl=!kl;
glVertex3f(-1.0f+0.2f*j-kl*0.1f,-0.61f,0.95f-0.25f*i);
};
kl=!kl;
glEnd();
};
}
void CCmyView::wall()
{
glShadeModel(GL_SMOOTH);
BOOL kl=0;
for(int i=0;i<36;i++){
glLineWidth(4.0f-0.1f*i);
glBegin(GL_QUAD_STRIP);
for(int j=0;j<80;j++){
glVertex3f(-1.0f,-0.6f+0.05f*i,1.2f-0.5f*j+kl*0.25f);
glVertex3f(-1.0f,-0.55f+0.05f*i,1.2f-0.5f*j+kl*0.25f);
};
glEnd();
kl=!kl;
};
}
void CCmyView::myleaf2()
{
glLineWidth(0.1f);
glBegin(GL_LINES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.15f,-0.04f,0.0f);
glVertex3f(0.0f,0.02f,0.0f);
glVertex3f(0.2f,0.05f,0.0f);
glVertex3f(0.0f,0.05f,0.0f);
glVertex3f(0.18f,0.16f,0.0f);
glVertex3f(0.0f,0.1f,0.0f);
glVertex3f(0.09f,0.17f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glColor3f(0.7f,0.5f,0.0f);
glVertex3f(0.0f,0.3f,0.0f);
glColor3f(0.5f,0.5f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glColor3f(0.3f,0.5f,0.0f);
glVertex3f(-0.15f,-0.04f,0.0f);
glColor3f(0.5f,0.5f,0.0f);
glVertex3f(0.0f,0.01f,0.0f);
glColor3f(0.3f,0.5f,0.0f);
glVertex3f(-0.2f,0.05f,0.0f);
glColor3f(0.5f,0.5f,0.0f);
glVertex3f(0.0f,0.04f,0.0f);
glColor3f(0.3f,0.5f,0.0f);
glVertex3f(-0.18f,0.16f,0.0f);
glColor3f(0.5f,0.5f,0.0f);
glVertex3f(0.0f,0.09f,0.0f);
glColor3f(0.3f,0.5f,0.0f);
glVertex3f(-0.09f,0.17f,0.0f);
glColor3f(0.5f,0.5f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glColor3f(0.3f,0.5f,0.0f);
glVertex3f(-0.0f,0.3f,0.0f);
glEnd();
}
void CCmyView::myfog()
{
glEnable(GL_FOG);
// GLfloat fogC[4] = {0.6f, 0.5f, 0.0f, 1.0f};
GLfloat fogC[4] = {0.5f, 0.5f, 1.0f, 1.0f};
glFogi (GL_FOG_MODE, GL_EXP2);
glFogfv (GL_FOG_COLOR, fogC);
glFogf (GL_FOG_DENSITY, 0.025f*ABS(jb));
glFogf (GL_FOG_START, 7.0);
glFogf (GL_FOG_END, 9.0);
glHint (GL_FOG_HINT, GL_DONT_CARE);
}
void CCmyView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent=1)
{
if (ABS(jb)>=6.1f)
{
jb=-6.0f;
}
else{
jb=jb+0.05f;
}
leafbh[leafnum][0]=1.0f*(rand()-rand())/RAND_MAX;
leafbh[leafnum][1]=1.0f*rand()/RAND_MAX;
leafbh[leafnum][2]=1.0f*(rand()-rand())/RAND_MAX;
leafbh[leafnum][3]=1.0f*rand()/RAND_MAX;
leafbh[leafnum][4]=1.0f*rand()/RAND_MAX;
leafbh[leafnum][5]=1.0f*(rand()-rand())/RAND_MAX;
leafnum++;
if (leafnum>=599)
{
leafnum=200;
}
for (int k=0;k<leafnum;k++)
{
if (leafbh[k][2]<=-0.6f)
{
leafbh[k][2]=-0.6f;
}
else{
leafbh[k][2]=leafbh[k][2]-0.025f;
leafbh[k][5]=1.0f*(rand()-rand())/RAND_MAX;
}
}
Invalidate(FALSE);
}
CView::OnTimer(nIDEvent);
}
void CCmyView::OnBUTTONleaf()
{
// TODO: Add your command handler code here
/*if (leafkey)
{
SetTimer(1,120,NULL);
}
else{
KillTimer(1);
}
leafkey=!leafkey;
Invalidate(FALSE);*/
}
void CCmyView::myleaf()
{
glShadeModel(GL_SMOOTH);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.16f,-0.05f,0.0f);
glVertex3f(0.2f,-0.05f,0.0f);
glVertex3f(0.1f,0.0f,0.0f);
glVertex3f(0.2f,0.05f,0.0f);
glVertex3f(0.1f,0.06f,0.0f);
glVertex3f(0.16f,0.08f,0.0f);
glVertex3f(0.18f,0.16f,0.0f);
glVertex3f(0.1f,0.16f,0.0f);
glVertex3f(0.08f,0.09f,0.0f);
glVertex3f(0.09f,0.17f,0.0f);
glColor3f(0.6f,0.5f,0.0f);
glVertex3f(0.0f,0.3f,0.0f);
glColor3f(0.6f,0.5f,0.0f);
glVertex3f(0.0f,0.3f,0.0f);
glColor3f(0.6f,0.5f,0.0f);
glVertex3f(-0.09f,0.17f,0.0f);
glVertex3f(-0.08f,0.09f,0.0f);
glVertex3f(-0.1f,0.16f,0.0f);
glVertex3f(-0.18f,0.16f,0.0f);
glVertex3f(-0.16f,0.08f,0.0f);
glVertex3f(-0.1f,0.06f,0.0f);
glVertex3f(-0.2f,0.05f,0.0f);
glVertex3f(-0.1f,0.0f,0.0f);
glVertex3f(-0.2f,-0.05f,0.0f);
glVertex3f(-0.16f,-0.05f,0.0f);
glEnd();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -