• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 131, comments - 12, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

                 摘要: 1程序段:?1234567vector <int> vecInt;for (int i=0;i<500;i++){    vecInt.push_back(i);}int j= vecInt.capacity();  //j=512i = vecInt.size(); //i=500?1 &...  閱讀全文

            posted @ 2013-03-04 12:01 盛勝 閱讀(7947) | 評論 (0)編輯 收藏

            使用DateTimePicker控件一般是獲 取其時間替代手工輸入帶來的不便,而DateTimePicker控件既可以獲取日期(2010-03-05)也可以獲取時間(16:27:33),要獲 取日期只需要更改控件屬性的格式為長日期或短日期,要獲取時間則將格式更改為時間即可!

                     在添加控件變量時,選擇其變量類型為CDateTimeCtrl(類如m_DateCtrl);在程序中定義CTime對象用來保存獲取的時間,然后可以將其轉換為CString類型;具體實現:

            復制代碼
            1        CTime time;
            2 m_DateCtrl.GetTime(time);
            3 CString strTime=time.Format("%Y-%m-%d") //獲取到的為日期 如:2010-03-05
            4
            5 CTime time;
            6 m_DateCtrl.GetTime(time);
            7 CString strTime=time.Format("%H:%M:%S") //獲取到的為時間 如:16:27:33
            復制代碼

            VC2005中DateTimePicker控件的使用

            復制代碼
             1 1 顯示年月日時分秒的當前時間
            2 CDateTimeCtrl m_DateItmeCtrl_Time;
            3 m_DateItmeCtrl_Time.SetFormat(_T("yyyy-MM-dd HH:mm:ss"));
            4 CTime TimeTemp=TimeTemp.GetCurrentTime();
            5 m_DateItmeCtrl_Time.SetTime(&TimeTemp);
            6
            7 其中HH表示24小時制,hh表示12小時制
            8 2 如果聲明一個控件類型為CTime的變量,那么時間將顯示1970-01-01 08:00:00.
            9
            10 3將DateTimePicker控件聲明變量類型為COleDateTime
            11 COleDateTime轉CString
            12 CString strTime;
            13 COleDateTime dtTime;
            14 strTime =dtTime.Format(_T("%Y-%m-%d %H:%M:%S"));
            復制代碼


            CString轉COleDateTime(因為VS2005時間日期控件關聯的Value變量默認是COleDateTime類型)

            1 CString strTime =_T("2009-08-11 11:22:33");
            2 COleVariant VariantTime;
            3 VariantTime = strTime;
            4 VariantTime.ChangeType(VT_DATE);
            5 COleDateTime DataTime = VariantTime;

            SetTime時 參數需要為指針

            復制代碼
             1   m_ctrlMachineDeliveryDate.SetTime(&CTime::GetCurrentTime()); //將控件顯示當前日期
            2 m_ctrlMachineInstallDate.SetTime(&CTime::GetCurrentTime());
            3
            4
            5
            6 CTime tDeliveryDate;
            7 m_ctrlMachineDeliveryDate.GetTime(tDeliveryDate); //獲取發貨日期
            8 pMachineInfoSet->m_MACHINE_DELIVERYDATE = tDeliveryDate;
            9
            10
            11
            12 CTime tDeliveryDate;
            13 tDeliveryDate = pMachineInfoSet->m_MACHINE_DELIVERYDATE; //獲取記錄中的日期
            14 m_ctrlMachineDeliveryDate.SetTime(&tDeliveryDate); //將記錄中的日期賦值到DateTime控件中顯示

            例子:
            string strTime,strYear,strMonth,strDay;
            strTime = strBirthday.substr(0,10);
            strYear = strTime.substr(0,4);
            strMonth = strTime.substr(5,2);
            strDay = strTime.substr(8,2);
            CTime t(atoi(strYear.c_str()),atoi(strMonth.c_str()), atoi(strDay.c_str()),0,0,0);
            m_DateBorn.SetTime(&t);
            復制代碼

             // 設定時間日期控件允許選擇的范圍

            復制代碼
             1  CTime tCurrentTime= CTime::GetCurrentTime();
            2 CTimeSpan timespanOneMonth(30,0,0,0); //這里設置為當前日期推后30天
            3 CTime tEndTime = tCurrentTime +timespanOneMonth;
            4 m_ctrlADTipsDaysDate.SetRange(&tCurrentTime,&tEndTime);
            5 /*
            6 m_dtcTm:這個是DATE TIME PICKER控件變量
            7 CTime begin_tm(1970,1,1,8,0,0),end_tm(2038,1,19,3,14,7);
            8 m_dtcTm.SetRange(&begin_tm,&end_tm);
            9 m_tmClock=CTime::GetCurrentTime();//設置初始值為當前時間
            10 m_dtcTm.SetTime(&m_tmClock);
            11 //m_dtcTm.SetFormat("yyyy-MM-dd HH'時'mm'分'"); //設置字符串格式
            12 m_dtcTm.SetFormat("yyyy-MM-dd HH:mm:ss");
            13 */
            復制代碼

            posted @ 2013-03-02 15:27 盛勝 閱讀(2495) | 評論 (0)編輯 收藏

                 摘要: 這個例子類似于 Windows 的資源管理器,程序運行界面如圖一所示:圖一主要用到的類有:CListCtrl,CTreeCtrl,CImageList,CFileFind 和函數SHGetFileInfo()簡述步驟如下:1、增加 TreeCtrl 的 TVS_HASBUTTONS,TVS_HASLINES、TVS_LINESATROOT Style,代碼如下:1.DWORD dwSty...  閱讀全文

            posted @ 2013-03-01 14:01 盛勝 閱讀(1225) | 評論 (0)編輯 收藏

            方法一:
            void CTreeTest_demoDlg::ChangeTreeItemAll(CTreeCtrl &tree, HTREEITEM hItem,BOOL bSelect) 
            HTREEITEM x = tree.GetChildItem(hItem); 
            if(NULL == x) return; 
            do
            tree.SetCheck( x, bSelect ); 
            ChangeTreeItemAll(tree,x,bSelect);
            }
            while( ( x = tree.GetNextSiblingItem( x ) )!= NULL ); 
            }

             void CTreeTest_demoDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
             {
              // TODO: 在此添加控件通知處理程序代碼
             
              CPoint point; 
              UINT pflags; 
              GetCursorPos(&point); 
              m_ctrTree.ScreenToClient(&point); 
              HTREEITEM hitItem = m_ctrTree.HitTest( point, &pflags );
              if ( pflags & (TVHT_ONITEMSTATEICON )) 
             
             
              //if(m_bSelectDirect) // 選中父結點時他的直接孩子(兒子)結點同時被選中 
              //{ 
              // if ( m_ctrTree.GetCheck( hitItem ) )
              //
              // ChangeTreeItemDirect(m_ctrTree,hitItem,FALSE); 
              // }
              // else 
              //
              // ChangeTreeItemDirect(m_ctrTree,hitItem,TRUE); 
              // }
              //} 
            //   if(m_bSelectAll) // 選中父結點時他的孩子結點以及所有后代(孫子)的節點被選中 
               
                if ( m_ctrTree.GetCheck( hitItem ) ) 
               
                ChangeTreeItemAll(m_ctrTree,hitItem,FALSE); 
               
                else 
                {
                ChangeTreeItemAll(m_ctrTree,hitItem,TRUE); 
               
                }
             
              *pResult = 0;
             }


            方法二:
            void CTreeTest_demoDlg::UpdateTreeCheck(const HTREEITEM hParent, const BOOL flag) 
            if (m_ctrTree.ItemHasChildren(hParent)) 
            HTREEITEM hNextItem; 
            HTREEITEM hChildItem = m_ctrTree.GetChildItem(hParent); 
            while (hChildItem != NULL) 
            //遞歸獲取當前節點下的子節點 
            m_ctrTree.SetCheck(hChildItem,flag); 
            UpdateTreeCheck(hChildItem,flag); 
            hNextItem = m_ctrTree.GetNextItem(hChildItem, TVGN_NEXT);
            hChildItem = hNextItem;
            void CTreeTest_demoDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
            {
            // TODO: 在此添加控件通知處理程序代碼
            DWORD dw = GetMessagePos();
            CPoint pt(LOWORD(dw),HIWORD(dw)); //鼠標的屏幕坐標
            CPoint ptClient; 
            CRect rcPart;
            m_ctrTree.GetWindowRect(rcPart);
            ptClient.x = pt.x - rcPart.left;
            ptClient.y = pt.y - rcPart.top; 
            UINT uFlags;
            HTREEITEM hItem = m_ctrTree.HitTest(ptClient, &uFlags); 
            if ((hItem != NULL) && (uFlags & TVHT_ONITEMSTATEICON)) 
            if (m_ctrTree.ItemHasChildren(hItem)) 
            BOOL flag = m_ctrTree.GetCheck(hItem); //這時父節點還沒有更新,需要取反 
            UpdateTreeCheck(hItem,!flag); 
            }
            m_ctrTree.Select(hItem, TVGN_CARET);
            *pResult = 0;
            }

            posted @ 2013-02-28 16:50 盛勝 閱讀(690) | 評論 (0)編輯 收藏

            TreeCtrl的擴展類,可以改節點字體顏色和背景色
            類下載:http://www.codeproject.com/treectrl/simptree.asp
              其中有CSimpleTreeCtrl類和MyNewTreeCtrl類兩個
              CSimpleTreeCtrl類繼承自CTreeCtrl,而MyNewTreeCtrl類繼承自CSimpleTreeCtrl類
              生成MyNewTreeCtrl的對象,加載到主面板中。
              比CTreeCtrl控件好用的地方在:插入節點很直觀,可以改變某節點的顏色和背景色,可以很方便的得到父節點和子節點
              getNumChildren:得到子節點的個數
              addChild:在自己下面增加子節點
              getChild ( int i ):得到子節點i
              getParent():得到父節點
              InsertItem( item, parent ):在parent后插入item
              setTextColor:設置字體顏色
              setBkColor:設置背景顏色
              
              示例:
              (1)
              
               CSimpleTreeCtrl::TreeCtrlItem* item = new MyNewTreeCtrl::NewTreeCtrlItem ( name );
               item->setName(name);
               if( red == "true")
               item->setTextColor(#ff0000);
               item->setBkColor(#ffffff);
               m_Tree.InsertItem(item,NULL);
              
              
              (2)
               CSimpleTreeCtrl::TreeCtrlItem* item = new MyNewTreeCtrl::NewTreeCtrlItem ( name );
               item->setName(name);
               if( god == "true")
               item->setTextColor(#ff0000);
               item->setBkColor(#ffffff);
               m_Tree.InsertItem(item,fatherHand); 

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            static char *color[]={"white","black","red","blue","yellow","cyan","purple","green"};
            HICON hIcon[8];
            int n;
            //CImageList m_list;
            m_list.Create(16,16,0,8,8);
            hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON_WHITE);
            hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON_BLACK);
            hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICON_RED);
            hIcon[3]=AfxGetApp()->LoadIcon(IDI_ICON_BLUE);
            hIcon[4]=AfxGetApp()->LoadIcon(IDI_ICON_YELLOW);
            hIcon[5]=AfxGetApp()->LoadIcon(IDI_ICON_CYAN);
            hIcon[6]=AfxGetApp()->LoadIcon(IDI_ICON_PURPLE);
            hIcon[7]=AfxGetApp()->LoadIcon(IDI_ICON_GREEN);
            for(n=0;n<8;n++)
            m_list.Add(hIcon[n]);

            ////////////////////////////////////////////////////////
            CTreeCtrl *pTree=(CTreeCtrl *) GetDlgItem(IDC_TREE);

            pTree->SetImageList(&m_list,TVSIL_NORMAL); //設置圖片列表
            TV_INSERTSTRUCT tvinsert;    //創建待加入的TV_INSERTSTRUCT的結構
            tvinsert.hParent=NULL;       //無父節點
            tvinsert.hInsertAfter=TVI_LAST;  //插入到本層最后
            tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
            //掩碼,圖標、選選中圖標、文字
            tvinsert.item.hItem=NULL;//句柄為空
            tvinsert.item.state=0;   //狀態
            tvinsert.item.stateMask=0;//狀態為掩碼
            tvinsert.item.cchTextMax=6;//最大文字長度
            tvinsert.item.iSelectedImage=1;//選中圖標索引
            tvinsert.item.cChildren=0;   //唯有子節點
            tvinsert.item.lParam=0;     //自定義數據


            pTree->SetBkColor(#383838);
            pTree->SetTextColor(#dedede);
            //創建第一層
            tvinsert.item.iImage=5;     //一般圖標
            tvinsert.item.pszText="father";//插入第一層的一個節點“father”
            HTREEITEM hDad=pTree->InsertItem(&tvinsert);
            tvinsert.item.pszText="mother";//插入第一層的第二個節點“mother”
            HTREEITEM hMom=pTree->InsertItem(&tvinsert);
            //創建第二層
            tvinsert.hParent=hDad;            //父節點為"father"
            tvinsert.item.iImage=3;               //一般圖標
            tvinsert.item.pszText="david";          // 插入第二層father的第一個節點son
            pTree->InsertItem(&tvinsert);         
            tvinsert.item.pszText="lili";          // 插入第二層father的第一個節點son
            pTree->InsertItem(&tvinsert); 
            tvinsert.item.pszText="kate";          // 插入第二層father的第一個節點son
            pTree->InsertItem(&tvinsert);         
            tvinsert.item.pszText="jime";          // 插入第二層father的第一個節點son
            pTree->InsertItem(&tvinsert);  


            tvinsert.hParent=hMom;                   //父節點為hMom
            tvinsert.item.iImage=4;                 // 
            tvinsert.item.pszText="david";          // 插入第二層mother的第一個節點son
            pTree->InsertItem(&tvinsert);         
            tvinsert.item.pszText="lili";          // 插入第二層mother的第一個節點son
            pTree->InsertItem(&tvinsert); 
            tvinsert.item.pszText="kate";          // 插入第二層mother的第一個節點son
            pTree->InsertItem(&tvinsert);         
            tvinsert.item.pszText="jime";          // 插入第二層mother的第一個節點son

            HTREEITEM hOther=pTree->InsertItem(&tvinsert);
            //創建第三層
            tvinsert.hParent=hOther;   //父節點為jime
            tvinsert.item.iImage=7;

            tvinsert.item.pszText="tom";          // 插入第二層hOther的第一個節點tom
            pTree->InsertItem(&tvinsert);         
            tvinsert.item.pszText="baidi";          // 插入第二層hOther的第一個節點baidu
            pTree->InsertItem(&tvinsert);

            posted @ 2013-02-28 13:41 盛勝 閱讀(1484) | 評論 (0)編輯 收藏

            在MFC類庫提供了CWnd::OnCtlColor函數,在工作框架的子窗口被重畫時將調用該成員函數.因此可以重載WM_CTLCOLOR消息的響應函數.此函數的原型:

              afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor);
                       參數nCtlColor用于指定控件的類型,可以是:
                       .CTLCOLOR_BTN                按鈕控件
                       .CTLCOLOR_DLG                對話框
                       .CTLCOLOR_EDIT               編輯框
                       .CTLCOLOR_LISTBOX            列表控件
                       .CTLCOLOR_MSGBOX             消息控件
                       .CTLCOLOR_SCROLLBAR 滾動條控件
                       .CTLCOLOR_STATIC             靜態控件
            [程序實現]
                       假設你已有了名為My的對話框工程.你有了一個STATIC的控件,ID為IDC_STATIC1.
              HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
                       {
                    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
              
                    // TODO: Change any attributes of the DC here
                       if (nCtlColor==CTLCOLOR_STATIC)

                          {
                                pDC->SetTextColor(RGB(255,0,0));
              //字體顏色
                                pDC->SetBkColor(RGB(0, 0, 255));   //字體背景色  

                            }
                   
             // TODO: Return a different brush if the default is not desired
                    return hbr;
                       }


            如果要指定某個特定控件可以這樣寫:ID為IDC_STATIC1

            if (pWnd->GetDlgCtrlID()==IDC_STATIC1)
            {
                   pDC->SetTextColor
            (
            RGB(255,0,0));  //設置字體顏色
                   pDC->SetBkMode(TRANSPARENT); //設置字體背景為透明
            // TODO: Return a different brush if the default is not desired
              return (HBRUSH)::GetStockObject(BLACK_BRUSH);  // 設置背景色
            }
            else
            return hbr;

            【注】

            BLACK_BRUSH:黑色

            WHITE_BRUSH:白色

            GRAY_BRUSH:灰色

            NULL_BRUSH:透明

            HOLLOW_BRUSH :透明

             

            http://hi.baidu.com/sicceer/blog/item/1f3ac41f27f5007ef724e4f2.html

            posted @ 2013-02-28 10:44 盛勝 閱讀(1482) | 評論 (0)編輯 收藏

            一鍵解決沙盤報錯:初始化Start.exe進程失敗

            Tags:, Posted in WindowsFun,宅技術7 條留言

            相信用SandBox3.4X版本的沙盤的同學可能遇到過這種問題。

            神馬是沙盤?

            之前曾經介紹過。就是一個幫你運行懷疑或者有可能生成木馬病毒的程序的軟件。

             

            這個好東西一直妥妥的,突然有一天出錯了。可能你以為是大姨媽,但后來你發現,每次都報錯,不會每天大姨媽吧?

            錯誤

            所謂“好軟件如女朋友”,總不能你同居的女朋友每天大姨媽吧。是病,得治。

            導致這個問題的原因的:打了KB2393802補丁(后面稱③補丁)。

            SandBox原作者tzuk:

            Aha, I think I understand now. 
            The old updates, KB979683 and KB981852 install a new version of the Windows kernel in Windows XP. 
            Sandboxie looks for a record of either of these two updates, to adjust itself to this new kernel version. 
            I assume the newest update KB2393802 also installs this same new version of the Windows kernel. 
            So the problem happens for people who haven’t had KB979683 or KB981852 installed at all. 
            And then install this latest update KB2393802. In this case there is a new version of the Windows XP kernel but Sandboxie is not aware of this. 
            I will fix Sandboxie to look for a record of KB2393802, just like it does for the two older updates.

            按照原作者的話,就是:

            舊的版本更新,KB979683補丁(后面稱為①補丁)跟KB981852補丁(②補丁)為XP安裝了一個新內核。沙盤自動尋找前面兩個補丁記錄調整自己到相應的內核。如果之前安裝了①和②在安裝③補丁,沙盤也會自動調整到新的內核。 
            問題就在于,之前沒有打①②補丁的機器直接打③補丁,沙盤不能調整過來。(看來③補丁為XP又安裝了一個新的內核)

            網上很多人都說卸載③補丁,但會帶來什么樣的影響,沒有人能明確指出③補丁究竟為系統帶來什么樣影響,會不會不安全?不過大部分人是刪除了,沒辦法,年輕人,沖動嘛。

            在SandBox的官網上,我們找到更為簡潔的解決方法:

            Create registry key 
            HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP4\KB979683

            創建一個以補丁①名字命名的鍵。感覺像是蠱惑一下沙盤讀取注冊表的那個機制。得承認的是,這個可以解決問題……

            posted @ 2013-02-26 19:30 盛勝 閱讀(4605) | 評論 (0)編輯 收藏

            OpenGL可以把紋理映射到指定的圖形的表面上。簡單一點的,就是給平面映射紋理,比如一個四邊形,一個長方體的6個面,都可以指定位圖作為紋理映射到各個面上。

            關于將一個位圖作為紋理映射到某個或者多個面上,可以學習Jeff Molofee的OpenGL系列教程。

            對于指定的多個紋理,要根據自己的需要映射到不同的面上,需要對位圖創建一個數組,用來存儲位圖的名稱,然后在初始化OpenGL的時候,可以讀取這些位圖,然后生成多個紋理存儲到一個紋理數組中,接著就可以指定繪制的某個面,對該指定的面進行紋理映射。

            下面,在的Jeff Molofee教程的第六課的基礎上,實現對6個面分別進行不同的紋理映射。

            準備工作就是制作6幅不同的位圖,如圖所示:


            關鍵代碼及其說明如下。

            創建全局紋理數組

            GLuint texture[6];   // 創建一個全局的紋理數組,用來存儲將位圖轉換之后得到的紋理,對應于立方體的6個面

            加載位圖文件

            加載位圖,也就是把位圖讀取到內存空間,實現紋理的創建,加載位圖的函數說明一下:

            AUX_RGBImageRec *LoadBMP(char *Filename)    // 根據位圖文件的名稱進行加載
            {
            FILE *File=NULL;        // 文件指針

            if (!Filename)         // 如果沒有指定位圖文件名稱就返回NULL
            {
               return NULL;         
            }

            File=fopen(Filename,"r");       // 根據指定的位圖文件名稱,打開該位圖文件

            if (File)           // 如果位圖文件存在
            {
               fclose(File);         // 因為只是需要判斷問題是否存在,而不需要對位圖文件進行寫操作,所以關閉位圖文件
               return auxDIBImageLoad(Filename);   // 其實,只需要一個真正存在的位圖文件的名稱,實現加載位圖文件,并返回一個指針
            }

            return NULL;          // 位圖文件加載失敗就返回NULL
            }

            上面實現加載位圖的函數中,AUX_RGBImageRec是glaux.h中定義的類型,該類型的定義如下所示:

            /*
            ** RGB Image Structure
            */

            typedef struct _AUX_RGBImageRec {
                GLint sizeX, sizeY;
                unsigned char *data;
            } AUX_RGBImageRec;

            首先,AUX_RGBImageRec類型是一個RGB圖像結構類型。該結構定義了三個成員:

            sizeX —— 圖像的寬度;
            sizeY —— 圖像的高度;
            data; —— 圖形所包含的數據,其實也就是該圖形在內存中的像素數據的一個指針。

            AUX_RGBImageRec類型的變量描述了一幅圖像的特征。

            上述函數中,調用了glaux.h庫文件中的auxDIBImageLoad函數,其實它是一個宏,函數原型為auxRGBImageLoadW(LPCWSTR)或者auxRGBImageLoadA(LPCSTR),可以在該庫文件中找到它的定義,如下所示:

            /* AUX_RGBImageRec * APIENTRY auxRGBImageLoad(LPCTSTR); */
            #ifdef UNICODE
            #define auxRGBImageLoad auxRGBImageLoadW
            #else
            #define auxRGBImageLoad auxRGBImageLoadA
            #endif
            AUX_RGBImageRec * APIENTRY auxRGBImageLoadA(LPCSTR);
            AUX_RGBImageRec * APIENTRY auxRGBImageLoadW(LPCWSTR);

            #ifdef UNICODE
            #define auxDIBImageLoad auxDIBImageLoadW
            #else
            #define auxDIBImageLoad auxDIBImageLoadA
            #endif
            AUX_RGBImageRec * APIENTRY auxDIBImageLoadA(LPCSTR);
            AUX_RGBImageRec * APIENTRY auxDIBImageLoadW(LPCWSTR);

            宏auxDIBImageLoad實現的功能就是:根據指定的位圖名稱,將該位圖的信息加載到內存中,以便用來創建成為紋理。

            創建紋理并加載紋理

            用于創建并加載紋理的函數為LoadGLTextures,實現如下所示:

            int LoadGLTextures()         // 根據加載的位圖創建紋理
            {
            int Status=FALSE;         // 指示紋理創建是否成功的標志

            AUX_RGBImageRec *TextureImage[6];     // 創建一個紋理圖像數組,這里指定數組大小為6

            memset(TextureImage,0,sizeof(void *)*6);          // 初始化紋理圖像數組,為其分配內存

            char *pictures[] = {// 創建一個位圖名稱數組,對應6幅位圖
               "Data/No1.bmp",
               "Data/No2.bmp",
               "Data/No3.bmp",
               "Data/No4.bmp",
               "Data/No5.bmp",
               "Data/No6.bmp"
            };
            for(int i=0; i<6; i++)// 遍歷位圖名稱數組,根據位圖名稱分別生成
            {
               if (TextureImage[i]=LoadBMP(pictures[i]))// 加載位圖i成功,修改狀態標志變量Status為TRUE
               {
                Status=TRUE;         

               glGenTextures(1, &texture[i]);     // 為第i個位圖創建紋理
               glBindTexture(GL_TEXTURE_2D, texture[i]);// 將生成的紋理的名稱綁定到指定的紋理上
               glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[i]->sizeX, TextureImage[i]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[i]->data);
               glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
                glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
               }

               if (TextureImage[i])         // 釋放位圖數組占用的內存空間
               {
                if (TextureImage[i]->data)       
                {
                 free(TextureImage[i]->data);    
                }

                free(TextureImage[i]);        
               }
            }
            return Status;          // 創建紋理并加載,返回成功或者失敗的標志Status
            }

            上述函數是創建和加載紋理的核心實現。

            1、glGenTextures函數

            其中,調用了glGenTextures函數,查看MSDN可以看到,聲明如下所示:

            void glGenTextures(
            GLsizein,         
            GLuint *textures  
            );

            函數參數的含義:

            n—— 生成的紋理的名稱的個數;

            textures—— 生成的紋理名稱所存儲位置的指針,也就是一個紋理數組的內存地址,或者說是數組首元素的內存地址。

            函數被調用,會生成一系列紋理的名字,并存儲到指定的數組中。

            2、glBindTexture函數

            glBindTexture函數實現了將調用glGenTextures函數生成的紋理的名字綁定到對應的目標紋理上。該函數的聲明如下所示:

            void glBindTexture(
            GLenumtarget,  
            GLuinttexture  
            );

            函數參數的含義:

            target—— 紋理被綁定的目標,它只能取值GL_TEXTURE_1D或者GL_TEXTURE_2D;

            texture—— 紋理的名稱,并且,該紋理的名稱在當前的應用中不能被再次使用。

            3、glTexImage2D函數

            調用glTexImage2D函數,用來指定二維紋理圖像。該函數的聲明如下所示:

            void glTexImage2D(
            GLenumtarget,       
            GLintlevel,         
            GLintcomponents,    
            GLsizeiwidth,       
            GLsizeiheight,      
            GLintborder,        
            GLenumformat,       
            GLenumtype,         
            const GLvoid*pixels
            );

            函數參數的含義:

            target—— 指定目標紋理,必須為GL_TEXTURE_2D;

            level—— 指定圖像級別的編號,0表示基本圖像,其它可以參考MSDN;

            components—— 紋理中顏色組件的編號,可是是1或2或3或4;

            width—— 紋理圖像的寬度;

            height—— 紋理圖像的高度;

            border—— 紋理圖像的邊框寬度,必須是0或1;

            format—— 指定像素數據的格式,一共有9個取值:GL_COLOR_INDEX、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_RGB、GL_RGBA、GL_BGR_EXT、GL_BGRA_EXT、GL_LUMINANCE、GL_LUMINANCE_ALPHA ,具體含義可以參考MSDN;

            type—— 像素數據的數據類型,取值可以為GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, and GL_FLOAT;

            pixels—— 內存中像素數據的指針。

            4、glTexParameteri函數

            glTexParameteri函數或者glTexParameterf函數用來設置紋理參數,聲明如下所示:

            void glTexParameterf(
            GLenumtarget,
            GLenumpname,
            GLfloatparam
            );

            void glTexParameteri(
            GLenumtarget,
            GLenumpname,
            GLintparam   
            );

            函數參數的含義:

            target—— 目標紋理,必須為GL_TEXTURE_1D或GL_TEXTURE_2D;

            pname—— 用來設置紋理映射過程中像素映射的問題等,取值可以為:GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T,詳細含義可以查看MSDN;

            param—— 實際上就是pname的值,可以參考MSDN。

            另外,該類函數還有兩個:

            void glTexParameterfv(
            GLenumtarget,        
            GLenumpname,         
            const GLfloat*params
            );

            void glTexParameteriv(
            GLenumtarget,      
            GLenumpname,       
            const GLint*params
            );

            上述程序中調用如下:

                glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
                glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

            功能就是實現線形濾波的功能,當紋理映射到圖形表面以后,如果因為其它條件的設置導致紋理不能更好地顯示的時候,進行過濾,按照指定的方式進行顯示,可能會過濾掉顯示不正常的紋理像素。

            紋理映射過程

            紋理映射的過程是在DrawGLScene函數中實現的,也就是在繪制圖形的過程中,直接進行我呢里映射,或者稱為,為指定的平面貼紋理,DrawGLScene函數實現如下所示:

            int DrawGLScene(GLvoid)         
            {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glLoadIdentity();         
            glTranslatef(0.0f,0.0f,-5.0f);

            glRotatef(xrot,1.0f,0.0f,0.0f);
            glRotatef(yrot,0.0f,1.0f,0.0f);
            glRotatef(zrot,0.0f,0.0f,1.0f);


              // Front Face
            glBindTexture(GL_TEXTURE_2D, texture[0]);//   選擇第一個紋理texture[0],進行貼紋理
            glBegin(GL_QUADS);
              glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
               glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
               glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
               glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
            glEnd();

              // Back Face
            glBindTexture(GL_TEXTURE_2D, texture[1]);//   選擇第二個紋理texture[1],進行貼紋理
            glBegin(GL_QUADS);
               glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
               glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
               glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
               glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
            glEnd();

              // Top Face
            glBindTexture(GL_TEXTURE_2D, texture[2]);//   選擇第三個紋理texture[2],進行貼紋理
            glBegin(GL_QUADS);
               glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
               glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
               glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
               glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
            glEnd();

              // Bottom Face
            glBindTexture(GL_TEXTURE_2D, texture[3]);//   選擇第四個紋理texture[3],進行貼紋理
            glBegin(GL_QUADS);
               glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
               glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
               glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
               glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
            glEnd();

              // Right face
            glBindTexture(GL_TEXTURE_2D, texture[4]);//   選擇第五個紋理texture[4],進行貼紋理
            glBegin(GL_QUADS);
               glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
               glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
               glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
               glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
            glEnd();

              // Left Face
            glBindTexture(GL_TEXTURE_2D, texture[5]);//   選擇第六個紋理texture[5],進行貼紋理
            glBegin(GL_QUADS);
               glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
               glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
               glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
               glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
            glEnd();

            xrot+=0.3f;
            yrot+=0.2f;
            zrot+=0.4f;
            return TRUE;          
            }

            因為,通過前面的過程,已經將位圖加載并創建和加載紋理成功,紋理數組已經存在于內存之中,調用上述函數實現紋理映射,即,從內存中取出指定的紋理,將其映射到立方體的指定的面上。

            上述函數中調用了glTexCoord2f函數,設置紋理坐標,該函數的聲明如下所示:

            void glTexCoord2f(
            GLfloats,
            GLfloatt
            );

            glTexCoord2f 的第一個參數是X坐標,當s=0.0f 時是紋理的左側,s=0.5f 時是紋理的中點,s=1.0f 時是紋理的右側。 glTexCoord2f 的第二個參數是Y坐標,t=0.0f 是紋理的底部,t=0.5f 是紋理的中點, t=1.0f 是紋理的頂部。

            上述函數在為前面那個面映射紋理的時候調用如下:

               // Front Face
            glBindTexture(GL_TEXTURE_2D, texture[0]);
            glBegin(GL_QUADS);
               glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
               glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
               glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
               glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
            glEnd();

            其中:

            glTexCoord2f(0.0f, 0.0f);表示將紋理texture[0]的左下角坐標(0.0f, 0.0f)映射到立方體前面那個面的頂點(-1.0f, -1.0f, 1.0)上;

            glTexCoord2f(1.0f, 0.0f);表示將紋理texture[0]的右下角坐標(1.0f, 0.0f)映射到立方體前面那個面的頂點(1.0f, -1.0f, 1.0f)上;

            glTexCoord2f(1.0f, 1.0f);表示將紋理texture[0]的右上角坐標(1.0f, 1.0f)映射到立方體前面那個面的頂點(1.0f, 1.0f, 1.0f)上;

            glTexCoord2f(0.0f, 1.0f);表示將紋理texture[0]的左上角坐標(0.0f, 1.0f)映射到立方體前面那個面的頂點(-1.0f, 1.0f, 1.0f)上。

            這樣,紋理texture[0]就被映射到了立方體前面那個面上。

            紋理映射結果

            為了使立方體能夠運動起來,對立方體進行累的旋轉變換,而且,定義了三個全局變量:

            GLfloat xrot;    // 沿著x旋轉的變量
            GLfloat yrot;    // 沿著y旋轉的變量
            GLfloat zrot;   // 沿著z旋轉的變量

            初始化都為0,然后,在每次調用DrawGLScene函數的時候,改變x、y、z的分量值,在DrawGLScene函數中如下所示:

            xrot+=0.3f;
            yrot+=0.2f;
            zrot+=0.4f;

            在DrawGLScene函數中還要執行旋轉變換:

            glRotatef(xrot,1.0f,0.0f,0.0f);
            glRotatef(yrot,0.0f,1.0f,0.0f);
            glRotatef(zrot,0.0f,0.0f,1.0f);

            每次重繪都在改變旋轉軸,所以我們繪制的立方體能夠動起來,看到各個進行紋理映射的面的效果,如圖所示




            posted @ 2013-02-20 09:52 盛勝 閱讀(3043) | 評論 (0)編輯 收藏

                 摘要: VC用ADO訪問數據庫全攻略,介紹了VC用ADO來訪問數據庫的各個對象及各方法,很經典,也很實用,很值得一看。 正文 一、ADO概述 ADO是Microsoft為最新和最強大的數據訪問范例 OLE DB 而設計的,是一個便于使用的應用程序層接口。ADO 使您能夠編寫應用程序以通過 OLE. DB 提供者訪問和操作數據庫服務器中的數據。ADO 最主要的優點是易于使用、速...  閱讀全文

            posted @ 2013-02-18 08:50 盛勝 閱讀(10459) | 評論 (0)編輯 收藏

            //方案— 優點:僅使用C標準庫;缺點:只能精確到秒級
            #include <time.h> 
            #include <stdio.h> 
            int main( void ) 
                time_t t = time(0); 
                char tmp[64]; 
                strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t) ); 
                puts( tmp ); 
                return 0; 
            }
            size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);
            根據格式字符串生成字符串。
            struct tm *localtime(const time_t *timer);
            取得當地時間,localtime獲取的結果由結構tm返回
            返回的字符串可以依下列的格式而定:
            %a 星期幾的縮寫。Eg:Tue 
            %A 星期幾的全名。 Eg: Tuesday
            %b 月份名稱的縮寫。 
            %B 月份名稱的全名。 
            %c 本地端日期時間較佳表示字符串。 
            %d 用數字表示本月的第幾天 (范圍為 00 至 31)。日期
            %H 用 24 小時制數字表示小時數 (范圍為 00 至 23)。 
            %I 用 12 小時制數字表示小時數 (范圍為 01 至 12)。 
            %j 以數字表示當年度的第幾天 (范圍為 001 至 366)。 
            %m 月份的數字 (范圍由 1 至 12)。
            %M 分鐘。 
            %p 以 ''AM'' 或 ''PM'' 表示本地端時間。 
            %S 秒數。 
            %U 數字表示為本年度的第幾周,第一個星期由第一個周日開始。 
            %W 數字表示為本年度的第幾周,第一個星期由第一個周一開始。 
            %w 用數字表示本周的第幾天 ( 0 為周日)。 
            %x 不含時間的日期表示法。 
            %X 不含日期的時間表示法。 Eg: 15:26:30
            %y 二位數字表示年份 (范圍由 00 至 99)。 
            %Y 完整的年份數字表示,即四位數。 Eg:2008
            %Z(%z) 時區或名稱縮寫。Eg:中國標準時間 
            %% % 字符。

            //方案二 優點:能精確到毫秒級;缺點:使用了windows API 
            #include <windows.h> 
            #include <stdio.h> 
            int main( void ) 
            SYSTEMTIME sys; 
            GetLocalTime( &sys ); 
            printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d/n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek); 
            return 0;
            }
            //方案三,優點:利用系統函數,還能修改系統時間
            //此文件必須是c++文件
            #include<stdlib.h>
            #include<iostream>
            using namespace std;
            void main()
            {
                system("time");
            }
            //方案四,將當前時間折算為秒級,再通過相應的時間換算即可
            //此文件必須是c++文件
            #include<iostream>
            #include<ctime>
            using namespace std;
            int main()
            {
            time_t now_time;
            now_time = time(NULL);
            cout<<now_time;
            return 0;
            }

            posted @ 2013-02-17 10:31 盛勝 閱讀(2220) | 評論 (0)編輯 收藏

            僅列出標題
            共14頁: 1 2 3 4 5 6 7 8 9 Last 
            国产三级精品久久| 久久无码AV一区二区三区| 青青青青久久精品国产h久久精品五福影院1421 | 国产叼嘿久久精品久久| 国产精品99精品久久免费| 色偷偷久久一区二区三区| 精品熟女少妇AV免费久久| 伊色综合久久之综合久久| 日韩AV毛片精品久久久| 亚洲午夜无码AV毛片久久| 久久久久亚洲AV无码观看| 久久久久久国产精品美女| 亚洲精品无码久久久久去q | 伊人色综合九久久天天蜜桃| 久久九九久精品国产免费直播| 久久国产乱子伦精品免费午夜| 青春久久| 人妻久久久一区二区三区| 91久久精一区二区三区大全| 久久成人国产精品二三区| 办公室久久精品| 久久夜色精品国产噜噜亚洲a| 国产A级毛片久久久精品毛片| 国产精品一区二区久久不卡| 成人亚洲欧美久久久久| 色偷偷91久久综合噜噜噜噜| 无码伊人66久久大杳蕉网站谷歌 | 久久影视综合亚洲| 久久精品国产亚洲AV蜜臀色欲| 国产一久久香蕉国产线看观看 | 69SEX久久精品国产麻豆| 国产精品九九久久免费视频 | 国产精品美女久久久久网| 久久狠狠一本精品综合网| 久久久久久久久波多野高潮| 久久夜色精品国产亚洲| 久久福利资源国产精品999| 91精品国产综合久久精品| 怡红院日本一道日本久久| 中文字幕人妻色偷偷久久| 久久成人18免费网站|