• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

                 摘要: 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 盛勝 閱讀(7951) | 評論 (0)編輯 收藏

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

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

            復(fù)制代碼
            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
            復(fù)制代碼

            VC2005中DateTimePicker控件的使用

            復(fù)制代碼
             1 1 顯示年月日時分秒的當(dāng)前時間
            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轉(zhuǎn)CString
            12 CString strTime;
            13 COleDateTime dtTime;
            14 strTime =dtTime.Format(_T("%Y-%m-%d %H:%M:%S"));
            復(fù)制代碼


            CString轉(zhuǎn)COleDateTime(因為VS2005時間日期控件關(guān)聯(lián)的Value變量默認(rèn)是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時 參數(shù)需要為指針

            復(fù)制代碼
             1   m_ctrlMachineDeliveryDate.SetTime(&CTime::GetCurrentTime()); //將控件顯示當(dāng)前日期
            2 m_ctrlMachineInstallDate.SetTime(&CTime::GetCurrentTime());
            3
            4
            5
            6 CTime tDeliveryDate;
            7 m_ctrlMachineDeliveryDate.GetTime(tDeliveryDate); //獲取發(fā)貨日期
            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);
            復(fù)制代碼

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

            復(fù)制代碼
             1  CTime tCurrentTime= CTime::GetCurrentTime();
            2 CTimeSpan timespanOneMonth(30,0,0,0); //這里設(shè)置為當(dāng)前日期推后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();//設(shè)置初始值為當(dāng)前時間
            10 m_dtcTm.SetTime(&m_tmClock);
            11 //m_dtcTm.SetFormat("yyyy-MM-dd HH'時'mm'分'"); //設(shè)置字符串格式
            12 m_dtcTm.SetFormat("yyyy-MM-dd HH:mm:ss");
            13 */
            復(fù)制代碼

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

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

            posted @ 2013-03-01 14:01 盛勝 閱讀(1239) | 評論 (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) // 選中父結(jié)點時他的直接孩子(兒子)結(jié)點同時被選中 
              //{ 
              // if ( m_ctrTree.GetCheck( hitItem ) )
              //
              // ChangeTreeItemDirect(m_ctrTree,hitItem,FALSE); 
              // }
              // else 
              //
              // ChangeTreeItemDirect(m_ctrTree,hitItem,TRUE); 
              // }
              //} 
            //   if(m_bSelectAll) // 選中父結(jié)點時他的孩子結(jié)點以及所有后代(孫子)的節(jié)點被選中 
               
                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) 
            //遞歸獲取當(dāng)前節(jié)點下的子節(jié)點 
            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)); //鼠標(biāo)的屏幕坐標(biāo)
            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); //這時父節(jié)點還沒有更新,需要取反 
            UpdateTreeCheck(hItem,!flag); 
            }
            m_ctrTree.Select(hItem, TVGN_CARET);
            *pResult = 0;
            }

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

            TreeCtrl的擴(kuò)展類,可以改節(jié)點字體顏色和背景色
            類下載:http://www.codeproject.com/treectrl/simptree.asp
              其中有CSimpleTreeCtrl類和MyNewTreeCtrl類兩個
              CSimpleTreeCtrl類繼承自CTreeCtrl,而MyNewTreeCtrl類繼承自CSimpleTreeCtrl類
              生成MyNewTreeCtrl的對象,加載到主面板中。
              比CTreeCtrl控件好用的地方在:插入節(jié)點很直觀,可以改變某節(jié)點的顏色和背景色,可以很方便的得到父節(jié)點和子節(jié)點
              getNumChildren:得到子節(jié)點的個數(shù)
              addChild:在自己下面增加子節(jié)點
              getChild ( int i ):得到子節(jié)點i
              getParent():得到父節(jié)點
              InsertItem( item, parent ):在parent后插入item
              setTextColor:設(shè)置字體顏色
              setBkColor:設(shè)置背景顏色
              
              示例:
              (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); //設(shè)置圖片列表
            TV_INSERTSTRUCT tvinsert;    //創(chuàng)建待加入的TV_INSERTSTRUCT的結(jié)構(gòu)
            tvinsert.hParent=NULL;       //無父節(jié)點
            tvinsert.hInsertAfter=TVI_LAST;  //插入到本層最后
            tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
            //掩碼,圖標(biāo)、選選中圖標(biāo)、文字
            tvinsert.item.hItem=NULL;//句柄為空
            tvinsert.item.state=0;   //狀態(tài)
            tvinsert.item.stateMask=0;//狀態(tài)為掩碼
            tvinsert.item.cchTextMax=6;//最大文字長度
            tvinsert.item.iSelectedImage=1;//選中圖標(biāo)索引
            tvinsert.item.cChildren=0;   //唯有子節(jié)點
            tvinsert.item.lParam=0;     //自定義數(shù)據(jù)


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


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

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

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

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

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

              afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor);
                       參數(shù)nCtlColor用于指定控件的類型,可以是:
                       .CTLCOLOR_BTN                按鈕控件
                       .CTLCOLOR_DLG                對話框
                       .CTLCOLOR_EDIT               編輯框
                       .CTLCOLOR_LISTBOX            列表控件
                       .CTLCOLOR_MSGBOX             消息控件
                       .CTLCOLOR_SCROLLBAR 滾動條控件
                       .CTLCOLOR_STATIC             靜態(tài)控件
            [程序?qū)崿F(xiàn)]
                       假設(shè)你已有了名為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));  //設(shè)置字體顏色
                   pDC->SetBkMode(TRANSPARENT); //設(shè)置字體背景為透明
            // TODO: Return a different brush if the default is not desired
              return (HBRUSH)::GetStockObject(BLACK_BRUSH);  // 設(shè)置背景色
            }
            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 盛勝 閱讀(1489) | 評論 (0)編輯 收藏

            一鍵解決沙盤報錯:初始化Start.exe進(jìn)程失敗

            Tags:, Posted in WindowsFun,宅技術(shù)7 條留言

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

            神馬是沙盤?

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

             

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

            錯誤

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

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

            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補(bǔ)丁(后面稱為①補(bǔ)丁)跟KB981852補(bǔ)丁(②補(bǔ)丁)為XP安裝了一個新內(nèi)核。沙盤自動尋找前面兩個補(bǔ)丁記錄調(diào)整自己到相應(yīng)的內(nèi)核。如果之前安裝了①和②在安裝③補(bǔ)丁,沙盤也會自動調(diào)整到新的內(nèi)核。 
            問題就在于,之前沒有打①②補(bǔ)丁的機(jī)器直接打③補(bǔ)丁,沙盤不能調(diào)整過來。(看來③補(bǔ)丁為XP又安裝了一個新的內(nèi)核)

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

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

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

            創(chuàng)建一個以補(bǔ)丁①名字命名的鍵。感覺像是蠱惑一下沙盤讀取注冊表的那個機(jī)制。得承認(rèn)的是,這個可以解決問題……

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

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

            關(guān)于將一個位圖作為紋理映射到某個或者多個面上,可以學(xué)習(xí)Jeff Molofee的OpenGL系列教程。

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

            下面,在的Jeff Molofee教程的第六課的基礎(chǔ)上,實現(xiàn)對6個面分別進(jìn)行不同的紋理映射。

            準(zhǔn)備工作就是制作6幅不同的位圖,如圖所示:


            關(guān)鍵代碼及其說明如下。

            創(chuàng)建全局紋理數(shù)組

            GLuint texture[6];   // 創(chuàng)建一個全局的紋理數(shù)組,用來存儲將位圖轉(zhuǎn)換之后得到的紋理,對應(yīng)于立方體的6個面

            加載位圖文件

            加載位圖,也就是把位圖讀取到內(nèi)存空間,實現(xiàn)紋理的創(chuàng)建,加載位圖的函數(shù)說明一下:

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

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

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

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

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

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

            /*
            ** RGB Image Structure
            */

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

            首先,AUX_RGBImageRec類型是一個RGB圖像結(jié)構(gòu)類型。該結(jié)構(gòu)定義了三個成員:

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

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

            上述函數(shù)中,調(diào)用了glaux.h庫文件中的auxDIBImageLoad函數(shù),其實它是一個宏,函數(shù)原型為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實現(xiàn)的功能就是:根據(jù)指定的位圖名稱,將該位圖的信息加載到內(nèi)存中,以便用來創(chuàng)建成為紋理。

            創(chuàng)建紋理并加載紋理

            用于創(chuàng)建并加載紋理的函數(shù)為LoadGLTextures,實現(xiàn)如下所示:

            int LoadGLTextures()         // 根據(jù)加載的位圖創(chuàng)建紋理
            {
            int Status=FALSE;         // 指示紋理創(chuàng)建是否成功的標(biāo)志

            AUX_RGBImageRec *TextureImage[6];     // 創(chuàng)建一個紋理圖像數(shù)組,這里指定數(shù)組大小為6

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

            char *pictures[] = {// 創(chuàng)建一個位圖名稱數(shù)組,對應(yīng)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++)// 遍歷位圖名稱數(shù)組,根據(jù)位圖名稱分別生成
            {
               if (TextureImage[i]=LoadBMP(pictures[i]))// 加載位圖i成功,修改狀態(tài)標(biāo)志變量Status為TRUE
               {
                Status=TRUE;         

               glGenTextures(1, &texture[i]);     // 為第i個位圖創(chuàng)建紋理
               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])         // 釋放位圖數(shù)組占用的內(nèi)存空間
               {
                if (TextureImage[i]->data)       
                {
                 free(TextureImage[i]->data);    
                }

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

            上述函數(shù)是創(chuàng)建和加載紋理的核心實現(xiàn)。

            1、glGenTextures函數(shù)

            其中,調(diào)用了glGenTextures函數(shù),查看MSDN可以看到,聲明如下所示:

            void glGenTextures(
            GLsizein,         
            GLuint *textures  
            );

            函數(shù)參數(shù)的含義:

            n—— 生成的紋理的名稱的個數(shù);

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

            函數(shù)被調(diào)用,會生成一系列紋理的名字,并存儲到指定的數(shù)組中。

            2、glBindTexture函數(shù)

            glBindTexture函數(shù)實現(xiàn)了將調(diào)用glGenTextures函數(shù)生成的紋理的名字綁定到對應(yīng)的目標(biāo)紋理上。該函數(shù)的聲明如下所示:

            void glBindTexture(
            GLenumtarget,  
            GLuinttexture  
            );

            函數(shù)參數(shù)的含義:

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

            texture—— 紋理的名稱,并且,該紋理的名稱在當(dāng)前的應(yīng)用中不能被再次使用。

            3、glTexImage2D函數(shù)

            調(diào)用glTexImage2D函數(shù),用來指定二維紋理圖像。該函數(shù)的聲明如下所示:

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

            函數(shù)參數(shù)的含義:

            target—— 指定目標(biāo)紋理,必須為GL_TEXTURE_2D;

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

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

            width—— 紋理圖像的寬度;

            height—— 紋理圖像的高度;

            border—— 紋理圖像的邊框?qū)挾龋仨毷?或1;

            format—— 指定像素數(shù)據(jù)的格式,一共有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—— 像素數(shù)據(jù)的數(shù)據(jù)類型,取值可以為GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, and GL_FLOAT;

            pixels—— 內(nèi)存中像素數(shù)據(jù)的指針。

            4、glTexParameteri函數(shù)

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

            void glTexParameterf(
            GLenumtarget,
            GLenumpname,
            GLfloatparam
            );

            void glTexParameteri(
            GLenumtarget,
            GLenumpname,
            GLintparam   
            );

            函數(shù)參數(shù)的含義:

            target—— 目標(biāo)紋理,必須為GL_TEXTURE_1D或GL_TEXTURE_2D;

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

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

            另外,該類函數(shù)還有兩個:

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

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

            上述程序中調(diào)用如下:

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

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

            紋理映射過程

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

            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],進(jìn)行貼紋理
            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],進(jìn)行貼紋理
            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],進(jìn)行貼紋理
            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],進(jìn)行貼紋理
            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],進(jìn)行貼紋理
            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],進(jìn)行貼紋理
            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;          
            }

            因為,通過前面的過程,已經(jīng)將位圖加載并創(chuàng)建和加載紋理成功,紋理數(shù)組已經(jīng)存在于內(nèi)存之中,調(diào)用上述函數(shù)實現(xiàn)紋理映射,即,從內(nèi)存中取出指定的紋理,將其映射到立方體的指定的面上。

            上述函數(shù)中調(diào)用了glTexCoord2f函數(shù),設(shè)置紋理坐標(biāo),該函數(shù)的聲明如下所示:

            void glTexCoord2f(
            GLfloats,
            GLfloatt
            );

            glTexCoord2f 的第一個參數(shù)是X坐標(biāo),當(dāng)s=0.0f 時是紋理的左側(cè),s=0.5f 時是紋理的中點,s=1.0f 時是紋理的右側(cè)。 glTexCoord2f 的第二個參數(shù)是Y坐標(biāo),t=0.0f 是紋理的底部,t=0.5f 是紋理的中點, t=1.0f 是紋理的頂部。

            上述函數(shù)在為前面那個面映射紋理的時候調(diào)用如下:

               // 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]的左下角坐標(biāo)(0.0f, 0.0f)映射到立方體前面那個面的頂點(-1.0f, -1.0f, 1.0)上;

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

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

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

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

            紋理映射結(jié)果

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

            GLfloat xrot;    // 沿著x旋轉(zhuǎn)的變量
            GLfloat yrot;    // 沿著y旋轉(zhuǎn)的變量
            GLfloat zrot;   // 沿著z旋轉(zhuǎn)的變量

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

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

            在DrawGLScene函數(shù)中還要執(zhí)行旋轉(zhuǎn)變換:

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

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




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

                 摘要: VC用ADO訪問數(shù)據(jù)庫全攻略,介紹了VC用ADO來訪問數(shù)據(jù)庫的各個對象及各方法,很經(jīng)典,也很實用,很值得一看。 正文 一、ADO概述 ADO是Microsoft為最新和最強(qiáng)大的數(shù)據(jù)訪問范例 OLE DB 而設(shè)計的,是一個便于使用的應(yīng)用程序?qū)咏涌凇DO 使您能夠編寫應(yīng)用程序以通過 OLE. DB 提供者訪問和操作數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)。ADO 最主要的優(yōu)點是易于使用、速...  閱讀全文

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

            //方案— 優(yōu)點:僅使用C標(biāo)準(zhǔn)庫;缺點:只能精確到秒級
            #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);
            根據(jù)格式字符串生成字符串。
            struct tm *localtime(const time_t *timer);
            取得當(dāng)?shù)貢r間,localtime獲取的結(jié)果由結(jié)構(gòu)tm返回
            返回的字符串可以依下列的格式而定:
            %a 星期幾的縮寫。Eg:Tue 
            %A 星期幾的全名。 Eg: Tuesday
            %b 月份名稱的縮寫。 
            %B 月份名稱的全名。 
            %c 本地端日期時間較佳表示字符串。 
            %d 用數(shù)字表示本月的第幾天 (范圍為 00 至 31)。日期
            %H 用 24 小時制數(shù)字表示小時數(shù) (范圍為 00 至 23)。 
            %I 用 12 小時制數(shù)字表示小時數(shù) (范圍為 01 至 12)。 
            %j 以數(shù)字表示當(dāng)年度的第幾天 (范圍為 001 至 366)。 
            %m 月份的數(shù)字 (范圍由 1 至 12)。
            %M 分鐘。 
            %p 以 ''AM'' 或 ''PM'' 表示本地端時間。 
            %S 秒數(shù)。 
            %U 數(shù)字表示為本年度的第幾周,第一個星期由第一個周日開始。 
            %W 數(shù)字表示為本年度的第幾周,第一個星期由第一個周一開始。 
            %w 用數(shù)字表示本周的第幾天 ( 0 為周日)。 
            %x 不含時間的日期表示法。 
            %X 不含日期的時間表示法。 Eg: 15:26:30
            %y 二位數(shù)字表示年份 (范圍由 00 至 99)。 
            %Y 完整的年份數(shù)字表示,即四位數(shù)。 Eg:2008
            %Z(%z) 時區(qū)或名稱縮寫。Eg:中國標(biāo)準(zhǔn)時間 
            %% % 字符。

            //方案二 優(yōu)點:能精確到毫秒級;缺點:使用了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;
            }
            //方案三,優(yōu)點:利用系統(tǒng)函數(shù),還能修改系統(tǒng)時間
            //此文件必須是c++文件
            #include<stdlib.h>
            #include<iostream>
            using namespace std;
            void main()
            {
                system("time");
            }
            //方案四,將當(dāng)前時間折算為秒級,再通過相應(yīng)的時間換算即可
            //此文件必須是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 盛勝 閱讀(2224) | 評論 (0)編輯 收藏

            僅列出標(biāo)題
            共14頁: 1 2 3 4 5 6 7 8 9 Last 
            无码人妻久久一区二区三区蜜桃| 久久午夜无码鲁丝片秋霞 | 人妻无码精品久久亚瑟影视 | 久久久99精品成人片中文字幕| 思思久久99热免费精品6| 亚洲午夜久久久| 国产精品久久影院| 久久午夜综合久久| 亚洲一区中文字幕久久| 一级做a爰片久久毛片免费陪| 久久无码人妻一区二区三区| 久久青青草原精品国产软件| 久久婷婷五月综合国产尤物app| 99久久亚洲综合精品网站| 久久无码AV中文出轨人妻| 无码国产69精品久久久久网站| 伊人久久成人成综合网222| 精品久久久久久无码专区| 无码人妻精品一区二区三区久久 | 久久久久人妻一区精品性色av| 久久天天躁夜夜躁狠狠| 93精91精品国产综合久久香蕉| 日本人妻丰满熟妇久久久久久| 免费一级做a爰片久久毛片潮| 久久综合九色综合精品| 2020最新久久久视精品爱| 久久综合综合久久综合| 国内精品久久久久久久久电影网 | 一本久久a久久精品综合香蕉| 丁香五月综合久久激情| 国产成人久久精品区一区二区| 人妻无码αv中文字幕久久琪琪布| 无码国内精品久久人妻麻豆按摩| 久久亚洲中文字幕精品一区| 九九久久精品无码专区| 久久99精品久久久久久噜噜| 2021国产成人精品久久| 国产成人精品久久综合| 久久精品国产国产精品四凭| 久久国产精品一区| 免费精品久久久久久中文字幕|