青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 131, comments - 12, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

一、對話框中顯示對話框的方法:
1、首先創建要在對話框里顯示的那個對話框,命名為:IDD_INNER。
設置這個對話框的屬性:
1)、“Style”選擇“Child”;中文版“樣式”選擇“下層”。
2)、“Border”為“None”;中文版“邊框”選擇“無”。
 
2、為了顯示時能夠準確定位,我們可以在右邊要顯示對話框的地方放入一個Pic控件,命名為:IDC_STATIC_RECT,Visible屬性去掉。
 
3、得到Pic控件客戶區坐標
//CDlgParent.cpp ——OnInitDialog()
CRect rect;
GetDlgItem_r(IDC_STATIC_RECT)-> GetWindowRect_r(&rect);
ScreenToClient(&rect);   //千萬注意別用成ClientToScreen(&rect);
 
4、創建并顯示對話框
方式一:
//CDlgParent.h
CDialog m_InnerDlg;
//CDlgParent.cpp——OnInitDialog()
m_InnerDlg.Create(IDD_INNER, this);
m_InnerDlg.MoveWindow(rect.left, rect.top, rect.Width(), rect.Height());
m_InnerDlg.ShowWindow( SW_SHOW );
 
方式二:
//CDlgParent.h
CDialog *m_pInnerDlg;
 
//CDlgParent.cpp——OnInitDialog()
m_pInnerDlg = new CDialog();
m_pInnerDlg->Create(IDD_INNER, this);
m_pInnerDlg->MoveWindow(rect.left, rect.top, rect.Width(), rect.Height());
m_pInnerDlg->ShowWindow( SW_SHOW );
 
//CDlgParent.cpp——OnCancel()
delete m_pInnerDlg;
 
二、注意事項:
1、子對話框可以為“堆變量”或“父對話框成員”,但不能為OnInitDialog()內的局部變量(棧內變量),否則在退出OnInitDialog時,子對話框的析構函數會銷毀窗口。
2、因為在一個界面里同時有兩個甚至多個對話框,所以Tab Order必定存在沖突,這就導致:
如果Radio Button的Tab Order存在沖突,在點擊Radio Button時,系統將不能根據Tab Order找到與其同組的其它Radio Button,這會導致程序崩潰。
注釋:如果是想在子窗口中添加控件或者畫圖的話,就應該為子窗口添加一個類,則在初始化對象時應用該類初始化。如:CClidDlg m_pInnerDlg;

posted @ 2012-11-13 15:16 盛勝 閱讀(609) | 評論 (0)編輯 收藏

第一步,新建對話框資源C****Dlg
第二步,右鍵該新建的C****Dlg視圖給它添加C****Dlg類,類型CDialog
第三步,在原來的對話框 cpp文件中添加新類的頭文件
第四步,在原來的對話框中添加button,在button的單擊事件中添加代碼

         C****Dlg  ***dlg;//創建類的對象
         CDialog::OnCancel();//關閉當前窗口
***dlg.DoModal();//打開新的對話框

posted @ 2012-11-13 10:57 盛勝 閱讀(409) | 評論 (0)編輯 收藏

@ECHO 正在安裝數據庫....
copy "****.sql" "C:\Program Files\MySQL\MySQL Server 5.5\bin\****.sql"
cd C:\Program Files\MySQL\MySQL Server 5.5\bin
mysql   -f   -h   localhost   -u   root   -proot   test   <****.sql> c:\db.log
@ECHO 安裝完畢 
pause

posted @ 2012-11-12 11:57 盛勝 閱讀(224) | 評論 (0)編輯 收藏

     摘要: 現在正做一個接口,通過不同的連接字符串操作不同的數據庫。要用到mysql數據庫,以前沒用過這個數據庫,用access和sql server比較多。通過網上的一些資料和自己的摸索,大致清楚了C++連接mysql的方法??梢酝ㄟ^2種方法實現。第一種方法是利用ADO連接,第二種方法是利用mysql自己的api函數進行連接。第一種方法可以實現我當前的需求,通過連接不同的字符串來連接不同的數據庫。暫時只連接...  閱讀全文

posted @ 2012-11-12 09:44 盛勝 閱讀(441) | 評論 (1)編輯 收藏

ShellExecute(   
hWnd: HWND;     {指定父窗口句柄}
Operation: PChar;  {指定動作, 譬如: open、print}  
FileName: PChar;  {指定要打開的文件或程序}  
Parameters: PChar; {給要打開的程序指定參數; 如果打開的是文件這里應該是 nil}  
Directory: PChar;  {缺省目錄}  
ShowCmd: Integer  {打開選項}
): HINST;  {執行成功會返回應用程序句柄; 如果這個值 <= 32, 表示執行錯誤} //返回值可能的錯誤有:
= 0  {內存不足} ERROR_FILE_NOT_FOUND 
= 2;  {文件名錯誤} ERROR_PATH_NOT_FOUND 
= 3;  {路徑名錯誤} ERROR_BAD_FORMAT     
= 11; {EXE 文件無效} SE_ERR_SHARE         
= 26; {發生共享錯誤} SE_ERR_ASSOCINCOMPLETE
= 27; {文件名不完全或無效} SE_ERR_DDETIMEOUT     
= 28; {超時} SE_ERR_DDEFAIL       
= 29; {DDE 事務失敗} SE_ERR_DDEBUSY       
= 30; {正在處理其他 DDE 事務而不能完成該 DDE 事務} SE_ERR_NOASSOC       
= 31; {沒有相關聯的應用程序}
//ShowCmd 參數可選值:
SW_HIDE = 0;  {隱藏}
SW_SHOWNORMAL = 1; {用最近的大小和位置顯示, 激活}
SW_NORMAL          = 1;  {同 SW_SHOWNORMAL}
SW_SHOWMINIMIZED  = 2;  {最小化, 激活}
SW_SHOWMAXIMIZED  = 3;  {最大化, 激活}
SW_MAXIMIZE        = 3;  {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE  = 4;  {用最近的大小和位置顯示, 不激活}
SW_SHOW            = 5;  {同 SW_SHOWNORMAL}
SW_MINIMIZE        = 6;  {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7;  {同 SW_MINIMIZE}
SW_SHOWNA          = 8;  {同 SW_SHOWNOACTIVATE}
SW_RESTORE        = 9;  {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT    = 10; {同 SW_SHOWNORMAL}
SW_MAX            = 10; {同 SW_SHOWNORMAL}
//舉例說明更多問題(別忘了 uses ShellAPI;): {譬如用記事本打開一個文件} begin   ShellExecute(Handle, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end;
{第一個參數是用來當作錯誤提示窗口的父窗口的, 不能是 nil, 可以是 0(也就是桌面窗口)} begin   ShellExecute(0, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end;
{第二個參數如果是 nil, 也會默認位 open} begin   ShellExecute(0, nil, 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end;
{文件路徑可以放在參數五} begin   ShellExecute(0, nil, 'notepad.exe', 'SchedLgU.Txt', 'C:\WINDOWS', SW_SHOWNORMAL); end;
{把參數三直接指定為要打開的文件, 文件將用對應默認程序打開; 次數參數四應為 nil} begin   ShellExecute(0, nil, 'SchedLgU.Txt', nil, 'C:\WINDOWS', SW_SHOWNORMAL); end;
{如果文件在: 程序目錄/當前目錄/System32/Windows/PATH環境變量中, 參數五也可以 nil} begin   ShellExecute(0, nil, 'SchedLgU.Txt', nil, nil, SW_SHOWNORMAL); end;
{如果參數三是個文件, 可以用參數二命令打印} begin   ShellExecute(0, 'print', 'SchedLgU.Txt', nil, nil, 1); end;
{用 IE 打開網頁} begin   ShellExecute(Handle, 'open', 'IExplore.EXE', 'about:blank', nil, SW_SHOWNORMAL); end;
{用火狐打開網頁} begin   ShellExecute(Handle, 'open', 'firefox.exe', 'about:blank', nil, SW_SHOWNORMAL); end;
{用默認瀏覽器打開網頁} begin   ShellExecute(Handle, 'open', 'Explorer.exe', 'about:blank', nil, SW_SHOWNORMAL); end;
{還是用默認瀏覽器打開網頁} begin   ShellExecute(0, nil, 'http://del.cnblogs.com', nil, nil, 1); end;

posted @ 2012-11-09 15:16 盛勝 閱讀(354) | 評論 (0)編輯 收藏

步驟

1. 開始

   網上說一般的打包工程選擇Basic MSI Project,如果需要對界面需要進行很高的定制就需要選擇InstallScript MSI Project。

由于我只需要打包,已經執行部分腳本因此我選擇了Basic MSI Project。輸入Project Name,選擇Location后點擊OK,新建工程。

進入到下圖界面,此時我們可以選擇兩種打包方式(紅框處選擇)

1.Project Assistant   可以進行簡單的類似向導類的配置即可進行打包工作,如果選擇這種方式,Visual Studio自帶的工具也能輕松實現

2.Installation Designer 完全自由化的配置,自我定制程度最高。

根據需求情況,我自然選擇第二種方式

2.配置

點選Installation Designer,進入如下界面

image

紅框處就是需要選擇配置的區域了。

 

2.1 General Information

在Installation Information中選擇General Information,在這里配置軟件的基本信息

image

紅線處你可以寫上你的大名,你是這個Project的作者

下面的Setup Langueages可以選擇安裝語言,我這里只考慮了簡體中文,故未更改設置。

R0(NKEJLG6%FKR7[GF~[6EI

紅框里填寫上你公司的名字和網址,我舉個例子才寫的這兩個

image

在Product Properties中填入軟件的信息,軟件的名字、版本什么的。

INSTALLDIR是指安裝目錄,圖中的配置方法默認是指這個路徑: C:/Program Files/Transformers/Demo

 

2.2 Files

003 File and Folders

右邊的區域被分成了四塊,上面兩塊是本地計算機,下面兩塊是目標計算機

總的思路跟資源管理一樣,這里你就可以按照你自己的思路來定制了

舉個列子,我隨便找點東西打包

在Destination computer’s folders中把樹展開,選中Demo[INSTALLDIR],這是什么東西相信看看就明白了,如果不明白的話那就需要再學習下基礎知識了。

從Source computer‘s files(本地計算機)中拖動一些文件到Destination computer’s files中,就會彈出如下提示

image

你需要創建一個Feature,什么是Feature我不太清楚,我把它理解成一個文件的集合。輸入名字,我輸入的是Main,點擊OK

image

(如果你看不到上圖中左邊紅框內的東西,就在那里的樹狀結構任意節點點擊右鍵,勾選Show Components就能看到了)

當你把你想打包的東西添加進入過后,一個最基本的包就打好了,已經可以編譯執行嘗試安裝了。

image

工具欄上的圖標編譯跟執行跟VC++6.0的圖標是一樣的吧,第三個紅圈就是卸載

 

當然只做到這一步是不能滿足我的需求的,我還需要添加一個數據庫文件夾,在Demo[INSTALLDIR]上點擊右鍵——選擇New Folder——命名為Database

進行圖中操作

image

直接點擊下一步,到第二步,按圖中操作

image

再下一步,將數據庫相關文件都添加進去,當然你可以先添加一個文件(夾)進去,其余的在“Files and Folders”中繼續添加。

至此,數據庫文件也添加到了安裝包內,不過默認的安裝流程中只有選擇主程序的安裝路徑沒有選擇數據庫的路徑,因此需要手動添加。

方法見2.3

 

2.3 Sequences

大家應該都安裝過軟件,最菜的人也知道一路點擊“下一步”來安裝程序。這部分就講一下如何定制安裝的順序,就是“上一步”與“下一步”的跳轉。

image

最左邊選擇Custom Actions and Sequences后,在中間的樹中如圖操作,User Interface上點擊右鍵——Insert…

image

點擊OK后Sequences樹中多了個DatabaseFolder,可以拖動他到想要的位置。

當然Sequences的編輯還沒那么簡單,貌似通過拖動無法實現,需要對每個窗體進行編輯。

image

如圖所示,圖中的意思就是在選擇DatabaseFolder的路徑的對話框中,點擊“上一步”按鈕會跳轉到CustomerInformation這個對話框中

就是這樣編輯,工作量也不小,或者是有其他什么簡便方法,可是我不知道

 

2.4 動態修改XML或者INI文件

在這個項目中,我需要將項目的安裝路徑寫在安裝目錄下的一個ini文件中,這個ini文件是需要打包在項目中的。

image

首先確保ini文件已經添加進入打包工程。

image

在INI File Changes中新建一個與欲改寫的ini文件同名的ini文件——my.ini

在my.ini文件下建立欲改寫的section(我的例子是installdir)以及keyword(例子中是dir),編輯keword

在Data Value中寫入系統變量[INSTALLDIR],這個就表示程序的安裝目錄。如果要獲取數據庫的安裝目錄就可以寫入[DATABASEDIR]

XML的修改跟這個類似,相信都可以融會貫通。

在我的實際項目中,遇到個問題。

my.ini是mysql要用到的東西,是放在數據庫目錄中的,安裝上面的方法略加修改就可以實現。

但是mysql需要的路徑類似于C:/MyDataBase/MySql/

而通過我上面方法[DATABASEDIR]獲得的路徑是Windows標準的 C:/MyDataBase/MySql/

因此我必須要把這個斜線給反過來,我不知道怎么反。只知道可能通過腳本來修改(如果有高人知道簡便方法,請指點)

腳本見2.5

 

2.5 InstallScript

 

剛剛接觸,我連在哪里寫腳本都不知道,跟別說如何寫腳本了,雖然我現在也不會寫腳本~~(求教?。?/span>

雖然還不會寫腳本,還是先把在哪里寫以及如何運行腳本寫出來,希望有跟我有同樣問題的朋友看到。

image

然后出現下圖

image

右邊是編輯區,用于寫腳本。有編程經驗的話這個不難理解

腳本的執行回到Custom Actions and Sequences,在中間的列表中的Custom Actions上點擊右鍵,選擇Custom Actions Wizard

在Action Type中選擇Run InstallScript code,在Insert into Sequence中的Install Execute Sequence處選擇何時執行,其余按向導提示操作。


#include "ifx.h"
  
    export prototype ProcessAfterDataMove(HWND);  
    export prototype STRING ReplaceStr(STRING);    
    export prototype RunBat(STRING);

function ProcessAfterDataMove(hMSI)  
   STRING P_Dir,DB_Dir; // P_Dir是主程序目錄下ini文件的路徑,DB_Dir是數據庫的路徑
begin            
   P_Dir = TARGETDIR "temp.ini"//TARGETDIR是系統變量,存放安裝路徑
   //GetProfString()函數是系統函數,用于讀取ini文件中的信息
   //第一個參數指定文件所在路徑
   //第二個參數指定section名
   //第三個參數指定keyword名
   //最后一個參數用于 返回 前面指定的keyword的值。注意:是返回!  
   GetProfString (P_Dir, "temp""dir", DB_Dir);
   //ReplaceProfString()函數是系統函數,用于修改ini文件中keyword的值
   //第一個參數指定文件所在路徑
   //第二個參數指定section名
   //第三個參數指定keyword名
   //第四個參數指定keyword原值
   //第五個參數指定keyword的新值
   //只有前面4個條件完全匹配時,原值才會被第五個參數中的新值替換                                                                                         
   ReplaceProfString (DB_Dir + "my.ini""mysqld""basedir""/"" + DB_Dir + "/"""/"" + ReplaceStr(DB_Dir) + "/"");
   ReplaceProfString (DB_Dir + "my.ini""mysqld", "datadir""/"" + DB_Dir + "Data/"", "/"" + ReplaceStr(DB_Dir + "Data") + "/"");
   //執行批處理
   RunBat(DB_Dir);
end;  
       
function STRING ReplaceStr(Str)
LIST StrList;
STRING temp,path;
begin
//創建List存放Tokens
   StrList = ListCreate(STRINGLIST);
//分解出Token存入List
   StrGetTokens( StrList, Str, "http://");
   //取出TokenList的頭節點
   ListGetFirstString(StrList, temp);
   //頭節點后加入 “/”
   path = temp + "/";
   //循環 取出所有的節點 后面加入“/”
   while(ListGetNextString(StrList, temp) = 0)
       path = path + temp + "/";
   endwhile;
return path;   
end;       
       
       
function RunBat(DB_Dir)     //執行批處理     
STRING dir;              
begin
dir = DB_Dir + "bin//exec.bat" ;
//調用其他程序
//第一個參數是調用程序的位置
//第二個參數是調用程序運行所需參數
//WAIT表示等到執行完畢這個程序,安裝再繼續進行
LaunchAppAndWait(dir, "",WAIT);
end;

posted @ 2012-11-07 14:54 盛勝 閱讀(350) | 評論 (0)編輯 收藏


創建文本插入符(MFC單文檔),在OnCreate(LPCREATESTRUCT lpCreateStruct)函數中創建
      //下面調用的gettextmetrics成員函數是在CClienDC類中的
CClientDC dc(this);
//TEXTMETRIC結構體包含設備描述表中當前字體的度量信息
TEXTMETRIC tm;
//Gettextmetrics成員函數可以得到設備描述表中當前字體的度量信息
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/1,tm.tmHeight);
ShowCaret();

要在OnCreate()函數的頭文件中添加
private:
CBitmap bitmap;

再在OnCreate()函數中添加
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();

posted @ 2012-11-06 11:05 盛勝 閱讀(497) | 評論 (0)編輯 收藏

MYSQL數據庫中有字段類型為bigint(20);
MFC中定義該字段類型時用__int64

posted @ 2012-11-01 15:21 盛勝 閱讀(129) | 評論 (0)編輯 收藏

vector是C++標準模板庫中的部分內容,它是一個多功能的,能夠操作多種數據結構和算法的模板類和函數庫。vector之所以被認為是一個容器,是因為它能夠像容器一樣存放各種類型的對象,簡單地說,vector是一個能夠存放任意類型的動態數組,能夠增加和壓縮數據。
為了可以使用vector,必須在你的頭文件中包含下面的代碼:
#include <vector>
vector屬于std命名域的,因此需要通過命名限定,如下完成你的代碼:
using std::vector;
vector<int> vInts;
 或者連在一起,使用全名:
std::vector<int> vInts;
 
   建議使用全局的命名域方式:usingnamespace std;     
函數 
表述   
c.assign(beg,end)
c.assign(n,elem) 將[beg; end)區間中的數據賦值給c。
將n個elem的拷貝賦值給c。   
c.at(idx) 傳回索引idx所指的數據,如果idx越界,拋出out_of_range。   
c.back() 傳回最后一個數據,不檢查這個數據是否存在。   
c.begin() 傳回迭代器中的第一個數據地址。   
c.capacity() 返回容器中數據個數。   
c.clear() 移除容器中所有數據。   
c.empty() 判斷容器是否為空。   
c.end() 指向迭代器中的最后一個數據地址。   
c.erase(pos)
c.erase(beg,end) 刪除pos位置的數據,傳回下一個數據的位置。
刪除[beg,end)區間的數據,傳回下一個數據的位置。   
c.front() 傳回第一個數據。   
get_allocator 使用構造函數返回一個拷貝。   
c.insert(pos,elem) 
c.insert(pos,n,elem)
c.insert(pos,beg,end) 在pos位置插入一個elem拷貝,傳回新數據位置。
在pos位置插入n個elem數據。無返回值。
在pos位置插入在[beg,end)區間的數據。無返回值。   
c.max_size() 返回容器中最大數據的數量。   
c.pop_back() 刪除最后一個數據。   
c.push_back(elem) 在尾部加入一個數據。   
c.rbegin() 傳回一個逆向隊列的第一個數據。   
c.rend() 傳回一個逆向隊列的最后一個數據的下一個位置。   
c.resize(num) 重新指定隊列的長度。   
c.reserve() 保留適當的容量。   
c.size() 返回容器中實際數據的個數。   
c1.swap(c2) 
swap(c1,c2) 將c1和c2元素互換。
同上操作。   
vector<Elem> c
vector<Elem> c1(c2)
vector <Elem> c(n)
vector <Elem> c(n, elem)
vector <Elem> c(beg,end)
c.~ vector <Elem>() 創建一個空的vector。
復制一個vector。
創建一個vector,含有n個數據,數據均已缺省構造產生。
創建一個含有n個elem拷貝的vector。
創建一個以[beg;end)區間的vector。
銷毀所有數據,釋放內存。   
  operator[] 返回容器中指定位置的一個引用。     
 

 
創建一個vector
vector容器提供了多種創建方法,下面介紹幾種常用的。
創建一個Widget類型的空的vector對象:
vector<Widget> vWidgets;

創建一個包含500個Widget類型數據的vector:
vector<Widget> vWidgets(500);

 創建一個包含500個Widget類型數據的vector,并且都初始化為0:
vector<Widget> vWidgets(500, Widget(0));

 創建一個Widget的拷貝:
vector<Widget> vWidgetsFromAnother(vWidgets);

 
向vector添加一個數據
vector添加數據的缺省方法是push_back()。push_back()函數表示將數據添加到vector的尾部,并按需要來分配內存。例如:向vector<Widget>中添加10個數據,需要如下編寫代碼:
for(int i= 0;i<10; i++)
    vWidgets.push_back(Widget(i));

獲取vector中制定位置的數據
vector里面的數據是動態分配的,使用push_back()的一系列分配空間常常決定于文件或一些數據源。如果想知道vector存放了多少數據,可以使用empty()。獲取vector的大小,可以使用size()。例如,如果想獲取一個vector v的大小,但不知道它是否為空,或者已經包含了數據,如果為空想設置為-1,你可以使用下面的代碼實現:
int nSize = v.empty() ? -1 : static_cast<int>(v.size());

 
訪問vector中的數據
使用兩種方法來訪問vector。
1、   vector::at()
2、   vector::operator[]
operator[]主要是為了與C語言進行兼容。它可以像C語言數組一樣操作。但at()是我們的首選,因為at()進行了邊界檢查,如果訪問超過了vector的范圍,將拋出一個例外。由于operator[]容易造成一些錯誤,所有我們很少用它,下面進行驗證一下:
分析下面的代碼:
vector<int> v;
v.reserve(10);
 
for(int i=0; i<7; i++)
    v.push_back(i);
 
try
{
 int iVal1 = v[7]; // not bounds checked - will not throw
 int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch(const exception& e)
{
 cout << e.what();
}

 
刪除vector中的數據
vector能夠非常容易地添加數據,也能很方便地取出數據,同樣vector提供了erase(),pop_back(),clear()來刪除數據,當刪除數據時,應該知道要刪除尾部的數據,或者是刪除所有數據,還是個別的數據。
Remove_if()算法 如果要使用remove_if(),需要在頭文件中包含如下代碼::
#include <algorithm>

     Remove_if()有三個參數:
1、   iterator _First:指向第一個數據的迭代指針。
2、   iterator _Last:指向最后一個數據的迭代指針。
3、   predicate _Pred:一個可以對迭代操作的條件函數。
條件函數 條件函數是一個按照用戶定義的條件返回是或否的結果,是最基本的函數指針,或是一個函數對象。這個函數對象需要支持所有的函數調用操作,重載operator()()操作。remove_if()是通過unary_function繼承下來的,允許傳遞數據作為條件。
例如,假如想從一個vector<CString>中刪除匹配的數據,如果字串中包含了一個值,從這個值開始,從這個值結束。首先應該建立一個數據結構來包含這些數據,類似代碼如下:
#include <functional>
enum findmodes 
{
 FM_INVALID = 0,
 FM_IS,
 FM_STARTSWITH,
 FM_ENDSWITH,
 FM_CONTAINS
};
typedefstruct tagFindStr
{
 UINT iMode;
 CString szMatchStr;
} FindStr;
typedef FindStr* LPFINDSTR;

 
然后處理條件判斷:
class FindMatchingString 
    : public std::unary_function<CString, bool> 
{
    
public: 
 FindMatchingString(const LPFINDSTR lpFS) : m_lpFS(lpFS) {} 
    
 bool operator()(CString& szStringToCompare) const
 { 
     bool retVal = false;
 
     switch(m_lpFS->iMode) 
     {
     case FM_IS: 
       { 
         retVal = (szStringToCompare == m_lpFDD->szMatchStr); 
         break;
       }
     case FM_STARTSWITH: 
       { 
         retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())
               == m_lpFDD->szWindowTitle);
         break;
       } 
     case FM_ENDSWITH: 
       {
         retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength()) 
               == m_lpFDD->szMatchStr);
         break; 
       } 
     case FM_CONTAINS: 
       {
         retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);
         break; 
       }
     }
        
     return retVal;
 }
        
private: 
    LPFINDSTR m_lpFS;
};

 
通過這個操作你可以從vector中有效地刪除數據:
FindStr fs;
fs.iMode = FM_CONTAINS;
fs.szMatchStr = szRemove;
 
vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());

    Remove(),remove_if()等所有的移出操作都是建立在一個迭代范圍上的,不能操作容器中的數據。所以在使用remove_if(),實際上操作的時容器里數據的上面的。
 
看到remove_if()實際上是根據條件對迭代地址進行了修改,在數據的后面存在一些殘余的數據,那些需要刪除的數據。剩下的數據的位置可能不是原來的數據,但他們是不知道的。
調用erase()來刪除那些殘余的數據。注意上面例子中通過erase()刪除remove_if()的結果和vs.enc()范圍的數據。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/willoj/archive/2008/04/05/2252543.aspx

posted @ 2012-10-31 10:19 盛勝 閱讀(247) | 評論 (0)編輯 收藏

CString cdatetime;
CTime theCurrentTime=CTime::GetCurrentTime(); 
cdatetime=theCurrentTime.Format("%Y/%m/%d %H:%M:%S"); 

posted @ 2012-10-30 16:20 盛勝 閱讀(160) | 評論 (0)編輯 收藏

僅列出標題
共14頁: First 4 5 6 7 8 9 10 11 12 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            噜噜噜躁狠狠躁狠狠精品视频| 洋洋av久久久久久久一区| 亚洲一区日韩| 日韩午夜高潮| 99国产精品久久久久老师| 亚洲三级国产| 免费观看日韩av| 美女被久久久| 欧美激情精品久久久久久黑人| 欧美激情一区二区三区全黄| 亚洲国产影院| 亚洲精品国产精品国产自| 亚洲区一区二区三区| 亚洲精华国产欧美| 一区二区三区鲁丝不卡| 亚洲自拍高清| 久久久噜噜噜| 欧美日本国产一区| 国产毛片精品国产一区二区三区| 国产精品自拍在线| 在线国产亚洲欧美| 亚洲网站在线| 久久国产免费看| 欧美搞黄网站| 亚洲午夜91| 久久精品女人的天堂av| 欧美成人激情在线| 国产精品午夜在线观看| 1000部国产精品成人观看| 亚洲免费不卡| 久久久一区二区| 亚洲国产毛片完整版 | 欧美成人综合| av不卡在线看| 久久蜜桃精品| 国产精品久久久亚洲一区| 激情小说另类小说亚洲欧美| 一区二区三区www| 麻豆精品在线观看| 亚洲一区精彩视频| 欧美精品国产精品| 国内精品久久久久久久果冻传媒| 亚洲精品国产精品久久清纯直播| 亚洲欧美日韩视频二区| 亚洲第一区在线| 欧美亚洲一级片| 欧美日韩三区四区| 在线视频国产日韩| 久久网站免费| 先锋影音国产一区| 国产精品黄色| 亚洲视频一区二区| 亚洲人成网站999久久久综合| 欧美一区二区三区在线观看| 欧美视频免费| 夜夜爽av福利精品导航| 欧美成人久久| 久久天堂av综合合色| 韩日精品中文字幕| 久久精品视频亚洲| 亚洲免费影视第一页| 欧美三级视频在线观看| 亚洲美女黄网| 亚洲日本免费| 欧美精品久久99久久在免费线| 亚洲国产精品精华液2区45| 免费成人黄色av| 久久噜噜噜精品国产亚洲综合| 国模精品一区二区三区色天香| 久久成人精品| 欧美在线免费看| 狠狠久久亚洲欧美专区| 久久一区二区三区四区| 久久久久久网站| 亚洲国产一区二区三区a毛片| 欧美大片免费看| 欧美黄色视屏| 正在播放亚洲一区| 亚洲每日在线| 国产精品国产精品| 久久精品女人| 玖玖综合伊人| 日韩一二三在线视频播| 日韩视频免费观看高清完整版| 亚洲一区二区精品视频| 国产精品一区二区三区久久 | 亚洲影视在线播放| 亚洲精品黄色| 国产精品久久福利| 久久精彩视频| 久久最新视频| 亚洲美女黄网| 午夜久久黄色| 亚洲啪啪91| 亚洲免费影视| 亚洲成在线观看| 亚洲美女免费精品视频在线观看| 国产精品扒开腿做爽爽爽软件| 久久国产精品亚洲77777| 欧美福利精品| 欧美一级免费视频| 久久在线91| 欧美一区二区三区成人| 老司机精品导航| 亚洲女人天堂av| 久久亚洲国产精品一区二区| 一区二区三区日韩欧美| 久久狠狠婷婷| 亚洲午夜久久久久久久久电影网| 欧美在线免费观看视频| 亚洲图片你懂的| 久久免费国产精品| 亚洲欧美综合| 欧美日韩成人在线| 久久综合伊人77777麻豆| 欧美日韩一区二区三区在线观看免| 先锋a资源在线看亚洲| 欧美激情第三页| 美脚丝袜一区二区三区在线观看 | 亚洲欧美清纯在线制服| 日韩视频在线免费| 久久激情视频| 欧美一区二区三区精品| 欧美日韩一区视频| 亚洲国语精品自产拍在线观看| 国产欧美一区二区色老头| 女女同性精品视频| 国产一区二区日韩精品欧美精品| 亚洲伦理中文字幕| 亚洲美女精品久久| 蜜桃久久av一区| 麻豆亚洲精品| 激情综合网址| 久久av一区二区三区漫画| 亚洲综合欧美日韩| 欧美日韩免费一区| 亚洲人成在线观看网站高清| 亚洲三级毛片| 欧美日本精品| av成人动漫| 欧美一区二区三区播放老司机| 国产精品欧美日韩一区| 亚洲自拍偷拍一区| 久久精品二区三区| 国内精品亚洲| 麻豆精品网站| 99精品视频免费| 久久人人爽国产| 亚洲第一精品福利| 麻豆国产精品va在线观看不卡| 快射av在线播放一区| 在线看成人片| 欧美日韩不卡| 欧美一区二区三区在线播放| 久久婷婷影院| 亚洲精品美女在线观看| 欧美日韩午夜精品| 小处雏高清一区二区三区| 久久全国免费视频| 亚洲激情视频网| 欧美日韩国产区| 亚洲欧美99| 模特精品在线| 正在播放欧美视频| 欧美三日本三级三级在线播放| 在线亚洲美日韩| 午夜欧美大尺度福利影院在线看| 国产伪娘ts一区| 欧美mv日韩mv国产网站| 亚洲精品一二| 欧美精品一区二区高清在线观看| 亚洲淫片在线视频| 性欧美超级视频| 国产亚洲一区在线播放| 这里只有精品在线播放| 亚洲欧美色一区| 国产日韩一区二区| 久久精品一区二区三区不卡| 亚洲精品黄色| 午夜精彩国产免费不卡不顿大片| 国产精品一区二区你懂得| 久久精品亚洲国产奇米99| 亚洲精品一区二| 翔田千里一区二区| 在线观看欧美一区| 欧美日韩a区| 久久久免费观看视频| 亚洲黄色免费电影| 午夜激情综合网| 国产精品久久久久aaaa樱花| 美女福利精品视频| 亚洲午夜久久久久久尤物 | 久久国产毛片| 一本色道久久综合亚洲精品按摩 | 亚洲高清123| 国产一区二区高清不卡| 欧美福利电影网| 久久福利资源站| 久久视频在线看| 欧美一级视频精品观看|