作文一:《欢迎来到我的家乡》900字
欢迎来到我的家乡
随着祖国的发展、变化,我们的家乡也日新月异,更加繁荣起来。欢迎你到家乡来感受一下这里的风景、风俗和美食吧~
我的家乡在康乐大草原,这里有神奇而美丽的九派松、丹霞地貌……
九派松是由九派松鼠得名,在一个斜坡上整整齐齐长着九派松树,它是全天然形成的。它的雄伟与壮观让人震撼,传说在四路红军血战马场滩时,有许多烈士的忠魂永远的离开了这片土地,他们的身躯化作这九排青松,日夜守卫着这片草原。
丹霞地貌,如用文字来表达,仅有一个字震。其气势之磅礴、色彩之斑纹,大自然的鬼斧神工、令人惊叹。她不仅具有一般丹霞的奇、险,而且更美在于绝。在方圆十多平方公里的范围内,随处可见有红、黄、橙、绿、白、青灰、灰黑、灰白等多种鲜艳的色彩,把无数沟壑、山丘装点的殉丽多彩。丹霞地貌以她那层理交错的线条、色彩斑斓的、灿烂夺目的壮美形态、将一个彩色的童话世界展现在我们眼前。
接下来,我给大家讲讲我家乡的风俗吧~我的家乡居住在性情豪爽豁达、热情好客的裕固族人民,他们交友待客方面非常注意礼节。客人来了,主客居首位,然后按辈分、年龄依次就坐。先用奶茶招待,在碗里放酥油、炒面、曲拉、奶酪皮,把熬好的茶倒在碗里,然后用手抓羊肉、青稞酒招待。然后主人拿着青稞酒,唱着美妙的裕固族歌给客人敬酒。在招待大头目、活佛等人时,不仅献羊背子,还要献全羊。
这里的孩子一生中要取三次名字,孩子出生十多天时,由其祖父、舅舅或父亲给取一个乳名;上小学或打工时,再取一个汉文名;结婚时取名称经名,由喇嘛取名,可现在已经不是这样了。
家乡的美食也独具风味,不信我给大家说叨说叨。
这里的人们以面食为主,其次是青稞、小米、大米、黄米、豆类等,而且还大量食用奶制品和肉类。主食主要是做成面片、面条、包子、黄米干饭、小米饭、饺子等。奶制品主要有奶茶、奶酪、甜奶、酸奶等,而肉类主要有手抓羊肉、肉肠、烤全羊、牛背子、羊背子、炒羊肉片、风干羊肉、条羊杂碎等。
这便是我的家乡,一个神奇而美丽的地方,热情好客的裕固人民欢迎你来到我们家乡做客。
学 校:康乐明德学校
班 级:五年级
指导老师:张晓薇
作 者:杨 阳
联系地址:甘肃省张掖市肃南裕固族自治县康乐乡榆木桩村
邮政编码:734404
联系电话:
作文二:《欢迎来到我的家乡》800字
欢迎来到我的家乡
欢迎来到我的家乡
赵心怡
大家好,我是小导游赵心怡。欢迎你们来到我的家乡——美丽的诸暨。我们的行程时间是一天,我们会来到三个景点。分别是:山下湖的珍珠市场,枫桥的香榧林和西施故里。
首先我们来到了山下湖的珍珠市场。来到大门口,我们会看到一车一车的珍珠,一想到光彩夺目的珍珠是我们常见的沙子变的,就感到非常神奇。走进珍珠市场,只见里面的珍珠不可计数,让我的眼睛看得眼花缭乱。珍珠的颜 色讽刺啊很难过的多,有黑哪色的、有白色的、有灰色的蹭......还有各种各样势的形状:有圆形、有葫芦形 ......
第二个景点揣是枫桥香榧公司。没走到大缓门口,就能闻到一股浓浓的 香榧味。一进门,就看到一踏大片一大片的香榧树。几乎炯每棵香榧树的腰都弯了,像绒一个个老奶奶。香榧树的腰腻会弯下来是因为它的头顶有狐密密麻麻的小娃娃&mda蚁sh;—香榧 。而香榧树的叶子形状和其メ它树的叶子一样,但是两边ョ有一排钜,一阵微风吹过, 让树叶轻轻摆动,好像在保 护它的孩子。可爱的小香榧 尖尖的,中间鼓鼓,好像吃潼多了。一棵香榧树要生产香阌榧,要三年时间,吃完香榧瘿也要三呢喃,因为一棵香榧耜树能产很多的香榧。
1 / 2
最后扇一个景点是西施故里。首先 ,有一块大石头正在外面迎 候我们。石头上清楚地写四黩个非常大的字&ldquo啃;西施故里”ㄚ,那四个字红得发亮,仿佛撬是用血染成的。走进大门一檑看,一条长长的石板桥看不腼见尽头。一直走啊走,周围 都是具有江南特色的建筑,菘而我们,就像从时空穿越到钝了这个古色古色古色的地方妻。那些房屋,就像让我们看铣到了古代的景色。不知不觉仁中,我们来到了小吃街,这 里有很多特色小吃,比如: 饺子、肉丸......西π施故里真是充满了古代的味汤道,让我们尽情地享受吧~
就这样,一天的行程结束了葶,下次再见吧~
指导老师铳:范老师
点评:文章小作俱者巧妙地运用了导游词的形颓式分别抓住诸暨特有的美景霓来重点介绍,文章思路清晰栉,语句生动,流畅~棒~
2 / 2
作文三:《欢迎到我的房间》5200字
Going to First Grade
Listen and Say
Role Lines
Going to First Grade Page 2 Listen and say T
Wele to my room. 歡迎到我的房間。 Jessica
Look at the picture. That’s our graduation picture. 你看,是我們的畢業照Boy 1
耶,I miss my friends from Sunshine Kindergarten.我好想念在陽光幼稚
園的的朋友哦。
Me too. 我也是。We are going to first grade.我們就要上一年級了。 Linda
Yes. We are going to first grade.對啊,就要上一年級了。Let me show you Jessica
my new uniform.快來看我的新制服。
Here is my uniform.這是我的制服。 Jessica
Wow! It’s the same as mine.和我的一樣耶, We are going to the same Linda
school.我們上同一所小學。 Here is my backpack. 這是我的背包。It’s pink.是粉紅色的。 Jessica
Wow! It’s pretty.哇,真漂亮。 Linda
I have a new backpack, too. It’s blue.我也有一個新背包,是藍色的。 Boy 1
And here is my hat and water bottle. 這是我的帽子和水壺。 Jessica
They are new.都是新的。 I have a new water bottle, too.我也有新水壺。It’s purple.是紫色的。 Linda
These are my new shoes.它們是我的新鞋子。They are red. 是紅色的。 Jessica
My mommy bought them for me.都是媽媽買給我的。
I have a pair of new sandals at home. 我家裡有一雙新涼鞋。They are Leo
green.是綠色的。
My mommy says I’m growing up.媽媽說我已經長大了。I’ll be a first Jessica
grader soon. 我就要變成一年級學生囉。
I’ll be a first grader, too.我也是。 Leo
But we don’t go to the same school.可是我們上不同的小學。 Max
We can’t see each other every day.我們也不能天天見面了。 I’ll miss you.Linda
我會想念你們的。
Don’t worry. I’ll call you.別難過,我會打電話給你們的。 Max
Good idea. 好主意。 Linda
Let’s play hide and seek now.現在我們來玩捉迷藏。I’ll be “IT”. 我來當Jessica
鬼。I count to 10.我數到十哦 Everybody hide! 大家快躲起來。 Leo
Jessica 1, 2, 3, 4, 5, 6, 7, 8….
Learn and Play
Role Lines
1
T Page 4 Learn and Play
Here is my uniform. 這是我的制服 boy
Music
Vocabulary單字練習 Now repeat after me.請跟我唸 T
T hat
girl hat
帽子 T
T uniform
girl uniform
制服 T
T backpack
girl backpack
背包 T
T water bottle girl water bottle
水壺 T
Time for class. 上課囉。 T
T Put your uniforms, hats, water bottles and backpacks on this table.
把你帶來的制服、帽子、水壺和背包放在桌子上。
Kids Yes.
Who wants to show and tell first? 誰要先介紹自己的東西? T
Me, Teacher. 老師! 我 Andy
Good. Go ahead. 好,Andy先。 T
Here is my uniform. 這是我的制服 Andy
It’s white and blue.是白色和藍色的!
Excellent! Who wants to try next? 很棒,接下來誰要試? T
Jo Me, Teacher. T Good.
Here is my water bottle. 這是我的水壺 Jo
It’s red. 它是紅色的! Jo
Nice work. Whose turn is it? 輪到誰了? T
Let me try. 讓我試試看! Peter
It’s my backpack. It’s blue. 這是我的背包,是藍色的! Peter
Well done. Lisa, would you like to try? 很好 Lisa 你要說說看嗎? T
Oh, I didn’t bring anything. 喔我忘了帶東西來了But here is my Lisa
picture. 但這是我畫的圖 Here is my hat.這是我的帽子
It’s orange. 是橘色的。
Nice picture.這圖畫的真不錯May, it’s your turn. May 輪到你了 T
Here is my water bottle. 這是我的水壺 May
Very good, May.很棒喔May T
2
Children, you all did a great job. 小朋友你們今天表現得棒極了! T
Sing
Role Lines
T Page 6- Sing Graduation Day Music Graduation Day
Tiny Story
Lines
Page 7 Tiny Story – A Mouse Goes to School M: Children, look at the pictures! What is Mandy Mouse doing? Oh, she is dressing up. She can button up
her uniform and tie her shoes. Where is she going now? Let’s take a look.
Mandy Mouse: I can dress myself.
Mandy Mouse: I can button my uniform. Mandy Mouse: I can tie my shoes.
Mandy Mouse: I’m growing up.
What a nice girl! Mandy Mouse can dress herself. Can you dress yourself like her? I bet you can.
It’s time for a chant. I can’t wait to chant with you and Mandy Mouse. Here we go!
Chant:
I can dress myself.
I can button my uniform.
I can tie my shoes.
I’m growing up.
Learn and Play Role Lines
T Page 8 Learn and Play
What are they? 它們是什麼? boy
They are my socks. 它們是我的襪子。 girl
Music
Vocabulary單字練習 Now repeat after me.請跟我唸 T
T socks
girl socks
襪子 T
T sandals
girl sandals
涼鞋 T
T shoes
3
girl shoes
鞋子 T
T sneakers
girl sneakers
球鞋 T
Michael and Mandy are going to school. Michael和Mandy要上學 T
See if they can find the things they needs.我們來看看他們是否找得到
他們需要的東西。
What are they? 它們是什麼? Michael
They are my socks. 是我的襪子 Mandy
They are my socks. I found them.我也找到了。 Michael
Where are my shoes? 我的鞋子在哪裡Let’s go find our shoes. Mandy
我們一起去找!
They are my shoes. 它們是我的鞋子 Michael
They are my shoes. 我也找到了Good! Let’s go find our sneakers.好接Mandy
著我們一起來找我們的球鞋。
Here! 在這兒! They are my sneakers. 我的球鞋! Michael
They are my sneakers. 我也找到我的球鞋。 Mandy
Good. Now I need my water bottle.好 現在我需要我的水壺! Michael
I need my hat.我需要我的帽子 Let’s go! Mandy
Here is my water bottle.找到了 這是我的水壺 Michael
Here is my hat. 這是我的帽子 Mandy
Now let’s go for our backpacks.現在我們去找背包! Michael
Here is my backpack. 找到了 這是我的背包! Michael
Here is my backpack. 還有我的。 Mandy
Now we can go to school. 全部找到了……現在可以上學去了, Mandy
Michael Ha…ha…ha…
Rhyme
Role Lines
T Page10 - Rhyme Diploma Music Diploma
Daily English Role Lines
T Page 11 Daily English
The children are taking a picture.小朋友正在拍照 T
Someone is moving around.有人動來動去的 Let’s go take a look.我們
去看看!
Come here, children. Let’s take a picture. 我們來拍照 T
4
Peter, sit still. Don’t move. Peter坐好,別動! T
It’s itchy. 好癢哦! Peter
Don’t move. ,別動! I’m taking a picture of you. 我在為你拍照! T
Peter O.K
Come on, Peter. Smile! Peter! 笑一個
Peter O.k.
Say cheese! 說Cheese! T
Peter Cheese!
T Children, always say cheese when you are taking a picture.
小朋友照相前別忘了要微笑喔!
You will look good in the picture.這樣照片中的你會很好看喔
Now repeat after me.請跟我唸! T Come, let’s take a picture. Girl Come, let’s take a picture. T Sit still. Don’t move.
Girl Sit still. Don’t move.
T Say cheese.
Girl Say cheese.
T Cheese!
Girl Cheese!
5
作文四:《欢迎来到我的OpenGL教程》19000字
欢迎来到我的 OpenGL 教程。 我是个对 OpenGL 充满激情的普通男孩。 我第一次听说 OpenGL 是 3Dfx 发布 V oodoo1卡的 OpenGL 硬件加速 驱动的时候。 我立刻意识到 OpenGL 是那种必须学习的东西。 不幸的 是当时很难从书本或网络上找到关于 OpenGL 的讯息。我花了 N 个 小时来调试自己书写的代码,甚至在 IRC 和 e-Mail 上花更多的时间 来恳求别人帮忙。 但我发现那些懂得 OpenGL 高手们保留了他们的精 华,对共享知识也不感兴趣。实在让人灰心。
我创建这个网站的目的是为了帮助那些对 OpenGL 有兴趣却又 需要帮助的人。 在我的每个教程中, 我都会尽可能详细的来解释每一 行代码的作用。 我会努力让我的代码更简单 (您无需学习 MFC 代码) 。 就算您是个 VC 、 OpenGL 的绝对新手也应该可以读通代码,并清楚 的知道发生了什么。 我的站点只是许多提供 OpenGL 教程的站点中的 一个。 如果您是 OpenGL 的高级程序员的话, 我的站点可能太简单了, 但如果您才开始的话,我想这个站点会教会您许多东西。
教程的这一节在 2000年一月彻底重写了一遍。将会教您如何设 置一个 OpenGL 窗口。 它可以只是一个窗口或是全屏幕的、 可以任意 大小、任意色彩深度。此处的代码很稳定且很强大,您可以在您所有 的 OpenGL 项目中使用。 我所有的教程都将基于此节的代码。 所有的 错误都有被报告。 所以应该没有内存泄漏, 代码也很容易阅读和修改。 感谢 Fredric Echols对代码所做的修改。
现在就让我们直接从代码开始吧。 第一件事是打开 VC 然后创建 一个新工程。 如果您不知道如何创建的话, 您也许不该学习 OpenGL ,
而应该先学学 VC 。 文末可供下载的代码是 VC++ 6.0的。 某些版本的 VC 需要将 bool 改成 BOOL , true 改成 TRUE , false 改成 FALSE ,请 自行修改。我用 VC4和 VC5编译过这些代码,没有发现问题。 在您创建一个新的 Win32程序(不是 console 控制台程序)后, 您还需要链接 OpenGL 库文件。 在 VC 中操作如下:Project > Settings, 然后单击 LINK 标签。在“ Object/Library Modules”选项中的开始处 (在 kernel32.lib 前)增加 OpenGL32.lib 、 GLu32.lib 及 GLaux.lib 后 单击 OK 按钮。现在可以开始写您的 OpenGL 程序了。
代码的前 4行包括了我们使用的每个库文件的头文件。如下所 示:
#include // Windows的头文件
#include // OpenGL32库的头文件
#include // GLu32库的头文件
#include // GLaux库的头文件
接下来您需要设置您计划在您的程序中使用的所有变量。 本节中 的例程将创建一个空的 OpenGL 窗口, 因此我们暂时还无需设置大堆
的变量。余下需要设置的变量不多,但十分重要。您将会在您以后所 写的每一个 OpenGL 程序中用到它们。
第一行设置的变量是着色描述表(Rendering Context ) 。每一个 OpenGL 都被连接到一个着色描述表上。着色描述表将所有的 OpenGL 调用命令连接到设备描述表(Device Context )上。我将 OpenGL 的着色描述表定义为 hRC 。 要让您的程序能够绘制窗口的话, 还需要创建一个设备描述表, 也就是第二行的内容。 Windows 的设备 描述表被定义为 hDC 。 DC 将窗口连接到图形设备接口 GDI (Graphics Device Interface) 。 而 RC 将 OpenGL 连接到 DC 。 第三行的变量 hWnd 将保存由 Windows 给我们的窗口指派的句柄。最后,第四行为我们 的程序创建了一个 Instance (实例) 。
HGLRC hRC=NULL; // 永久着色描述表
HDC hDC=NULL; // 私有 GDI 设备描述表
HWND hWnd=NULL; // 保存我们的窗口句柄
HINSTANCE hInstance; // 保存程序的实例
下面的第一行设置一个用来监控键盘动作的数组。 有许多方法可
以监控键盘的动作, 但这里的方法很可靠, 并且可以处理多个键同时 按下的情况。
active 变量用来告知程序窗口是否处于最小化的状态。 如果窗口 已经最小化的话,我们可以做从暂停代码执行到退出程序的任何事 情。我喜欢暂停程序。这样可以使得程序不用在后台保持运行。 fullscreen 变量的作用相当明显。如果我们的程序在全屏状态下 运行, fullscreen 的值为 TRUE ,否则为 FALSE 。这个全局变量的设 置十分重要,它让每个过程都知道程序是否运行在全屏状态下。
bool keys[256]; // 用于键盘例程的数组
bool active=TRUE; // 窗口的活动标志,缺省为 TRUE
bool fullscreen=TRUE; // 全屏标志缺省设定成全屏模式
现 在 我 们 需 要 先 定 义 WndProc()。 必 须 这 么 做 的 原 因 是 CreateGLWindow()有 对 WndProc()的 引 用 , 但 WndProc()在 CreateGLWindow()之后才出现。 在 C 语言中, 如果我们想要访问一个 当前程序段之后的过程和程序段的话, 必须在程序开始处先申明所要 访问的程序段。所以下面的一行代码先行定义了 WndProc(),使得 CreateGLWindow()能够引用 WndProc()。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc的定义
下面的代码的作用是重新设置 OpenGL 场景的大小, 而不管窗口 的大小是否已经改变(假定您没有使用全屏模式) 。甚至您无法改变 窗口的大小时(例如您在全屏模式下) ,它至少仍将运行一次 — 在 程序开始时设置我们的透视图。 OpenGL 场景的尺寸将被设置成它显 示时所在窗口的大小。
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置并初始化 GL 窗口大小
{
if (height==0) // 防止被零除
{
height=1; // 将 Height 设为 1
}
glViewport(0, 0, width, height); // 重置当前的视口 (Viewport)
下面几行为透视图设置屏幕。 意味着越远的东西看起来越小。 这 么做创建了一个现实外观的场景。 此处透视按照基于窗口宽度和高度 的 45度视角来计算。 0.1f , 100.0f 是我们在场景中所能绘制深度的起 点和终点。
glMatrixMode(GL_PROJECTION)指明接下来的两行代码将影响 投影矩阵 (projection matrix) 。 投影矩阵负责为我们的场景增加透视。 glLoadIdentity()近似于重置。 它将所选的矩阵状态恢复成其原始状态。 调 用 glLoadIdentity()之 后 我 们 为 场 景 设 置 透 视 图 。 glMatrixMode(GL_MODELVIEW)指明任何新的变换将会影响模型观 察矩阵 (modelview matrix) 。 模型观察矩阵中存放了我们的物体讯息。 最后我们重置模型观察矩阵。 如果您还不能理解这些术语的含义, 请 别着急。在以后的教程里, 我会向大家解释。只要知道如果您想获得 一个精彩的透视场景的话,必须这么做。
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵
// 计算窗口的外观比例 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵
}
接下的代码段中, 我们将对 OpenGL 进行所有的设置。 我们将设 置清除屏幕所用的颜色,打开深度缓存,启用阴影平滑(smooth shading ) ,等等。这个例程直到 OpenGL 窗口创建之后才会被调用。 此过程将有返回值。 但我们此处的初始化没那么复杂, 现在还用不着 担心这个返回值。
int InitGL(GLvoid) // 此处开始对 OpenGL 进行所有设置
{
下一行启用阴影平滑(smooth shading) 。阴影平滑通过多边形精 细的混合色彩, 并对外部光进行平滑。 我将在另一个教程中更详细的 解释阴影平滑。
glShadeModel(GL_SMOOTH);
// 启用阴影平滑
下一行设置清除屏幕时所用的颜色。 如果您对色彩的工作原理不 清楚的话,我快速解释一下。色彩值的范围从 0.0f 到 1.0f 。 0.0f 代表 最黑的情况, 1.0f 就是最亮的情况。 glClearColor 后的第一个参数是 红色分量(Red Intensity) ,第二个是绿色,第三个是蓝色。最大值也 是 1.0f ,代表特定颜色分量的最亮情况。最后一个参数是 Alpha 值。 当它用来清除屏幕的时候,我们不用关心第四个数字。现在让它为 0.0f 。我会用另一个教程来解释这个参数。
通过混合三种原色(红、绿、蓝) ,您可以得到不同的色彩。希 望 您 在 学 校 里 学 过 这 些 。 因 此 , 当 您 使 用 glClearColor(0.0f,0.0f,1.0f,0.0f), 您将用亮蓝色来清除屏幕。 如果您用 glClearColor(0.5f,0.0f,0.0f,0.0f)的话, 您将使用中红色来清除屏幕。 不 是最亮 (1.0f),也不是最暗 (0.0f)。要得到白色背景,您应该将所有的 颜色设成最亮 (1.0f)。要黑色背景的话,您该将所有的颜色设为最暗 (0.0f)。
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背 景
接下来的三行必须做的是关于深度缓存(depth buffer)的。将深 度缓存设想为屏幕后面的层。 深度缓存不断的对物体进入屏幕内部有
多深进行跟踪。 我们本节的程序其实没有真正使用深度缓存, 但几乎 所有在屏幕上显示 3D 场景 OpenGL 程序都使用深度缓存。它的排序 决定那个物体先画。 这样您就不会将一个圆形后面的正方形画到圆形 上来。深度缓存是 OpenGL 十分重要的部分。
glClearDepth(1.0f);// 设 置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
接着告诉 OpenGL 我们希望进行最好的透视修正。 这会十分轻微 的影响性能。但使得透视图看起来好一点。
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// 真正精细的透视修正
最后,我们返回 TRUE 。如果我们希望检查初始化是否 OK ,我 们可以查看返回的 TRUE 或 FALSE 的值。如果有错误发生的话,您 可以加上您自己的代码返回 FALSE 。目前,我们不管它。
return TRUE; // 初始化 OK
}
下一段包括了所有的绘图代码。 任何您所想在屏幕上显示的东东 都将在此段代码中出现。 以后的每个教程中我都会在例程的此处增加 新 的 代 码 。 如 果 您 对 OpenGL 已 经 有 所 了 解 的 话 , 您 可 以 在 glLoadIdentity()调用之后, 返回 TRUE 值之前, 试着添加一些 OpenGL 代码来创建基本的形。如果您是 OpenGL 新手,等着我的下个教程。 目前我们所作的全部就是将屏幕清除成我们前面所决定的颜色, 清除 深度缓存并且重置场景。我们仍没有绘制任何东东。
返回 TRUE 值告知我们的程序没有出现问题。 如果您希望程序因 为某些原因而中止运行,在返回 TRUE 值之前增加返回 FALSE 的代 码告知我们的程序绘图代码出错。程序即将退出。
int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
return TRUE; // 一切 OK
}
下一段代码只在程序退出之前调用。 KillGLWindow()的作用是依 次释放着色描述表, 设备描述表和窗口句柄。 我已经加入了许多错误 检查。 如果程序无法销毁窗口的任意部分, 都会弹出带相应错误消息 的讯息窗口, 告诉您什么出错了。 使您在您的代码中查错变得更容易 些。
GLvoid KillGLWindow(GLvoid) // 正常销毁窗口
{
我们在 KillGLWindow()中所作的第一件事是检查我们是否处于 全屏模式。如果是,我们要切换回桌面。我们本应在禁用全屏模式前 先销毁窗口, 但在某些显卡上这么做可能会使得桌面崩溃。 所以我们 还是先禁用全屏模式。 这将防止桌面出现崩溃, 并在 Nvidia 和 3DFX 显卡上都工作的很好。
if (fullscreen) // 我们处于全屏模式吗 ?
{
我们使用 ChangeDisplaySettings(NULL,0)回到原始桌面。将 NULL 作为第一个参数, 0作为第二个参数传递强制 Windows 使用当 前存放在注册表中的值 (缺省的分辨率、 色彩深度、 刷新频率, 等等) 来有效的恢复我们的原始桌面。 切换回桌面后, 我们还要使得鼠标指 针重新可见。
ChangeDisplaySettings(NULL,0); // 是的话,切换回桌面
ShowCursor(TRUE); // 显示鼠标指针
}
接下来的代码查看我们是否拥有着色描述表(hRC ) 。如果没有, 程序将跳转至后面的代码查看是否拥有设备描述表。
if (hRC) // 我们拥有着色描述表吗 ?
{
如果存在着色描述表的话,下面的代码将查看我们能否释放它
(将 hRC 从 hDC 分开) 。这里请注意我使用的查错方法。基本上我 只 是 让 程 序 尝 试 释 放 着 色 描 述 表 (通 过 调 用 : wglMakeCurrent(NULL,NULL)) ,然后我再查看释放是否成功。巧妙 的将数行代码结合到了一行。
if (!wglMakeCurrent(NULL,NULL))// 我们能否释放 DC 和 RC 描述表 ?
{
如果不能释放 DC 和 RC 描述表的话, MessageBox()将弹出错误 消息,告知我们 DC 和 RC 无法被释放。 NULL 意味着消息窗口没有 父窗口。其右的文字将在消息窗口上出现。 “ SHUTDOWN ERROR” 出现在窗口的标题栏上。 MB_OK的意思消息窗口上带有一个写着 OK 字样的按钮。
MB_ICONINFORMATION将在消息窗口中显示一个带圈的小写 的 i (看上去更正式一些) 。
MessageBox(NULL,
}
下一步我们试着删除着色描述表。如果不成功的话弹出错误消 息。
if (!wglDeleteContext(hRC))// 我们能否删除 RC?
{
如果无法删除着色描述表的话, 将弹出错误消息告知我们 RC 未 能成功删除。然后 hRC 被设为 NULL 。
MessageBox(NULL,
}
hRC=NULL; // 将 RC 设为 NULL
}
现在我们查看是否存在设备描述表, 如果有尝试释放它。 如果不 能释放设备描述表将弹出错误消息,然后 hDC 设为 NULL 。
if (hDC && !ReleaseDC(hWnd,hDC))// 我们能否释放 DC?
{
MessageBox(NULL,
hDC=NULL; // 将 DC 设为 NULL
}
现 在 我 们 来 查 看 是 否 存 在 窗 口 句 柄 , 我 们 调 用 DestroyWindow( hWnd ) 来尝试销毁窗口。如果不能的话弹出错误窗 口,然后 hWnd 被设为 NULL 。
if (hWnd && !DestroyWindow(hWnd))// 能 否销毁窗口 ?
{
MessageBox(NULL,
MB_ICONINFORMATION);
hWnd=NULL;// 将 hWnd 设为 NULL
}
最后要做的事是注销我们的窗口类。这允许我们正常销毁窗口, 接着在打开其他窗口时,不会收到诸如“ Windows Class already registered ” (窗口类已注册)的错误消息。
if (!UnregisterClass(
{
MessageBox(NULL,
hInstance=NULL;// 将 hInstance 设为 NULL
}
}
接下来的代码段创建我们的 OpenGL 窗口。 我花了很多时间来做
决定是否创建固定的全屏模式这样不需要许多额外的代码, 还是创建 一个容易定制的友好的窗口但需要更多的代码。 当然最后我选择了后 者。 我经常在 EMail 中收到诸如此类的问题:怎样创建窗口而不使用 全屏幕 ? 怎样改变窗口的标题栏 ? 怎样改变窗口的分辨率或象素格式 (pixel format) ?以下的代码完成了所有这一切。 尽管最好要学学材 质,这会让您写自己的 OpenGL 程序变得容易的多。
正如您所见,此过程返回布尔变量(TRUE 或 FALSE ) 。他还带 有 5个参数:窗口的标题栏,窗口的宽度,窗口的高度,色彩位数 (16/24/32) ,和全屏标志(TRUE — 全屏模式, FALSE — 窗口模 式) 。返回的布尔值告诉我们窗口是否成功创建。
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
当我们要求 Windows 为我们寻找相匹配的象素格式时, Windows 寻找结束后将模式值保存在变量 PixelFormat 中。
GLuint PixelFormat; // 保存查 找匹配的结果
wc 用来保存我们的窗口类的结构。窗口类结构中保存着我们的
窗口信息。通过改变类的不同字段我们可以改变窗口的外观和行为。 每个窗口都属于一个窗口类。 当您创建窗口时, 您必须为窗口注册类。
WNDCLASS wc; // 窗 口类结构
dwExStyle 和 dwStyle 存放扩展和通常的窗口风格信息。我使用 变量来存放风格的目的是为了能够根据我需要创建的窗口类型 (是全 屏幕下的弹出窗口还是窗口模式下的带边框的普通窗口) ;来改变窗 口的风格。
DWORD dwExStyle; // 扩 展窗口风格
DWORD dwStyle;// 窗口 风格
下面的 5行代码取得矩形的左上角和右下角的坐标值。 我们将使 用这些值来调整我们的窗口使得其上的绘图区的大小恰好是我们所 需的分辨率的值。 通常如果我们创建一个 640x480的窗口, 窗口的边 框会占掉一些分辨率的值。
RECT WindowRect; // 取得
矩形的左上角和右下角的坐标值
WindowRect.left=(long)0;// 将 Left 设 为 0
WindowRect.right=(long)width;// 将 Right 设为要求的宽度
WindowRect.top=(long)0;// 将 Top 设为 0
WindowRect.bottom=(long)height;// 将 Bottom 设为要求的高度
下一行代码我们让全局变量 fullscreen 等于 fullscreenflag 。如果 我们希望在全屏幕下运行而将 fullscreenflag 设为 TRUE , 但没有让变 量 fullscreen 等于 fullscreenflag 的话, fullscreen 变量将保持为 FALSE 。 当我们在全屏幕模式下销毁窗口的时候,变量 fullscreen 的值却不是 正确的 TRUE 值, 计算机将误以为已经处于桌面模式而无法切换回桌 面。上帝啊,但愿这一切都有意义。就是一句话, fullscreen 的值必 须永远 fullscreenflag 的值,否则就会有问题。 (CKER 也觉得此处太 废话,懂的人都要不懂啦 .....:( )
fullscreen=fullscreenflag;// 设置全局全屏 标志
下一部分的代码中,我们取得窗口的实例,然后定义窗口类。 CS_HREDRAW和 CS_VREDRAW 的意思是无论何时,只要窗 口发生变化时就强制重画。 CS_OWNDC为窗口创建一个私有的 DC 。 这意味着 DC 不能在程序间共享。 WndProc 是我们程序的消息处理过 程。由于没有使用额外的窗口数据,后两个字段设为零。然后设置实 例。接着我们将 hIcon 设为 NULL ,因为我们不想给窗口来个图标。 鼠标指针设为标准的箭头。背景色无所谓(我们在 GL 中设置) 。我 们也不想要窗口菜单, 所以将其设为 NULL 。 类的名字可以您想要的 任何名字。出于简单,我将使用“ OpenGL ” 。
hInstance = GetModuleHandle(NULL); // 取得我们窗口的实例
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 移动时重画,并为窗口取得 DC
wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc处理消息
wc.cbClsExtra = 0; // 无额外窗口数据
wc.cbWndExtra = 0; // 无额外窗口数据
wc.hInstance = hInstance; // 设置实例
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // 装入缺省图标
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 装入鼠标指针
wc.hbrBackground = NULL; // GL不需要背景
wc.lpszMenuName = NULL; // 不需要菜单
wc.lpszClassName =
现在注册类名字。如果有错误发生,弹出错误消息窗口。按下上 面的 OK 按钮后,程序退出。
if (!RegisterClass(&wc)) // 尝试注册窗口类
{
MessageBox(NULL,
MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// 退出并返回 FALSE
}
查看程序应该在全屏模式还是窗口模式下运行。 如果应该是全屏 模式的话,我们将尝试设置全屏模式。
if (fullscreen) // 要尝试全屏模式吗 ?
{
下一部分的代码看来很多人都会有问题要问关于 ...... 切换到全屏 模式。在切换到全屏模式时,有几件十分重要的事您必须牢记。必须 确保您在全屏模式下所用的宽度和高度等同于窗口模式下的宽度和 高度。 最最重要的是要在创建窗口之前设置全屏模式。 这里的代码中, 您无需再担心宽度和高度,它们已被设置成与显示模式所对应的大 小。
DEVMODE dmScreenSettings; // 设备模式
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));// 确保内存 分配
dmScreenSettings.dmSize=sizeof(dmScreenSettings);// Devmode 结构的大小
dmScreenSettings.dmPelsWidth = width; // 所选屏幕宽度
dmScreenSettings.dmPelsHeight = height; // 所选屏幕高度
dmScreenSettings.dmBitsPerPel = bits; // 每象素所选的色彩深度
dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
上面的代码中, 我们分配了用于存储视频设置的空间。 设定了屏 幕的宽,高,色彩深度。下面的代码我们尝试设置全屏模式。我们在 dmScreenSettings 中保存了所有的宽,高,色彩深度讯息。下一行使 用 ChangeDisplaySettings 来尝试切换成与 dmScreenSettings 所匹配模 式。我使用参数 CDS_FULLSCREEN来切换显示模式,因为这样做 不仅移去了屏幕底部的状态条, 而且它在来回切换时, 没有移动或改 变您在桌面上的窗口。
// 尝试 设置 显 示模 式 并返回 结 果。 注 : CDS_FULLSCREEN 移去了状态条。
if (ChangeDisplaySettings(&dmScreenSettings,
CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
如果模式未能设置成功, 我们将进入以下的代码。 如果不能匹配 全屏模式, 弹出消息窗口, 提供两个选项:在窗口模式下运行或退出。
// 若模式失败, 提供两个选项:退出 或在窗口内运行。
if (MessageBox(NULL,
Your Video Card. Use Windowed Mode Instead?
MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
如果用户选择窗口模式,变量 fullscreen 的值变为 FALSE, 程序 继续运行。
fullscreen=FALSE;
// 选择窗口模式 (Fullscreen=FALSE)
}
else
{
如果用户选择退出, 弹出消息窗口告知用户程序将结束。 并返回 FALSE 告诉程序窗口未能成功创建。程序退出。
// Pop Up A Message Box Letting User Know The Program Is Closing.
MessageBox(NULL,
return FALSE; //退出 并返回 FALSE
}
}
}
由于全屏模式可能失败, 用户可能决定在窗口下运行, 我们需要 在设置屏幕 /窗口之前,再次检查 fullscreen 的值是 TRUE 或 FALSE 。
if (fullscreen)// 仍处于 全屏模式吗 ?
{
如 果 我 们 仍 处 于 全 屏 模 式 , 设 置 扩 展 窗 体 风 格 为 WS_EX_APPWINDOW, 这将强制我们的窗体可见时处于最前面。 再 将窗体的风格设为 WS_POPUP。这个类型的窗体没有边框,使我们 的全屏模式得以完美显示。
最后我们禁用鼠标指针。 当您的程序不是交互式的时候, 在全屏 模式下禁用鼠标指针通常是个好主意。
dwExStyle=WS_EX_APPWINDOW; // 扩展窗体风格
dwStyle=WS_POPUP;// 窗体风格
ShowCursor(FALSE);// 隐 藏鼠标指针
}
else
{
如果我们使用窗口而不是全屏模式, 我们在扩展窗体风格中增加
了 WS_EX_WINDOWEDGE,增强窗体的 3D 感观。窗体风格改用 WS_OVERLAPPEDWINDOW, 创建一个带标题栏、 可变大小的边框、 菜单和最大化 /最小化按钮的窗体。
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;// 扩展窗体风格
dwStyle=WS_OVERLAPPEDWINDOW; // 窗体风格
}
下一行代码根据创建的窗体类型调整窗口。 调整的目的是使得窗 口大小正好等于我们要求的分辨率。通常边框会占用窗口的一部分。 使用 AdjustWindowRectEx 后,我们的 OpenGL 场景就不会被边框盖 住。实际上窗口变得更大以便绘制边框。全屏模式下,此命令无效。
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);// 调整窗口达到真正要求的大小
下一段代码开始创建窗口并检查窗口是否成功创建。 我们将传递 CreateWindowEx()所需的所有参数。如扩展风格、类名字(与您在注 册窗口类时所用的名字相同) 、窗口标题、窗体风格、窗体的左上角 坐标(0,0是个安全的选择) 、窗体的宽和高。我们没有父窗口,也不
想要菜单,这些参数被设为 NULL 。还传递了窗口的实例,最后一个 参数被设为 NULL 。
注 意 我 们 在 窗 体 风 格 中 包 括 了 WS_CLIPSIBLINGS和 WS_CLIPCHILDREN。要让 OpenGL 正常运行,这两个属性是必须 的。他们阻止别的窗体在我们的窗体内 /上绘图。
if (!(hWnd=CreateWindowEx( dwExStyle, // 扩展窗体风格
title, // 窗口标题
WS_CLIPSIBLINGS |// 必须的窗体风格属性
WS_CLIPCHILDREN |// 必须的窗体风格属性 dwStyle, // 选择的窗体属性
0,0, // 窗口位置
WindowRect.right-WindowRect.left, // 计算调整好的窗口宽度
WindowRect.bottom-WindowRect.top, // 计算调整好的窗口高度 NULL, // 无父窗口
NULL, // 无菜单
hInstance, // 实例
NULL))) // 不向 WM_CREATE 传递任何东东
下来我们检查看窗口是否正常创建。如果成功, hWnd 保存窗口 的句柄。如果失败,弹出消息窗口,并退出程序。
{
KillGLWindow(); // 重置显示区
MessageBox(NULL,
return FALSE; // 返回 FALSE
}
下面的代码描述象素格式。 我们选择了通过 RGBA (红、 绿、 蓝、 alpha 通道)支持 OpenGL 和双缓存的格式。我们试图找到匹配我们 选定的色彩深度 (16位、 24位、 32位 ) 的象素格式。最后设置 16位 Z-缓存。其余的参数要么未使用要么不重要(stencil buffer :模板缓 存与 accumulation buffer:聚集缓存除外) 。
static PIXELFORMATDESCRIPTOR pfd= //pfd 告诉窗口我们所希望的东东
{
sizeof(PIXELFORMATDESCRIPTOR),//上诉格式描述符的大小
1, // 版 本号
PFD_DRAW_TO_WINDOW | // 格式必须支持窗口
PFD_SUPPORT_OPENGL |// 格式必须支持 OpenGL
PFD_DOUBLEBUFFER,// 必须支持双缓冲
PFD_TYPE_RGBA,// 申请 RGBA 格式
bits, // 选定 色彩深度
0, 0, 0, 0, 0, 0,// 忽略的色 彩位
0, // 无 Alpha 缓存
0, // 忽 略 Shift Bit
0, // 无 聚集缓存
0, 0, 0, 0,// 忽略聚 集位
16, // 16位 Z-缓存 (深度缓存 )
0, // 无 模板缓存
0, // 无 辅助缓存
PFD_MAIN_PLANE,// 主绘图层
0, // 保 留
0, 0, 0// 忽略 层遮罩
};
如果前面创建窗口时没有错误发生,我们接着尝试取得 OpenGL 设备描述表。 若无法取得 DC , 弹出错误消息程序退出 (返回 FALSE ) 。
if (!(hDC=GetDC(hWnd)))// 取得 设备描述表了么 ?
{
KillGLWindow();// 重置 显示区
MessageBox(NULL,
return FALSE; // 返回 FALSE
}
设法为 OpenGL 窗口取得设备描述表后, 我们尝试找到对应与此 前我们选定的象素格式的象素格式。如果 Windows 不能找到的话,
弹出错误消息,并退出程序(返回 FALSE ) 。
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))// Windows 找到相应的象素格式了吗 ?
{
KillGLWindow(); // 重置显示区
MessageBox(NULL,
return FALSE; // 返回 FALSE
}
Windows 找到相应的象素格式后, 尝试设置象素格式。 如果无法 设置,弹出错误消息,并退出程序(返回 FALSE ) 。
if(!SetPixelFormat(hDC,PixelFormat,&pfd))// 能 够设置象素格式么 ?
{
KillGLWindow();
// 重置显示区
MessageBox(NULL,
return FALSE; // 返回 FALSE
}
正常设置象素格式后, 尝试取得着色描述表。 如果不能取得着色 描述表的话,弹出错误消息,并退出程序(返回 FALSE ) 。
if (!(hRC=wglCreateContext(hDC)))// 能否取得着色描述表 ?
{
KillGLWindow(); // 重置显示区
MessageBox(NULL,
return FALSE; // 返回 FALSE
}
如果到现在仍未出现错误的话, 我们已经设法取得了设备描述表 和着色描述表。接着要做的是激活着色描述表。如果无法激活,弹出 错误消息,并退出程序(返回 FALSE ) 。
if(!wglMakeCurrent(hDC,hRC))// 尝试激活着色描述表
{
KillGLWindow();// 重置显示区
MessageBox(NULL,
return FALSE; // 返回 FALSE
}
一切顺利的话, OpenGL 窗口已经创建完成, 接着可以显示它啦。 将它设为前端窗口(给它更高的优先级) ,并将焦点移至此窗口。然 后调用 ReSizeGLScene 将屏幕的宽度和高度设置给透视 OpenGL 屏 幕。
ShowWindow(hWnd,SW_SHOW); // 显示窗口
SetForegroundWindow(hWnd);// 略略提高优先级
SetFocus(hWnd);// 设置键盘的焦点至此窗口
ReSizeGLScene(width, height); // 设 置透视 GL 屏幕
跳转至 InitGL(),这里可以设置光照、纹理、等等任何需要设置 的东东。 您可以在 InitGL()内部自行定义错误检查, 并返回 TRUE (一 切正常)或 FALSE (有什么不对) 。例如,如果您在 InitGL()内装载 纹理并出现错误,您可能希望程序停止。如果您返回 FALSE 的话, 下面的代码会弹出错误消息,并退出程序。
if (!InitGL())// 初始 化新建的 GL 窗口
{
KillGLWindow();// 重置显示区
MessageBox(NULL,
Failed.
return FALSE; // 返 回 FALSE
}
到这里可以安全的推定创建窗口已经成功了。我们向 WinMain()返回 TRUE ,告知 WinMain()没有错误,以防止程序退出。
return TRUE; // 成 功
}
下面的代码处理所有的窗口消息。 当我们注册好窗口类之后, 程 序跳转到这部分代码处理窗口消息。
LRESULT CALLBACK WndProc( HWND hWnd, // 窗口的句柄
UINT uMsg, // 窗 口的消息
WPARAM wParam, // 附加的消息内容
LPARAM lParam)// 附
加的消息内容
{
下来的代码比对 uMsg 的值,然后转入 case 处理, uMsg 中保存 了我们要处理的消息名字。
switch (uMsg) // 检查 Windows 消息
{
如果 uMsg 等于 WM_ACTIVE, 查看窗口是否仍然处于激活状态。 如果窗口已被最小化, 将变量 active 设为 FALSE 。 如果窗口已被激活, 变量 active 的值为 TRUE 。
case WM_ACTIVATE:// 监 视窗口激活消息
{
if (!HIWORD(wParam))// 检查 最小化状态
{
active=TRUE;// 程序 处于激活状态
}
else
{
active=FALSE;// 程序不 再激活
}
return 0; // 返回消息 循环
}
如果消息是 WM_SYSCOMMAND(系统命令) ,再次比对 wParam 。 如果 wParam 是 SC_SCREENSAVE 或 SC_MONITORPOWER的话,不是有屏幕保护要运行,就是显示器想进入节电模式。返回 0可以阻止这两件事发生。
case WM_SYSCOMMAND: // 中断系统命令 Intercept System Commands
{
switch (wParam)// 检查系统调用 Check System Calls
{
case SC_SCREENSAVE:
// 屏保要运行 ?
case SC_MONITORPOWER: // 显示器要进入节电模式 ?
return 0; // 阻 止发生
}
break; // 退出
}
如果 uMsg 是 WM_CLOSE, 窗口将被关闭。 我们发出退出消息, 主循环将被中断。 变量 done 被设为 TRUE , WinMain()的主循环中止, 程序关闭。
case WM_CLOSE:// 收到 Close 消息 ?
{
PostQuitMessage(0);// 发 出退出消息
return 0;
}
如果键盘有键按下,通过读取 wParam 的信息可以找出键值。我 将键盘数组 keys[ ]相应的数组组成员的值设为 TRUE 。 这样以后就可 以查找 key[ ]来得知什么键被按下。允许同时按下多个键。
case WM_KEYDOWN: // 有键按下么 ?
{
keys[wParam] = TRUE; // 如 果是,设为 TRUE
return 0; // 返回 }
同样,如果键盘有键释放,通过读取 wParam 的信息可以找出键 值。然后将键盘数组 keys[ ]相应的数组组成员的值设为 FALSE 。这 样查找 key[ ]来得知什么键被按下,什么键被释放了。键盘上的每个 键都可以用 0~255之间的一个数来代表。举例来说,当我们按下 40所代表的键时, keys[40]的值将被设为 TRUE 。放开的话,它就被设 为 FALSE 。这也是 key 数组的原理。
case WM_KEYUP:// 有键放开么 ?
{
keys[wParam] = FALSE;// 如果 是,设为 FALSE
return 0;// 返回 }
当调整窗口时, uMsg 最后等于消息 WM_SIZE。读取 lParam 的 LOWORD 和 HIWORD 可以得到窗口新的宽度和高度。将他们传递 给 ReSizeGLScene(), OpenGL 场景将调整为新的宽度和高度。
case WM_SIZE:
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
return 0;
}
}
其余无关的消息被传递给 DefWindowProc ,让 Windows 自行处 理。
// 向 DefWindowProc 传递所有未处理的消息。
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
下面是我们的 Windows 程序的入口。将会调用窗口创建例程, 处理窗口消息,并监视人机交互。
int WINAPI WinMain( HINSTANCE hInstance, // 实例
HINSTANCE hPrevInstance, // 前一个实例
LPSTR lpCmdLine, // 命令行参数
int nCmdShow) // 窗口显示状态
{
我们设置两个变量。 msg 用来检查是否有消息等待处理。 done 的初始值设为 FALSE 。这意味着我们的程序仍未完成运行。只要程 序 done 保持 FALSE ,程序继续运行。一旦 done 的值改变为 TRUE , 程序退出。
MSG msg; // Windowsx消息结构
BOOL done=FALSE; // 用来退出循环的 Bool 变量
这段代码完全可选。 程序弹出一个消息窗口, 询问用户是否希望 在全屏模式下运行。 如果用户单击 NO 按钮, fullscreen 变量从缺省的 TRUE 改变为 FALSE ,程序也改在窗口模式下运行。
// 提示用户选择运行模式
if (MessageBox(NULL,
{
fullscreen=FALSE; // 窗口模式
}
接着创建 OpenGL 窗口。 CreateGLWindow 函数的参数依次为标 题、宽度、高度、色彩深度,以及全屏标志。就这么简单。我很欣赏 这段代码的简洁。如果未能创建成功,函数返回 FALSE 。程序立即 退出。
// 创建 OpenGL 窗口
if (!CreateGLWindow(
{
return 0;// 失败退出
}
下面是循环的开始。只要 done 保持 FALSE ,循环一直进行。
while(!done)// 保 持 循 环 直 到 done=TRUE
{
我 们 要 做 的 第 一 件 事 是 检 查 是 否 有 消 息 在 等 待 。 使 用 PeekMessage()可以在不锁住我们的程序的前提下对消息进行检查。 许 多程序使用 GetMessage(), 也可以很好的工作。 但使用 GetMessage(), 程序在收到 paint 消息或其他别的什么窗口消息之前不会做任何事。
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))//有消息在等 待吗 ?
{
下面的代码查看是否出现退出消息。如果当前的消息是由 PostQuitMessage(0)引起的 WM_QUIT, done 变量被设为 TRUE ,程 序将退出。
if (msg.message==WM_QUIT) // 收到退出消息 ?
{
done=TRUE; // 是,则 done=TRUE
}
else // 不是,处理窗口消息
{
如果不是退出消息,我们翻译消息,然后发送消息,使得 WndProc()或 Windows 能够处理他们。
TranslateMessage(&msg); // 翻译消息
DispatchMessage(&msg); // 发送消息
}
}
else // 如果没有消息
{
如果没有消息, 绘制我们的 OpenGL 场景。 代码的第一行查看窗 口是否激活。如果按下 ESC 键, done 变量被设为 TRUE ,程序将会 退出。
// 绘制场景。监视 ESC 键和来自 DrawGLScene()的退出消息
if (active)// 程序激活的么 ?
{
if (keys[VK_ESCAPE]) // ESC 按下了么 ?
{
done=TRUE; // ESC 发出退出信号
}
else // 不是退出的时候,刷新屏幕
{
如果程序是激活的且 ESC 没有按下,我们绘制场景并交换缓存 (使用双缓存可以实现无闪烁的动画) 。我们实际上在另一个看不见 的“屏幕”上绘图。当我们交换缓存后,我们当前的屏幕被隐藏,现 在看到的是刚才看不到的屏幕。 这也是我们看不到场景绘制过程的原 因。场景只是即时显示。
DrawGLScene(); // 绘制场景
SwapBuffers(hDC);// 交换缓存 (双缓存 )
}
}
下面的一点代码是最近新加的(05-01-2000) 。允许用户按下 F1键在全屏模式和窗口模式间切换。
if (keys[VK_F1]) // F1键按下了么 ?
{
keys[VK_F1]=FALSE;
// 若是,使对应的 Key 数组中的值为 FALSE
KillGLWindow(); // 销毁当前的窗口
fullscreen=!fullscreen; // 切换 全屏 / 窗口 模式
// 重建 OpenGL 窗口 if (!CreateGLWindow(
640,480,16,fullscreen))
{
return 0; // 如果窗口未能创建,程序退出
}
}
}
}
如果 done 变量不再是 FALSE ,程序退出。正常销毁 OpenGL 窗 口,将所有的内存释放,退出程序。
// 关闭程序
KillGLWindow();// 销毁窗口
return (msg.wParam);// 退出程序
}
在这一课中, 我已试着尽量详细解释一切。 每一步都与设置有关, 并创建了一个全屏 OpenGL 程序。当您按下 ESC 键程序就会退出, 并监视窗口是否激活。 我花了整整 2周时间来写代码, 一周时间来改 正 BUG 并讨论编程指南, 2天(整整 22小时来写 HTML 文件) 。如 果您有什么意见或建议请给我电子邮件。 如果您认为有什么不对或可 以改进, 请告诉我。 我想做最好的 OpenGL 教程并对您的反馈感兴趣。 译者:我也花了三天的业余时间来翻译、打字。 NeHe 的文档似 乎很简单, 似乎很罗嗦。 但仔细想来这样的高手您又见过几个?还是 那句话,我不是高手,希望您是,真诚的。
发表于 @ 2006年 01月 16日 10:48:00 | 评论 ( 7 ) | 编辑 | 举报 | 收 藏
旧一篇 :Linux下的库 | 新一篇 :OpenGL教程之第一个多边
本 文 来 自 CSDN 博 客 , 转 载 请 标 明 出 处 : ://blog.csdn.net/lovetangtang/archive/2006/01/16/580530.aspx
作文五:《我的房间作文》400字
我有一个小房间,但不怎么大,只是用来睡觉的。它让我每次睡觉时都能做个好梦。
我的床头紧靠着西边墙面的正中间,床头两边各有一个小柜子,一边上放着一个台灯,平时睡觉前我坐在床上看书时用的,看的书就放在另一个柜子上。在房间的东北角有一个折叠的小床,我以前就睡这张床,不过,现在这张床已经“退休”了,它完成了“光荣使命”,现在只在上面放些衣物什么的东西。在房间的南墙前有一排白色的大橱,两边是木门的,中间的橱门是镜子,可以对着它穿衣打扮,当然它的肚子里能够装好多衣物。在橱顶上放了一些不用的东西,比如我小时候的拼图之类的东西。在床头的正上方的墙面上挂着一只钟,那是个“无头人”的肚子上有一个钟面,当钟走的时候它的双腿会左右摆动的。在房间的东北角的墙上挂着一个空调,它能让我冬暖夏凉。房间北边的墙上有扇窗户,父母为了我的安全,装了防护网。我就不会摔下去了。床的正前方摆着一台旧电视,让我休闲时看一些节目。
我的小房间很温暖,大家不妨也把自己的小房间也写出来,与大家一起分享吧~
作文六:《我的房间作文》900字
我的房间作文
一(
你一走进去,给你的感觉是种朴素却高雅的。瞧,印入你眼帘的是一张朴素的书桌,它虽然没有闪耀的宝石漂亮,但我却十分珍惜它,因为它是我学习的一部份,每一个宁静的夜晚或深夜,我都会认真,专心致致,坐在那里写作业,每一个阳光明媚的早晨,我都大声朗读,小鸟也随伴我歌唱。苹果绿色的墙壁上还贴着一张精致的课程表,每当我上课时,总要去看一看,身怕漏望带些什么。
另外书桌上还摆放着,一些小巧精致的艺术品或水晶陶瓷之类的小饰物等等。如七彩水晶的天鹅,用淡黄色玻璃制成的三朵水仙花和挂在墙壁的一个用八种颜色的水晶制作成的琵琶,还别上一枝国色天香的牡丹,绿油油的叶子和一两只五彩缤纷的蝴蝶,美极了。当然还有陶瓷的,不过是放在紫檀木的书架上面的,列有,一套全穿日本服的娃娃和一套印度的的娃娃,还有在书架里有米老鼠,唐老鸭和全套的迪士尼的陶瓷,这通通都是我的珍藏品。
书架里的书全是精装的名著,本本厚如砖头,而最下层的是一册册有厚有薄的作文书,这些书我已全包上飘亮的书皮。
前面是一张温馨,舒服的塌塌米,粉红色的床单,睡在上面可舒服了,软绵绵的,坐上去却柔软柔软。上面还吊着一盆绿色的植物,清新而淡雅。窗外还有一条淡紫色的窗帘。
怎么样,这就是我的房间。
二(
走进我房间第一眼看到的是我的桌子和电脑.
我的房间有10平方米,不大也不小,光线充足,显得格外明亮,书桌上的墙壁贴着我六张奖状,那都是我学习勤奋换来的奖励.电脑左边的墙壁上挂着我两岁时的照片,瞧!我多可爱,食指含在嘴里,眼睛注视着一个地方,好像看见蛋糕似的.床头柜上贴着一张画,那可是我姐姐送给我的卡通画.我的床上有一只可爱的小兔子娃娃,每天晚上陪伴我进入甜蜜的梦乡.
再去看衣柜,瞧一瞧,衣柜里躺着"眼科医生"___眼护士,乱七八糟的衣服,整整齐齐的书,各种各样的布娃娃.嘘!小心点,动物娃娃在睡觉呢,它们相依相偎,组成了一个温馨的小世界.
我的标窗可宽了,它长175厘米,宽70厘米,像个小舞台,我和同学在那玩游戏,过过家,聊天.......我的房间很凉快,因为门和窗空气对流,所以特别凉快.下午5点钟左右,一道金光从标窗斜射在墙壁像金色的墙.
它不止是我的房间,也是我的快乐天地.
作文七:《我的房间作文》800字
我的房间
人要生存必须需要的是什么?衣食住行。的确,仅此四件,而作为中学生,我也拥有一间属于自己的卧室。
小卧室东边的墙上挂着一张世界地图和中国地图,地图下方是一张小床,别致的小床上铺着漂亮的绿色床单。床单上的图案是我和妈妈专门挑选的,样子很逗,也很有趣,你看:唐老鸭和米老鼠在打篮球,唐老鸭戴着一顶蓝色帽子,它嘴巴张得大大的,飞快地跑向米老鼠,阻止米老鼠向篮球筐里投球。米老鼠的圆耳朵又黑又亮,眼睛又大又圆,穿着很“酷”的运动服,背上写着醒目的“8”号,它一跃而起,正奋力把球投向篮里。床单平平整整的,和方方块块的被子很协调,看起来,整洁明快。地板是枣红色的,衣柜也是枣红色的。走上去的咚咚声听起来格外悦耳。
卧室的南侧是阳台,拉开窗帘,透过玻璃,能清楚地看到外面美丽的街道,和热闹非凡的市场。晚上拉上窗帘,窗帘上的每一个图案都是有趣的童话:有精彩的小猫钓鱼,有可爱的蓝精灵住在膨大的蘑菇房里,正忙着收拾房子呢!,还有聪明的小老鼠正在大象鼻子底下,美美享受“淋浴”。假如要是你也睡在这里的话,也保你天天做美梦!
卧室的西边放着我的书柜和写字台,写字台上东西摆放有序整齐,可以说,一尘不染。左侧放着一盏兰色的护眼灯,它的底座上坐着一只活泼的小狗,顶着大大的礼帽,穿着黄色的小上衣,兰色背带裤,手里抱着桃子钟表,样子可笑吧!台灯旁放着墨水和一个小小地球仪。 “唐老鸭”储钱罐肚中空空如也;写字台上整整齐齐的,护眼灯、抽纸、垃圾筒、文具盒、作业本……写字台的旁边那就是书柜了,书柜分上中下三层,上层主要是放少儿图书类,中层放学习和参考书籍,下层是报刊和常用资料。不管什么类的图书,有时间我总是拿出来看上几页,挺方便的。
卧室的正中墙的中央,贴着一幅动画形象图:米奇,手里拿着一个红红的“副”字,好象在祝福我快乐成长呢,下方摆着一台电脑,我每天都要抽出时间来玩会儿电脑,有时候打会儿字,有时画会儿画,还有时看看动画片,很自在。
我的小卧室虽然不大,却很温馨舒适,我喜欢它,爱护它。
作文八:《作文:我的房间》500字
我的房间
我的房间不大,是个9平方米的正方形。
别看房间不大,但它可被我整理得井井有条。打开房门,只见眼前一绿,那是我翠绿色的墙纸,墙纸上是一株株小苗正在茁壮成长,就像我一样。? ?小 荷 作文网
开门第一眼看见的就是北面的窗台,窗台上有一块玻璃,这可不是一块普通的玻璃,它嵌在我的飘窗台上,上面印着几只黄鹂在树上鸣唱,好像每天都在伴随着我歌唱。
紧靠着窗台的是我柔软的小床,躺在上面就像躺在妈妈的怀抱一样,舒服极了!因为我喜欢麦兜,它的性格就像我一样——活泼可爱,所以妈妈特意为了挑选了麦兜的床单。
靠东边的是我的衣柜,里面挂满我了各式各样、五彩斑斓的四季衣服。
房间里当然少不了我的写字桌,坐上绿色的转椅,脚踏在柔软的地毯上,伏在桌面上,留下了许许多多的数字、字母和精彩的文章。再往右边就是我的书柜了,它分为三列,中间一列摆满了我在旅游的时候带回的纪念品,有:水立方、鸟巢、海宝等。左右两边则放着我最心爱的书,有小说、散文、作文,还有侦探书,它就像我的老师,教会我许多的知识。最让我自豪的地方就是我挂了块小“金牌”的地方,它可是我参加书法比赛获得的,每次看到它,心里就美滋滋的!
我的房间虽小,它是我学习和生活的小天地。
作文九:《作文:我的房间》500字
作文:我的房间
我刚搬了新家,也有了一个属于我自己的小天地了,因此我可以在我地盘上“大闹天宫”了。我的小屋还有一个名字,“喜怒哀乐”屋。
我的小屋是黄色的,让人看上去很暖和,小屋窗台上放着四盆“一帆风顺”,在这时,如果你要是进屋的话,就可以立刻闻到一股股扑面而来的清香。我还有一个百变衣柜呢,为什么说它是百变衣柜呢,那是因为衣柜里面有我春、夏、秋、冬四季的衣服,想穿什么季节的衣服,它都会立刻出现在眼前,你说难道它不是百变衣柜吗,在床的左上方有一个写字台,写字台里面有和我经常打交道的“老朋友”和“新朋友”。
我的写字台旁边还有一个小书架,那是我爸爸费了九牛二虎之力给我精心设计和打造的。我的小屋里还有一对“电子姐妹”呢,你们猜猜它们是什么呢,哈哈,现在由我来告诉你们吧,他们就是电视和电脑。我必须每天写完作业才可以去碰他们,如果我没写完作业就玩的话,就会被妈妈来一个“五雷轰顶”。有一次,我和爸爸在家,以为妈妈不回来了,就偷偷的玩起了电脑,正玩到兴头上,万万没想到的是,妈妈居然回来了,给我狠狠的说了一顿,都怪爸爸的情报部准。后来才知道,原来爸爸是卧底啊~气死我了。
这就是我的“喜怒哀乐”屋,我在这个小屋里度过每一天快乐的时光,你想不想也拥有一个呢。
作文十:《作文:我的房间》300字
我希望我的房间是一间服装店,里面摆满了各种各样时尚的衣服、鞋子和配饰。这样,我就可以任意挑选我喜欢的衣服,不要总穿那老土的校服了。
我也希望我的房间是大超市,里面塞满了美味可口的食品。这样,我伸手就能拿到薯片,张嘴就能喝到可乐,五花八门的饼干随我挑。五彩冰粉的糖果任我选………啧啧,我不出家门就有享不玩的美食。
我更希望我的房间是一个开心农场,我就是那一个快乐地农夫。在大床边围着的一圈菜园里,我可以种上无污染的樱桃小番茄,当我躺在床上休息时,随手就能摘下一个尝尝鲜;书桌下的小牧场里,我会养一只小狗替我看门,养一只大公鸡叫我早起,还有我最喜欢的小白兔,我要搂着它睡觉。这样过着世外桃源般的生活,想想都觉得好开心啊!