建议文件conn.inc
1<%
2set conn=server.createobject("adodb.connection")
3provider="provider=microsoft.jet.oledb.4.0;"
4DBPath ="data source=" & Server.MapPath("db.mdb")
5conn.Open provider & DBPath
6%>
然后再每个页前面加一句<!--#include file="conn.inc--">
posted @
2008-06-08 21:54 天书 阅读(143) |
评论 (0) |
编辑 收藏
Public Function SplitPageShow(ByRef rs)
rs.PageSize = 5 'pagesize属性指定了每页要显示的记录条数
Page = "1"
Page = CLng(Request("Page")) 'string型转化为long型
If Page < 1 Then Page = 1
If Page > rs.PageCount Then Page = rs.PageCount
If Page <> 1 Then
Response.Write "<A HREF=Manage.asp?Page=1>第一页</A>"
Response.Write "<A HREF=Manage.asp?Page="& (Page-1) & ">上一页</A>"
End If
If Page <> rs.PageCount Then
Response.Write "<A HREF=Manage.asp?Page=" & (Page+1) & ">下一页</A>"
Response.Write "<A HREF=Manage.asp?Page="& rs.PageCount & ">最后一页</A>"
End If
Response.write"页码:" & Page & "/" & rs.PageCount & "</font>"
'每一页的显示
'循环显示每条记录
rs.AbsolutePage = Page '把页码赋给absolutepage属性从而知当前页的首条记录号
For iPage = 1 To rs.PageSize
Response.WRITE "<TR><TD bgcolor='#FFFFFF'>" & rs("ID") & "</TD>"
Response.WRITE "<TD bgcolor='#FFFFFF'>" & rs("Title") & "</TD>"
Response.WRITE "<TD bgcolor='#FFFFFF'>" & rs("CName") & "</TD>"
Response.WRITE "<TD bgcolor='#FFFFFF'><a href='Update.asp?id="&rs("ID") &"'>修改</a></TD>"
Response.WRITE "<TD bgcolor='#FFFFFF'><a href='DeleteProcess.asp?id="& rs("ID") &"'>删除</a></TD></TR>"
rs.MoveNext
If rs.EOF Then Exit For
Next
End Function
posted @
2008-06-08 21:44 天书 阅读(141) |
评论 (0) |
编辑 收藏
事件是最实用的委托应用程序之一。
EventHandler这是一个事件委托,定义在system.EventHandler;
btnOne.Click+=new EventHandler(Button_Click);
btnTwo.Click+=new EventHandler(Button_Click);
EventHandler委托没有返回值,参数必需是object和EventArgs
private void Button_Click(object sender,Eventargs e)
{
}
上面定义的是一个接收器
操作系统对每个输入设备产生的操作,如按下MOUSE或键盘,就会发送一条消息,应用程序就得捕获消息,并根据消息调用委托,通过委托调用相应的过程处理消息,没有处理的消息再发送给操作系统,由操作系统处理。
发送消息:按下MOUSE左键,首先由操作系统捕获交给当前应用程序,再由当前应用程序交给当前窗口,如果当前窗口处理完就告诉应用程序由应用程序告诉操作系统。如果当前程序没的处理也告诉操作系统,由它处理。如果当前窗口处理就根据当前窗口的情况及状态通知委托,由委托调用用定义的处理过程,或者交回操作系统。
posted @
2008-05-20 12:53 天书 阅读(194) |
评论 (0) |
编辑 收藏
1:地板透明化(注:透明物体最后画出)
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE );
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA );
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
2:画出反射对象(注:一份顶点数据通过矩阵变换画出反射对象)
D3DXMATRIXA16 tmp;
D3DXMatrixScaling(&tmp,1,-1,1);//通过放缩矩阵来实现倒影(或D3DXMatrixReflect(&tmp,&plane);)
3:Stencil Buffer 模板缓存(启用Stencil Buffer保证转到地板下面时看不到实际存在的反射物体以免漏馅)
镜面既要最先画又要最后画,那么画两遍,最先画时设置Aphha混合如下不改变后台缓存只是在模板缓存中标记镜面区域为1.
最先画地板时:
//设置模板缓存
g_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE,true);
g_pd3dDevice->SetRenderState(D3DRS_STENCILFUNC,D3DCMP_ALWAYS);
g_pd3dDevice->SetRenderState(D3DRS_STENCILREF,0x1);
g_pd3dDevice->SetRenderState(D3DRS_STENCILMASK,0xffffffff);
g_pd3dDevice->SetRenderState(D3DRS_STENCILWRITEMASK,0xffffffff);
g_pd3dDevice->SetRenderState(D3DRS_STENCILZFAIL,D3DSTENCILOP_KEEP);
g_pd3dDevice->SetRenderState(D3DRS_STENCILFAIL,D3DSTENCILOP_KEEP);
g_pd3dDevice->SetRenderState(D3DRS_STENCILPASS,D3DSTENCILOP_REPLACE);
//绘制地板镜面
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ZERO);
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
绘制物体影像时启用模板缓存并对其函数状态进行设置:
g_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE,true);
g_pd3dDevice->SetRenderState( D3DRS_STENCILFUNC,D3DCMP_EQUAL);
最后在渲染时照常:
g_pd3dDevice->SetStreamSource( 0, obj.g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetIndices( obj.g_pIB );
g_pd3dDevice->SetTexture( 0, g_pTexture[obj.textureID] ); //设置纹理
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,obj.numOfVertex,0,obj.numOfFace);
其中 g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,obj.numOfVertex,0,obj.numOfFace);这句话根据模板缓存的设置及开启情况,写入后台缓冲区的同时写入模板缓存。或在与模板缓存中数据比较后决定是否要往后台缓冲区中写。
posted @
2008-05-17 19:25 天书 阅读(1960) |
评论 (3) |
编辑 收藏
D3D中灯光的表现注意事项:
1:一定要注意平面法向量的方向,进而再确定光源的位置。到底在平面的哪一侧才能把平面照亮。
2:因为点光源中只有少数几条对平面其作用的光线,所以当平面离光源越远(照亮范围内)照亮的区域越大。
3:光源照射后渲染三角形时当平面被分割的三角形越多,三角形顶点在光照范围内时容易照亮。
posted @
2008-05-12 14:08 天书 阅读(214) |
评论 (0) |
编辑 收藏
漫反射颜色,纹理颜色,光照效果表现
光源所造成的明暗效果是表现在Diffuse上,也就是设定的Material上的。纹理要想表现出光照的明暗效果,就要启用纹理阶段混合了。
1 D3DMATERIAL9 mtrl;
2 ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
3
4 mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
5 mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
6 mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
7 mtrl.Diffuse.a = mtrl.Ambient.a = 0.0f;
8 g_pd3dDevice->SetMaterial( &mtrl );
9 //漫反射颜色和纹理颜色叠加,光照效果折痕表现。光源效果只表现在diffuse上
10 g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
11 g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
12 g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
posted @
2008-04-30 11:00 天书 阅读(310) |
评论 (0) |
编辑 收藏
cctype开头的c表示ctype程序是c++语言继承自c语言的一部分。<cctype>头文件为操作字符串提供了有用的函数
isspace(c) 如果c是一个空白字符就返回真
isalpha(c) 如果c是一个文字字符就返回真
isdigit(c) 如果c是一个数字字符就返回真
isalnum(c) 如果c是一个字母或数字就返回真
ispunct(c) 如果c是一个标点符号就返回真
isupper(c) 如果c是一个大写字母就返回真
islower(c) 如果c是一个小写字母就返回真
toupper(c) 产生c对应的大写字母
tolower(c) 产生c对应的小写字母
posted @
2008-04-27 10:16 天书 阅读(481) |
评论 (0) |
编辑 收藏
c++标准模板库中表示大小的类型是一个无符号整数类型,这种类型不存放负值。 比如:vector<T> homework; homework.size()-100会生成无符号类型的结果,也就是说它永远不会比0小,即便homework.size()<100。
不管什么时候,如果一个表达式中同时出现普通的整数和无符号类型的整数,普通的整数就会被转换成无符号类型。一个值得注意的地方是:vector<double>::size_type,与所有标准库表示大小的类型相同,也是一个无符号整数类型。
posted @
2008-04-24 13:43 天书 阅读(492) |
评论 (0) |
编辑 收藏
vector<NODE>::iterator FindMin(vector<NODE> &vect)
{
vector<NODE>::iterator min = vect.begin();
vector<NODE>::iterator iter = vect.begin();
while(iter != vect.end())
{
if((*itor).Value < (*min).Value)
{
min = iter;
}
iter ++;
}
return min;
}
iterator的概念源自于对遍历一个线性容器工具的抽象,即如何你能访问这个容器的某个元素。对于最简单的数组,当然可以用数组的索引值,因为数组是连续存放在内存中的;但对于链表,就必须用指针。除此之外,还有还有很多种数据结构需要提供一个方便的工具来访问其中的元素,方法有ID,关键字等等。为了统一所有的容器的这种工具的使用,一般提供一整套容器的开发者就会用一种方式来表示各种容器的访问工具。例如C++ STL就是使用iterator。MFC自己的容器使用position。C#和java也有自己的方法,但方法是不变的。
iterator的用法可以被统一,但不同的底层容器实现其iterator的原理是不一样的。例如iterator++你可以理解为移动到容器的下一个元素,如果底层如果是数组,把索引值加一就行;如果底层是链表,就得执行类似于m_pCurrent = m_pCurrent->pNext;的操作。因此每种容器都有自己的iterator实现方法。
C++ STL iterator的常用方法有:
iterator++ 移到下个元素
iterator-- 移到上个元素
*iterator 访问iterator所指元素的值]
< > == != iterator之间的比较,例如判断哪个元素在前
iterator1 + iterator2 iterator之间的加法运算,类似于指针加法
posted @
2008-04-23 13:27 天书 阅读(5012) |
评论 (0) |
编辑 收藏
C++ Lists(链表)
Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.
assign() 给list赋值
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 如果list是空的则返回true
end() 返回末尾的迭代器
erase() 删除一个元素
front() 返回第一个元素
get_allocator() 返回list的配置器
insert() 插入一个元素到list中
max_size() 返回list能容纳的最大元素数量
merge() 合并两个list
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
rbegin() 返回指向第一个元素的逆向迭代器
remove() 从list删除元素
remove_if() 按指定条件删除元素
rend() 指向list末尾的逆向迭代器
resize() 改变list的大小
reverse() 把list的元素倒转
size() 返回list中的元素个数
sort() 给list排序
splice() 合并两个list
swap() 交换两个list
unique() 删除list中重复的元素
posted @
2008-04-23 13:02 天书 阅读(444) |
评论 (0) |
编辑 收藏