建議文件conn.inc
1
<%
2
set conn=server.createobject("adodb.connection")
3
provider="provider=microsoft.jet.oledb.4.0;"
4
DBPath ="data source=" & Server.MapPath("db.mdb")
5
conn.Open provider & DBPath
6
%>
然后再每個頁前面加一句<!--#include file="conn.inc--">
posted @
2008-06-08 21:54 天書 閱讀(148) |
評論 (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 天書 閱讀(143) |
評論 (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 天書 閱讀(207) |
評論 (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 天書 閱讀(1984) |
評論 (3) |
編輯 收藏
D3D中燈光的表現注意事項:
1:一定要注意平面法向量的方向,進而再確定光源的位置。到底在平面的哪一側才能把平面照亮。
2:因為點光源中只有少數幾條對平面其作用的光線,所以當平面離光源越遠(照亮范圍內)照亮的區域越大。
3:光源照射后渲染三角形時當平面被分割的三角形越多,三角形頂點在光照范圍內時容易照亮。
posted @
2008-05-12 14:08 天書 閱讀(224) |
評論 (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 天書 閱讀(315) |
評論 (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 天書 閱讀(487) |
評論 (0) |
編輯 收藏
c++標準模板庫中表示大小的類型是一個無符號整數類型,這種類型不存放負值。 比如:vector<T> homework; homework.size()-100會生成無符號類型的結果,也就是說它永遠不會比0小,即便homework.size()<100。
不管什么時候,如果一個表達式中同時出現普通的整數和無符號類型的整數,普通的整數就會被轉換成無符號類型。一個值得注意的地方是:vector<double>::size_type,與所有標準庫表示大小的類型相同,也是一個無符號整數類型。
posted @
2008-04-24 13:43 天書 閱讀(502) |
評論 (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 天書 閱讀(5018) |
評論 (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 天書 閱讀(447) |
評論 (0) |
編輯 收藏