File類提供了對文件進行打開,關閉,讀,寫,刪除,重命名以及獲取文件信息等文件操作的基本功能,足以處理任意類型的文件操作。
??一個讀寫文件的例子:
??文件I/O
??雖然使用CArchive類內建的序列化功能是保存和加載持久性數據的便捷方式,但有時在程序中需要對文件處理過程擁有更多的控制權,對于這種文件輸入輸出(I/O)服務的需求,Windows提供了一系列相關的API函數,并由MFC將其封裝為CFile類,提供了對文件進行打開,關閉,讀,寫,刪除,重命名以及獲取文件信息等文件操作的基本功能,足以處理任意類型的文件操作。CFile類是MFC文件類的基類,支持無緩沖的二進制輸入輸出,也可以通過與CArchive類的配合使用而支持對MFC對象的帶緩沖的序列化。
??CFile類包含有一個公有型數據成員m_hFile,該數據成員包含了同CFile類對象相關聯的文件句柄。如果沒有指定句柄,則該值為CFile::hFileNull。由于該數據成員所包含的意義取決于派生的類,因此一般并不建議使用m_hFile。
??通過CFile類來打開文件可以采取兩種方式:一種方式是先構造一個CFile類對象然后再調用成員函數Open()打開文件,另一種方式則直接使用CFile類的構造函數去打開一個文件。下面的語句分別演示了用這兩種方法打開磁盤文件“C:/TestFile.txt”的過程:
C++代碼
// 先構造一個實例,然后再打開文件
CFile file;
file.Open(“C://TestFile.txt”, CFile::modeReadWrite);
……
// 直接通過構造函數打開文件
CFile file(“C://TestFile.txt”, CFile::modeReadWrite);
??其中參數CFile::modeReadWrite是打開文件的模式標志,CFile類中與之類似的標志還有十幾個,現集中列表如下:
??文件模式標志 說明
??CFile::modeCreate 創建方式打開文件,如文件已存在則將其長度設置為0
??CFile::modeNoInherit 不允許繼承
??CFile::modeNoTruncate 創建文件時如文件已存在不對其進行截斷
??CFile::modeRead 只讀方式打開文件
??CFile::modeReadWrite 讀寫方式打開文件
??CFile::modeWrite 寫入方式打開文件
??CFile::shareCompat 在使用過程中允許其他進程同時打開文件
??CFile::shareDenyNone 在使用過程中允許其他進程對文件進行讀寫
??CFile::shareDenyRead 在使用過程中不允許其他進程對文件進行讀取
??CFile::shareDenyWrite 在使用過程中不允許其他進程對文件進行寫入
??CFile::shareExclusive 取消對其他進程的所有訪問
??CFile::typeBinary 設置文件為二進制模式
??CFile::typeText 設置文件為文本模式
??這些標志可以通過“或”運算符而同時使用多個,并以此來滿足多種需求。例如,需要以讀寫方式打開文件,如果文件不存在就創建一個新的,如果文件已經存在則不將其文件長度截斷為0。為滿足此條件,可用CFile::modeCreate、CFile::modeReadWrite和CFile::modeNoTruncate等幾種文件模式標志來打開文件:
C++代碼
CFile file ("C://TestFile.txt", CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate);
??在打開的文件不再使用時需要將其關閉,即可以用成員函數Close()關閉也可以通過CFile類的析構函數來完成。當采取后一種方式時,如果文件還沒有被關閉,析構函數將負責隱式調用Close()函數去關閉文件,這也表明創建在堆上的CFile類對象在超出范圍后將自動被關閉。由于調用了對象的析構函數,因此在文件被關閉的同時CFile對象也被銷毀,而采取Close()方式關閉文件后,CFile對象仍然存在。所以,在顯式調用Close()函數關閉一個文件后可以繼續用同一個CFile對象去打開其他的文件。
??文件讀寫是最常用的文件操作方式,主要由CFile類成員函數Read()、Write()來實現。其函數原型分別為:
C++代碼
UINT Read( void* lpBuf, UINT nCount );
void Write( const void* lpBuf, UINT nCount );
??參數lpBuf為指向存放數據的緩存的指針,nCount為要讀入或寫入的字節數,Read()返回的為實際讀取的字節數,該數值小于或等于nCount,如果小于nCount則說明已經讀到文件末尾,可以結束文件讀取,如繼續讀取,將返回0。因此通常可以將實際讀取字節數是否小于指定讀取的字節數或是否為0作為判斷文件讀取是否到達結尾的依據。下面這段代碼演示了對文件進行一次性寫入和循環多次讀取的處理過程:
C++代碼
// 創建、寫入方式打開文件
CFile file;
file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate);
// 寫入文件
memset(WriteBuf, 'a', sizeof(WriteBuf));
file.Write(WriteBuf, sizeof(WriteBuf));
// 關閉文件
file.Close();
// 只讀方式打開文件
file.Open("C://TestFile.txt", CFile::modeRead);
while (true)
{
// 讀取文件數據
int ret = file.Read(ReadBuf, 100);
……
// 如果到達文件結尾則中止循環
if (ret < 100)
break;
}
// 關閉文件
file.Close();
??Write()和Read()函數執行完后將自動移動文件指針,因此不必再顯示調用Seek()函數去定位文件指針。包含有文件定位函數的完整代碼如下所示:
C++代碼
// 創建、寫入方式打開文件
CFile file;
file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate);
// 寫入文件
memset(WriteBuf, 'a', sizeof(WriteBuf));
file.SeekToBegin();
file.Write(WriteBuf, sizeof(WriteBuf));
// 關閉文件
file.Close();
// 只讀方式打開文件
file.Open("C://TestFile.txt", CFile::modeRead);
while (true)
{
// 文件指針
static int position = 0;
// 移動文件指針
file.Seek(position, CFile::begin);
// 讀取文件數據
int ret = file.Read(ReadBuf, 100);
position += ret;
……
// 如果到達文件結尾則中止循環
if (ret < 100)
break;
}
// 關閉文件
file.Close();
補充:
??使用CFile類對文件進行按結構讀取,如:
C++代碼
CFile fileRead,fileWrite;
fileRead.Open(_T("E://a.dat"),CFile::modeRead);//這里使用宏_T
fileWrite.Open(_T("E://backup.txt"),CFile::modeCreate | CFile::modeWrite);
VIDEOHEADER *videoheader=new VIDEOHEADER();
fileRead.Read(videoheader,sizeof(VIDEOHEADER));
char buf[sizeof(VIDEOHEADER)*8];
sprintf(buf,"videoheader.cCommandID:%s ,videoheader->cCommandID); //通過sprintf對我們需要寫入文件中的數據進行格式化,這樣在文件中存儲的數據就是以這里定義的格式顯示的。
fileWrite.Write(buf,strlen(buf));
MFC擴展類庫
在平時練習的時候我們可以自己手動進行,但是一旦接受一些項目,應用程序開發等,對界面的要求就會高出許多。這時候就有必要借助這些“半成品”實現界面美化提升效率。這里簡單介紹一下,具體可點進去查看每個的詳情以及教程,案例!
Toolkit Pro:
Codejock軟件公司的Xtreme Toolkit Pro是屢獲殊榮的VC界面庫,是MFC開發中最全面界面控件套包,它提供了Windows開發所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
BCGControlBar
BCGControlBar ("Business Components Gallery ControlBar")是MFC擴展庫,使您可以創建具有完全自定義選項(功能區、可自定義工具欄、菜單等)以及一組專業設計的豐富Microsoft Office和Microsoft Visual Studio的應用程序 GUI控件,例如圖表、日歷、網格、編輯器、甘特圖和許多其他控件。
BCGControlBar庫擁有500多個經過全面設計、測試和充分記錄的MFC擴展類。可以輕松地集成到你的應用程序中,并為你節省數百個開發和調試時間。
QtitanRibbon:
QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技術的Ribbon UI組件,QtitanRibbon致力于為Windows、Linux和Mac OS X提供功能完整的Ribbon組件。
本文轉載自:http://www.jizhuomi.com/software/500.html
今天的內容就是這些了,點擊下方“了解更多”獲取限時免費教程、體驗資格!
isual c++ 提 供 了 功 能 強 大 的 類 庫, 基 本 上 應 用 開 發 的 要 求, 但 對 于 某 些 特 殊 要 求 的 界 面, 如 圖 像 兼 文 字 的 按 紐, 列 表 框 中 插 入 圖 像, 中 國 式 報 表 等 等, 仍 顯 得 力 不 從 心, 因 而 很 有 必 要 創 建 擴 展MFC 類 庫, 以 滿 足 實 際 開 發 的 需 求。But,Toolkit Pro 是MFC開發中最全面界面控件套包,它提供了Windows開發所需要的11種主流的Visual C++ MFC控件。 根據需要可進行下載體驗!
本文通過實例說明MFC工具欄的創建、設計和使用方法,包括三個demo。
demo1:創建一個工具欄
C++代碼
//摘抄自MSDN
demo1 (創建一個工具欄)
1.Create a toolbar resource.
/*可以先插入一個新的工具欄資源
添加分隔符,將按鈕向右拖動一小下
刪除按鈕,將按鈕拖動出工具欄
*/
2.Construct the CToolBar object.
/*
工具欄是 CToolBar 對象,聲明為應用程序的 CMainFrame 類的數據成員。也就是說,工具欄對象嵌入到主框架窗口對象中。這意味著 MFC 在創建框架窗口時創建工具欄,在銷毀框架窗口時銷毀工具欄。
*/
3.Call the Create (or CreateEx) function to create
the Windows toolbar and attach it to the CToolBar object.
4.Call LoadToolBar to load the toolbar resource.
/*
工具欄創建發生在 CMainFrame::OnCreate 中。MFC 在創建框架窗口之后且在窗口可見之前調用 OnCreate。
在 OnCreate 中調用適當的函數來停靠或浮動工具欄、設置它的樣式等。
應用程序向導”生成的默認 OnCreate 執行以下工具欄任務:
1.調用 CToolBar 對象的 Create 成員函數來創建基礎 CToolBarCtrl 對象。
2.調用 LoadToolBar 來加載工具欄資源信息。
3.調用函數來啟用停靠、浮動和工具提示。
*/
class CMainFrame : public CMDIFrameWnd
{
// ...
// Implementation
// ...
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
// Generated message map functions
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//框架類中m_wndMyToolBar成員變量先調用CreateEx函數,再調用LoadToolBar函數
if (! m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
! m_wndToolBar.LoadToolBar(IDR_MYTOOLBAR))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
//調用CToolBar中的成員函數設置工具欄可停靠的位置
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//調用框架類中的成員函數設置哪里可以被停靠
EnableDocking(CBRS_ALIGN_ANY);
//Points to the control bar to be docked.
DockControlBar(&m_wndToolBar);
return 0;
}
demo2:停靠和浮動工具欄
C++代碼
demo2 (停靠和浮動工具欄)
/*
如果使用“應用程序向導”來生成應用程序的主干,向導將要求您選擇是否想要可停靠的工具欄。
默認情況下,“應用程序向導”生成代碼來執行將可停靠工具欄放置在應用程序中所需的三個操作:
1.在框架窗口中啟用停靠。
2.為工具欄啟用停靠。
3.停靠工具欄(靠向框架窗口)。
如果這些步驟中的任何一個缺少,應用程序都將顯示標準工具欄。
后兩個步驟對應用程序中的每一個可停靠工具欄都必須執行。
*/
CFrameWnd::EnableDocking()//在框架窗口中啟用停靠
/*
若要將工具欄停靠到某個框架窗口,則必須啟用該框架窗口(或目標)以允許停靠。
這可通過使用 CFrameWnd::EnableDocking 函數來實現,該函數采用一個 DWORD 參數,這是一組指示框架窗口的哪一個邊接受停靠的樣式位。
如果一個工具欄即將停靠并且有多個邊可以停靠,則在傳遞給 EnableDocking 的參數中指示的邊按以下順序使用:頂邊、底邊、左邊、右邊。
如果希望能夠將控制條停靠在任意位置,請將 CBRS_ALIGN_ANY 傳遞給 EnableDocking。
*/
CControlBar::EnableDocking()//為工具欄啟用停靠
/*
準備好停靠目標后,必須以相似的方式準備工具欄(或源)。為想要停靠的每一個工具欄調用 CControlBar::EnableDocking,指定工具欄應停靠的目標邊。如果在 CControlBar::EnableDocking 調用中所指定的邊沒有一個與框架窗口中為停靠啟用的邊匹配,則工具欄無法停靠(它將浮動)。
工具欄一旦浮動,將保持為浮動工具欄,不能停靠到框架窗口。
如果希望工具欄永久浮動,請調用參數為 0 的 EnableDocking。然后調用 CFrameWnd::FloatControlBar。工具欄將保持浮動,永遠不能在任意位置停靠。
*/
CFrameWnd::DockControlBar()//停靠工具欄
/*
當用戶試圖將工具欄放置在允許停靠的框架窗口某一邊時,框架調用 CFrameWnd::DockControlBar。
另外,可以隨時調用該函數將控制條停靠在框架窗口中。這通常在初始化過程中完成。
框架窗口的具體某個邊上可停靠多個工具欄。
*/
CFrameWnd::FloatControlBar()//浮動工具欄
/*
從框架窗口分離可停靠工具欄稱為浮動工具欄。調用 CFrameWnd::FloatControlBar 來執行該操作。指定要浮動的工具欄、將放置的點以及決定浮動工具欄是水平還是垂直的對齊樣式。
當用戶拖動工具欄離開停靠位置并將它放置在一個未啟用停靠的位置時,框架調用該函數。
這可以是框架窗口的內部或外部的任意位置。同 DockControlBar 一樣,也可以在初始化過程中調用該函數。
可停靠工具欄的 MFC 實現不提供一些支持可停靠工具欄的應用程序中有的擴展功能。諸如可自定義工具欄這樣的功能不提供。
*/
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//...
//部分代碼略
//...
//調用CToolBar中的成員函數設置工具欄可停靠的位置
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//調用框架類中的成員函數設置哪里可以被停靠
EnableDocking(CBRS_ALIGN_ANY);
//Points to the control bar to be docked.
DockControlBar(&m_wndToolBar);
return 0;
}
demo3:點擊菜單項顯示和隱藏工具欄
C++代碼
demo3 (點擊菜單項顯示和隱藏工具欄)
CFrameWnd::ShowControlBar//顯示和隱藏菜單項
void ShowControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );
void CMainFrame::OnViewNewtool()
{
ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);//控制顯示和隱藏
}
void CMainFrame::OnUpdateViewNewtool(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());//為菜單項打標記
}
MFC擴展類庫
在平時練習的時候我們可以自己手動進行,但是一旦接受一些項目,應用程序開發等,對界面的要求就會高出許多。這時候就有必要借助這些“半成品”實現界面美化提升效率。這里簡單介紹一下,具體可點進去查看每個的詳情以及教程,案例!
Toolkit Pro:
Codejock軟件公司的Xtreme Toolkit Pro是屢獲殊榮的VC界面庫,是MFC開發中最全面界面控件套包,它提供了Windows開發所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
BCGControlBar ("Business Components Gallery ControlBar")是MFC擴展庫,使您可以創建具有完全自定義選項(功能區、可自定義工具欄、菜單等)以及一組專業設計的豐富Microsoft Office和Microsoft Visual Studio的應用程序 GUI控件,例如圖表、日歷、網格、編輯器、甘特圖和許多其他控件。
BCGControlBar庫擁有500多個經過全面設計、測試和充分記錄的MFC擴展類。可以輕松地集成到你的應用程序中,并為你節省數百個開發和調試時間。
轉載自:http://www.jizhuomi.com/software/494.html
關注我或者點擊下方“了解更多”獲取一手開發資訊哦!
ibbon是類似于office2007樣 式的界面,它替代了傳統的MFC程序里的菜單和工具欄MFC默認生成的Ribbon功能少,需要我們自己添加一些控件和圖片等元素使界面好看。看下面的一個界面,是示例里的
??看到它與默認Ribbon樣式的區別:
??工具自己設計,MFC提供的Ribbon控件基本都用上了;圖片(位圖)也是原資源沒有的
??那到底怎么實現呢?
??可以注意到的是:類別由面板組成,面板由按鈕或文本編輯框或進度條等控件組成
??按鈕都是有圖片和文字組成,按鈕通過按鈕集合可以產生類似于下拉菜單的作用
??觀察這些按鈕,可以發現有兩類:小圖標的按鈕和大圖標的按鈕
??小圖標:像素16×16,32位
??大圖標:像素32×32,32位
??關鍵問題是如何制作這些BitMap以及如何將他們加載到Ribbon界面中。
有兩個方法:一是自己動手制作,二是利用現成的組件ToolKit Pro,BCGControlBar,QitanRibbon后文會有詳細介紹!
?一、 制作工具欄BitMap
??在網上找了IconWorkshop這個軟件,很好用,可以制作icon圖標,也可以用多個icon圖標制作位圖BitMap。這正是我想要的功能
??自己不會美工,所以在網上找了些素材,做了以下一個工具欄樣的32×32像素32位的BitMap
??看到木有,跟程序默認生成的幾個位圖很像啊,內牛滿面啊
??將這個位圖加載到資源中,ID改為IDB_BIG
?? 修改Ribbon內的按鈕圖標
??首先,修改類別屬性,Large Images和Small Images,Large Images就是大圖標,Small Images是小圖標。在Large Images中的下拉菜單中選擇IDB_BIG
??然后修改面板中的按鈕屬性,在Large Images屬性選項中選擇一個合適的圖標即可
??小圖標也是一樣的道理,修改各自Small Images屬性即可
?實現下拉菜單
??按鈕屬性中有個行為的屬性,在里面添加相應的菜單(或間隔符)即完成了類似下拉菜單
??還有一些快捷方式的按鍵(兩個向下的箭頭、最左上角的圖標按鈕)也可以設置它們的功能項
??我做出來的界面如下所示
?? 將按鈕ID和菜單上的ID匹配
??Ribbon中的菜單ID是不能自己設置的,必須綁定在某個菜單上,對菜單的事件響應就是對響應的Ribbon上按鈕的響應,所以按了Ribbon界面上的某個按鈕就等同于按鈕對應的某個菜單
??所以必須將菜單欄也制作完整,給其添加事件消息,將Ribbon中按鈕的ID改為對應菜單的ID。菜單不在界面中顯示出來不代表它就沒用,沒它還不行,不知道以后能不能擺脫菜單直接在Ribbon按鈕上添加事件。
?? 修改最小化工具欄上的圖標
??上圖雖然修改了左上角的按鈕圖標,但是電腦工具欄上還是現實的MFC圖標,使用下面代碼進行修改
C++代碼
二、利用組件
在平時練習的時候我們可以自己手動進行,但是一旦接受一些項目,應用程序開發等,對界面的要求就會高出許多。這時候就有必要借助這些“半成品”實現界面美化提升效率。這里簡單介紹一下,具體可點進去查看每個的詳情以及教程,案例!
Toolkit Pro:
Codejock軟件公司的Xtreme Toolkit Pro是屢獲殊榮的VC界面庫,是MFC開發中最全面界面控件套包,它提供了Windows開發所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
BCGControlBar
BCGControlBar ("Business Components Gallery ControlBar")是MFC擴展庫,使您可以創建具有完全自定義選項(功能區、可自定義工具欄、菜單等)以及一組專業設計的豐富Microsoft Office和Microsoft Visual Studio的應用程序 GUI控件,例如圖表、日歷、網格、編輯器、甘特圖和許多其他控件。
BCGControlBar庫擁有500多個經過全面設計、測試和充分記錄的MFC擴展類。可以輕松地集成到你的應用程序中,并為你節省數百個開發和調試時間。
QtitanRibbon:
QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技術的Ribbon UI組件,QtitanRibbon致力于為Windows、Linux和Mac OS X提供功能完整的Ribbon組件。
本文轉載自:http://www.jizhuomi.com/software/500.html
今天的內容就是這些了,點擊下方“了解更多”獲取限時免費體驗資格!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。