本文章是由機器翻譯。
Visual C++
探索新的 C + + 和 MFC 功能在 Visual Studio 2010
Sumit Kumar
Visual Studio 2010 呈現為 C + + 開發人員非常大的好處。從能夠實行新功能所提供的 Windows 7 增強的產能功能使用大型的程式碼基底的沒有東西新增和改善幾乎每個 C + + 開發人員。
本文章中,我會解釋如何 Microsoft 已解決的一些廣泛 C + + 開發人員所面臨的問題。具體來說, Visual Studio 2010 可以更現代的程式設計模型讓藉由新增核心語言功能從即將推出的 C + + 0 x 標準,和由 overhauling 標準程式庫,以利用新的語言功能。有新的平行程式設計程式庫和工具,可簡化平行程式建立。您也尋找增強整體效能和開發人員生產力感謝來 IntelliSense 及縮放大型的程式碼基底的程式碼瞭解功能。然後跨 design 時間而獲益改善效能的程式庫和其他功能、 建立時間、 編譯及連結所需時間。
Visual Studio 2010 會建置系統遷移到 MSBuild,使其更可自訂並支援原生多重目標。並在 MFC 程式庫中的增強功能駕馭新 Windows 7 API,讓您撰寫好 Windows 7 應用程式的力量。
let’s 看更接近一下這些 C + + 致力發展在 Visual Studio 2010。
C + + 0x 核心語言功能
下一個 C + + 標準要被最終處理而使其更靠近 inching。為了協助您著手進行 [C + + Visual C++ 編譯器在 Visual Studio 2010 0 x 延伸可讓六個 C + + 0x 核心語言功能:Lambda 運算式、 自動關鍵字、 右值參考、 static_assert、 nullptr 和 decltype。
Lambda 運算式隱含定義,並建構未命名的函式物件。lambdas 提供輕量級自然的語法,來定義函式物件,它們用,而不會在效能負荷。
函式物件是非常強大的方式來自訂標準樣版程式庫 (STL) 演算法行為,以及可以封裝程式碼和資料 (不像一般的函式)。但函式物件不方便,因為需要撰寫整個類別的定義。此外,它們未定義在您的來源程式碼位置嘗試使用它們,而非-區域性它們更難使用中的該位置。程式庫有嘗試緩和的一些問題的詳細等級和非區域性,但 don’t 提供很多的協助,因為語法會變得複雜,而且編譯器錯誤不是非常好記。使用來自程式庫函式物件也是效率較低以來定義如資料成員是不在-對齊的函式物件。
Lambda 運算式解決這些問題。下列程式碼片段顯示 Lambda 運算式,在程式中用來移除變數之間的整數 x 和 y 從整數的向量。
v.erase(remove_if(v.begin(),
v.end(), [x, y](int n) {
return x < n && n < y; }),
v.end());
第二行顯示 Lambda 運算式。 呼叫 Lambda-introducer 的方括弧表示 Lambda 運算式的定義。 這個 Lambda 採用做為參數的整數 n 並 Lambda 產生函式物件具有資料成員 x 和 y。 比較可取得的便利性和節省時間 lambdas 展現感謝相等手寫函式物件提供:
class LambdaFunctor {
public:
LambdaFunctor(int a, int b) : m_a(a), m_b(b) { }
bool operator()(int n) const {
return m_a < n && n < m_b; }
private:
int m_a;
int m_b;
};
v.erase(remove_if(v.begin(), v.end(),
LambdaFunctor(x, y)), v.end());
自動關鍵字有永遠位於 C + +,但已很少使用因為它提供額外的值。 C + + 0x repurposes 自動判斷從其初始設定式變數的型別 this 關鍵字。 自動降低詳細等級,並幫助很重要的程式碼,以突顯出來。 它可以避免型別不符及截斷錯誤。 它也可以讓程式碼更泛用藉由允許的範本,來寫入處理好小於需像 lambdas 未記載的型別之類型的中繼運算式和有效地處理。 這個程式碼將示範如何自動儲存您從鍵入範本類型中的來迴圈逐一向量:
vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
// code
}
右值參考的新參考型別所引入 C + + 0x,可協助解決不需要複製的問題,並啟用完美轉送。 當工作分派的右手邊的右值然後左手邊物件可以竊取資源從右手邊物件而非執行不同的配置,因此啟用移動語意。
完美轉送可讓您撰寫單一的函式樣板,以取得 n 的任意引數,並將它們無障礙地轉送到另一個任意的函式。 引數 (可修改、 const,左值或右值) 的本質會保留在這個轉寄程序。
template <typename T1, typename T2> void functionA(T1&& t1, T2&& t2) {
functionB(std::forward<T1>(t1), std::forward<T2>(t2));
}
右值參考的詳細的說明超出本文的範圍,所以檢查 MSDN 文件在 msdn.microsoft.com/library/dd293668(VS.100) 如需詳細資訊。
在編譯階段 (而非在執行階段,Static_assert 可讓測試的判斷提示。 它可讓您觸發皆可輕鬆地讀取的自訂錯誤訊息的編譯器錯誤。 Static_assert 就特別有用的驗證範本參數。 比方說編譯下列程式碼會提供錯誤 「 錯誤 C2338:自訂判斷提示:n 應該小於 5 」:
template <int n> struct StructA {
static_assert(n < 5, "custom assert: n should be less than 5");
};
int _tmain(int argc, _TCHAR* argv[]) {
StructA<4> s1;
StructA<6> s2;
return 0;
}
Nullptr 新增 null 指標型別安全,並與右值參考密切相關。巨集 (定義為 0) 的 NULL,常值 0 通常用來作為 Null 指標。到目前為止,尚未有問題,但它們 don’t 非常好運作在 C + + 0x 限於完美轉送中潛在的問題。因此 nullptr 關鍵字已被引進了,特別是要避免在完美轉送函式的神秘失敗。
Nullptr 是常數也就是可以轉換成任何指標型別的型別 nullptr_t 但不是允許與其他型別,例如 int 或 char。除了在完美轉送函式中未使用,nullptr 可以用巨集 NULL 作為 null 指標的任何地方。
A 的警告,不過請注意:NULL 編譯器仍然支援,而不還取代了 nullptr。這主要是為了避免破壞現有的程式碼,因為以 NULL 的作用廣泛,通常不適合使用。但在未來應該使用各處使用 NULL nullptr 而且 NULL 應視為一項功能是用來支援回溯相容性。
最後,decltype 可讓編譯器推斷根據任意運算式的函式的傳回型別,並使完美轉送更泛用。在過去的兩個任意類型 T1 和 T2 的版本時發生不能推論出使用這兩種類型的運算式的型別。decltype 功能可讓您為狀態,例如有樣板引數如加總的運算式 < T1,T2>() 具有類型 T1 + T2。
標準程式庫的改進
若要利用新的 C 重新撰寫標準 C + + 程式庫的實質部份 + + 0x 語言功能和增加效能。在另外許多新演算法有被引進了。
標準程式庫會完整利用右值參考,以改善效能。型別,例如向量和清單現在有移動的建構函式,並移動它們自己的工作分派運算子。向量 reallocations 利用移動語意挑出移動建構函式因此如果您的型別有移動建構函式,並移動工作分派運算子文件庫挑選的自動。
您現在可以建立共用的指標,物件在同一時間您建構物件的新 C 協助 + + 0x 函式樣板 make_shared <t>:
auto sp =
make_shared<map<string,vector>>
(args);
在 Visual Studio 2008 中,您就必須寫入下列項目來取得相同的功能:
shared_ptr<map<string,vector>>
sp(new map<string,vector>(args));
使用 make_shared <t>是更方便 (需要輸入型別名稱較少的時間,) 更健全的 (它避免傳統的未命名的 shared_ptr 遺漏因為指標,該物件會被建立同時),且更有效率 (它會執行一動態記憶體配置,而不是兩個)。
這個程式庫現在包含新的、 更安全的智慧型指標型別 unique_ptr (其已重新啟用右值參考)。 如此一來取代 auto_ptr ; unique_ptr 可以藉由可移動,但不是 copyable 避免 auto_ptr 陷阱。 它可讓您實作嚴格的擁有權語意,而不會影響到安全。 它也可與都瞭解的右值參考的 Visual C++ 2010年容器。
容器現在有新的成員函式 — cbegin 和 cend —,提供一個 const_iterator 用於不論容器類型的檢查的方法:
vector<int> v;
for (auto i = v.cbegin(); i != v.cend(); ++i) {
// i is vector<int>::const_iterator
}
Visual Studio 2010 新增大部分的演算法提議中各種 C + + 標準程式庫的 0 x 論文。子集 Dinkumware 轉換文件庫已提供標準程式庫中,現在您可以執行轉換像 UTF-8 為 UTF-16 輕鬆。標準程式庫可讓透過 exception_ptr 例外狀況傳用。許多更新做了標頭中 <random>。沒有名為此版本中的 forward_list 單獨連結的清單。媒體櫃有 <system_error> 改善診斷的標頭。此外的許多存在於先前的版本 (例如 shared_ptr 及 regex) 中的命名空間 std::tr1 TR1 功能現在是標準的程式庫下 std 命名空間的一部分。
並行程式設計的改良
Visual Studio 2010 介紹平平行運算台,它可以幫助您快速地撰寫高效能平行程式碼,避免微妙的並行處理問題。這可讓您 dodge 的一些典型並行的相關的問題。
平行運算平台有四個主要部分:並行執行階段 (ConcRT)、 平行圖樣程式庫 (PPL)、 非同步的代理程式庫和平行偵錯和分析。
ConcRT 是最低的軟體圖層,OS 交談並 arbitrates 競爭資源的多個並行元件之間。因為它是使用者模式處理序,它可以使用其合作封鎖機制時回收的資源。ConcRT 知道區域性的存在,而且可以避免切換不同處理器之間的任務。因此它可以提升效能,甚至不使用合作封鎖 mechanism 時,它也採用了 Windows 7 使用者模式排程 (UMS)。
PPL 所提供平行程式碼撰寫的模式。如果計算可以分解為可以表示的函式或函式物件 sub-computations,每個這些 sub-computations 可以用來表示由工作。工作概念是更接近問題領域的與可讓您離問題領域藉等等考慮硬體 OS 重要區段的執行緒不同。工作可以與其他任務與無關的其他工作正在進行同時執行。比方說排序不同兩半的一個 array 可透過兩個不同的任務同時。
PPL 包括平行類別 (task_handle、 task_group 和 structured_task_group) 平行演算法 (parallel_invoke、 parallel_for 和 parallel_for_each) 平行容器 (可結合,concurrent_queue 和 concurrent_vector),及同步 ConcRT 感知處理原始物件 (critical_section、 事件和 reader_writer_lock) 均可將任務視為一個頂級概念。所有元件的 PPL 都住在並行存取命名空間。
工作群組可以讓您執行一組工作,並等待它們全部完成。因此在排序的範例處理兩半陣列中的工作可以讓一個工作群組。您保證這兩項工作都完成於等候成員函式呼叫的結尾使用平行工作和 lambdas 撰寫的遞迴快速排序的程式碼範例所示:
void quicksort(vector<int>::iterator first,
vector<int>::iterator last) {
if (last - first < 2) { return; }
int pivot = *first;
auto mid1 = partition(first, last, [=](int elem) {
return elem < pivot; });
auto mid2 = partition( mid1, last, [=](int elem) {
return elem == pivot; });
task_group g;
g.run([=] { quicksort(first, mid1); });
g.run([=] { quicksort(mid2, last); });
g.wait();
}
這可以來進一步改善藉由啟用 parallel_invoke 演算法的結構化的工作群組。 它採用由兩個到 10 的函式物件,並執行全部的平行使用多個核心 ConcRT 提供,並且等候它們完成:
parallel_invoke(
[=] { quicksort(first, mid1); },
[=] { quicksort(mid2, last); } );
parallel_invoke(
[=] { quicksort(first, mid1); },
[=] { quicksort(mid2, last); } );
可能有多個由每一項工作所建立的子任務。由 ConcRT 管理工作和執行執行緒之間的對應 (和確保最佳利用所有核心之間)。因此腐爛成多個任務的計算,盡可能將有助於善用所有可用的核心。
另一種有用的平行演算法是用來進行反覆並行的方式索引的 parallel_for:
parallel_for(first, last, functor);
parallel_for(first, last, step, functor);
這同時呼叫具有第一次開始 with,最後一個以結束每個索引的函式物件。
非同步代理程式庫提供資料流為基礎的程式設計模型計算所在位置取決於所需的資料成為可用。文件庫是以代理程式、 訊息區塊和訊息傳遞功能的概念為基礎。代理程式是會執行某些計算,並與其他代理程式,以解決更大的計算問題以非同步方式通訊的應用程式的元件。此代理程式之間的通訊是透過訊息傳遞函式和訊息區塊來達成。
代理程式擁有可觀察的生命週期不同階段所經歷。它們不是用來用來進行更細緻的平行處理原則使用 PPL 工作來達成。代理程式會建立在排程及資源管理的元件 ConcRT,同時可幫助您避免從並行處理應用程式中的共用記憶體的使用中產生的議題。
您不需要對連結或轉散發任何額外的元件,以利用這些模式。ConcRT、 PPL 和非同步代理程式庫已實作 msvcr100.dll、 msvcp100.dll 和 libcmt.lib/libcpmt.lib 旁邊標準程式庫內。PPL 和非同步的代理程式庫是大多是僅有標頭的實作。
Visual Studio 偵錯工具現在知道的 ConcRT 存在而且可以方便您偵錯並行的問題 — 與 Visual 的 Studio 2008 不同而有沒有認知較高層級的平行概念。Visual Studio 2010 具有可讓您以視覺化方式檢視的平行應用程式行為的並行處理分析工具。偵錯工具有以視覺化方式檢視應用程式和其呼叫堆疊中的所有任務的狀態的新視窗。圖 1 顯示平行工作和平行的紙牌視窗。
圖 1平行堆疊和平行工作偵錯 Windows
IntelliSense 和設計階段的產能
全新的 IntelliSense 和瀏覽的基礎結構會包含在 Visual Studio 2010。除了協助與小數位數和大型的程式碼基底的專案上的回應速度,基礎結構改良已經啟用了一些全新的設計階段產能功能。
像即時錯誤報告] 和 [快速諮詢工具提示根據新編譯器前端,它會剖析完整轉譯單位正在修改程式碼檔時,甚至提供程式碼語意的豐富且準確資訊的 IntelliSense 功能。
所有的程式碼瀏覽功能,像類別檢視] 和 [類別階層架構現在使用來源的程式碼資訊儲存在 SQL 資料庫,啟用索引,並具備固定的記憶體耗用量。與先前的版本不同的是 Visual Studio 2010 IDE 恆有回應,且您不再需要稍候編譯單位取得 reparsed 以回應標頭檔中所做的變更。
IntelliSense 即時錯誤報告 (不規則熟悉紅色曲線) 期間瀏覽和編輯的程式碼顯示編譯器品質語法和語意錯誤。滑鼠停留在錯誤可讓您在錯誤訊息 (請參閱 圖 2).錯誤清單視窗也會顯示來自檢視目前正在檔案錯誤所 IntelliSense 錯誤從別處編譯單位中。所有此資訊是不需要進行建置可用的。
圖 2即時錯誤報告顯示 IntelliSense 錯誤
在另外的相關清單包含的檔案一個下拉式清單中當時顯示輸入 # 包括並且清單修改依照您的輸入。
在新瀏覽至 (編輯 | 瀏覽到或 Ctrl + 逗號) 功能將會協助您使用檔案或符號搜尋更有效率。這項功能可讓您根據子字串,作為您類型,相符跨任何專案的符號和檔案的輸入的字串的即時搜尋結果 (請參閱 圖 3).這個功能也適用於 C# 和 Visual Basic 檔案,是可延伸的。
圖 3使用功能來巡覽
呼叫階層架構 (使用 Ctrl + K,Ctrl + T 叫用或從滑鼠右鍵功能表) 可讓您巡覽至所有的函式稱為從特定的函式和從特定的函式呼叫的所有函式。這是在舊版的 Visual Studio 中存在於 [呼叫瀏覽器功能的改良的版本。呼叫階層視窗得更好的組織,並提供同時從呼叫,並為相同的視窗中顯示任何函式呼叫到樹狀目錄。
請注意,所有的程式碼瀏覽的功能時適用單純的 C + + 和 C + + / CLI,IntelliSense 相關功能喜歡即時錯誤報告功能並且快速諮詢不會適用於 C + + / CLI 在 Visual Studio 2010 最終發行。
其他裝訂編輯器功能是太改善此版本中。比方說已更有彈性受歡迎的程式碼項目 (依此類推類別成員的類別函式),在整個方案內的參考用來搜尋的尋找所有參考功能。搜尋結果可 further 精簡使用按一下滑鼠右鍵快顯功能表中的解決結果選項。
非作用中的程式碼現在會藉由維護 (而非 becoming 灰色) 的顏色標示保留語意資訊。圖 4 顯示非作用中的程式碼會變暗的方式,但仍會顯示不同的色彩來傳達語意資訊。
圖 4非現用的程式碼區塊會保留顏色標示
除了所描述已經功能,一般編輯器經驗增強在 Visual Studio 2010。新的 Windows Presentation Foundation WPF 架構 IDE 已經重新設計,以移除雜亂,並改善可讀性。文件視窗,例如程式碼編輯器] 和 [設計] 檢視中現在可以浮動主要 IDE 視窗外,並可顯示多台監視器上。是,便可以很容易地在程式碼編輯器視窗使用 Ctrl 鍵和滑鼠滾輪放大和縮小。IDE 也改善了擴充性的支援。
建置和專案系統
Visual Studio 2010 也出實質的改良功能,建置系統和 C + + 專案,專案系統中。
最重要的變更是 MSBuild 現在用來建置 C + + 專案。MSBuild 是用於 C# 和 Visual Basic 專案在舊版的 Visual Studio 中的可擴充、 XML 架構建置協調流程引擎。MSBuild 是現在常見的 Microsoft 建置所有語言的系統。它可以用在組建實驗室和個別的開發人員的機器上。
C + + 建置處理序現在會定義在方面 MSBuild 目標和工作檔案,並提供更高程度的自訂、 控制項和透明度。
C + + 專案類型有新的副檔名:.vcxproj。Visual Studio 會自動將升級舊.vcproj 檔案和解決方案成新格式。還有一個命令列工具從命令列升級單一專案的 vcupgrade.exe。
在過去,您可以只使用工具組 (編譯器、 程式庫等等) 提供與您目前的 Visual Studio 版本。您必須等候直到您已準備好可以開始使用新的 IDE 之前移轉至新的工具組。Visual Studio 2010 可以藉著讓您為目標來對抗建置多個工具組版本解決該問題。比方說您可以在 Visual Studio 2010 工作時目標 Visual C++ 9.0 編譯器和程式庫。圖 5 顯示原生的多重目標設定上的屬性頁。
圖 5多個平台工具組為目標
使用 MSBuild 讓 C + + 建置更可擴充的系統。預設建置系統不是足以滿足您需求的時, 您可以新增您自己的工具或其他建置步驟] 來擴充它。MSBuild 使用作為的可執行程式碼的可重複使用單位來執行建置作業的工作。您可以建立您自己的工作,並擴充建置系統,請定義 XML 檔案中。MSBuild 從即時這些 XML 檔案產生工作。
可以藉由新增到 ImportBefore 和 ImportAfter 資料夾的其他步驟的.props 和.targets 檔案延伸現有的平台和工具組。這是特別有用的程式庫的提供者,而且想要擴充現有的工具建置系統。您也可以定義您自己的平台工具組。此外,MSBuild 提供較佳診斷資訊以方便您偵錯組建問題也使 [累加建置更可靠。再加上,您可以建立原始檔控制和建置實驗室,以及更少開發人員電腦組態的相依更接近繫結的建置系統。
位於最上層的建置系統,專案系統也會善用彈性和 MSBuild 所提供的擴充性。專案系統可以理解 MSBuild 程序,並允許 Visual Studio 無障礙地顯示 MSBuild 所提供的資訊。
自訂項目是看得見的且可以透過屬性頁來進行設定。您可以設定您的專案系統使用您自己的平台 (就像平現有 x86 或 x64 台) 或您自己的偵錯工具。屬性頁可讓您撰寫並整合動態更新的內容而定的屬性值的元件。Visual Studio 2010 專案系統甚至可讓您撰寫您自己自訂的使用者介面來讀取和寫入屬性,而不是使用屬性頁。
更快的編譯和較佳的效能
除了設計階段經驗改善到目前為止所述,Visual Studio 2010 也會增加編譯速度]、 [品質] 和 [使用 Visual C++ 編譯器的多個編譯器的增強功能回結束的程式碼產生的結果所建置的應用程式的效能。
某些應用程式的效能取決於工作集。對於 x64 架構已經在範圍內的 10%到 3%降低導致的這類應用程式的效能改進此版本中進行多個最佳化程式碼大小。
單一指令多重資料 (SIMD) 程式碼產生 — 這是很重要的遊戲、 音效、 視訊和圖形開發人員 — 已經過最佳化,改善效能和程式碼品質。改進部分包括中斷,則為 False 相依性,向量化的常數向量初始設定和較佳配置 XMM 移除多餘的負載會註冊、 儲存並移動。在另外 the__mm_set_ 貴、 __mm_setr_ 貴和 __mm_set1_ 貴的內建家族已經過最佳化。
以改善效能的應用程式應該使用建置連結時間程式碼產生 (LTCG) 和設定檔引導式最佳化 (PGO)。
藉由 x64 的程式碼產生中最佳化已經過改良 x64 平台上的編譯速度。建議更好的最佳化的 LTCG 的編譯通常會超過非 LTCG 編譯尤其是在大型的應用程式。在 Visual 的 Studio 2010 LTCG 編譯已經過改良 30 %。要寫入 PDB 檔案已被引入此版本中,因此您會看到連結時間改良,當您使用 [/DEBUG 專用的執行緒切換。
PGO 檢測執行已建立的新增的已檢測的二進位檔的無鎖定版本的支援的速度更快。同時也是新的 POGO 選項,PogoSafeMode,可讓您指定是否要使用安全模式或快速模式,當您最佳化應用程式。快速模式是預設行為。安全模式是安全執行緒,但比快速模式來得慢。
編譯器產生的程式碼品質已改善。現在是為進階向量擴充功能 (AVX),這是非常重要,對於 floating point 佔用透過內建的 AMD 和 Intel 處理器和 /arch:AVX 選項中的應用程式的完整支援。浮點計算是以 /fp:fast 選項更精確。
Windows 7 的建置應用程式
Windows 7 引入一些令人興奮的新技術和功能,並加入新的 API,並 Visual Studio 2010 提供存取到所有新的 Windows API。必要的原生 Windows API 撰寫程式碼的 Windows SDK 元件會包括在 Visual Studio 2010。您可以利用如 Direct3D 11、 DirectWrite、 Direct2D 和 Windows Web 服務 API 的創新設計使用 SDK 標頭和在 Visual Studio 2010 中可用的程式庫。
除了讓開發人員可以使用所有 Windows API,此版本的 Visual Studio 也可以方便您撰寫應用程式的 Windows 協助下的向上 beefed MFC。您可以透過 MFC 程式庫取得存取實質 Windows 7 功能而不必直接寫入原生 API。您現有的 MFC 應用程式將燈上 Windows 7 只要重新編譯。並將新的應用程式可以採取充份利用新功能。
MFC 現在包含與 Windows 殼層的加強型的整合。與 Windows 檔案總管] 的應用程式 ’s 整合現在可以是更好讓使用的檔案處理常式預覽、 縮圖和搜尋已加入此版本中。這些功能提供作為 MFC 應用程式精靈中的選項 (如 所示圖 6.MFC 會自動產生實作這些處理常式的 ATL DLL 專案。
圖 6MFC 應用程式精靈的檔案處理常式選項
其中一個 Windows 7 中最顯著的使用者介面變更是新的工作列。MFC 可讓您快速地善加利用功能像跳清單,定位縮圖]、 [縮圖預覽]、 [進度列]、 [圖示覆疊等等。圖 7 顯示縮圖預覽和索引標籤式的縮圖為索引標籤式 MDI MFC 應用程式。
圖 7索引標籤式的縮圖和 MFC 應用程式中的縮圖預覽
功能區 UI 現在有 Windows 7 樣式功能區太,而您的應用程式可以交換即時 UI 以 Windows 7 功能區從數個 Office 樣式型 (緞帶) 開發期間的任何時間藉由使用 [樣式] 下拉式清單,如 所示圖 8.
圖 8 在 MFC 應用程式中的功能區樣式下拉式清單
MFC 可讓您的應用程式成為 multi-touch 感知和呼叫適當的訊息,以處理各種碰觸事件時就會發生。只要註冊觸控式和筆勢事件會路由傳送您的應用程式的事件。MFC 也會使得應用程式高 DPI 感知依預設,因此它們適應高 DPI 的螢幕,並不要尋找 pixelated 或模糊。MFC 在內部縮放變更字型和其他項目,以確定您的 UI 仍會繼續看起來銳化高 DPI 顯示上。
除了新的 Windows 7 功能一些其他的 Windows 功能,因為 Windows Vista 已存在,但沒有被包含在先前版本的 MFC 已包含現在。比方說重新啟動管理員是實用的功能可以讓應用程式執行的應用程式的 Windows Vista 中引入終止之前,請先儲存。應用程式可以叫用此功能,然後再還原其狀態時重新啟動。您可以現在利用完整的重新啟動管理員在 MFC 應用程式更 elegantly 處理系統當機和重新啟動中。只需加入一行啟用重新啟動及修復現有的應用程式中的程式碼:
CMyApp::CMyApp() {
m_dwRestartManagerSupportFlags =
AFX_RESTART_MANAGER_SUPPORT_RESTART;
// other lines of code ...
}
新的 MFC 應用程式可使用 MFC 應用程式精靈 」 自動取得這項功能。自動儲存機制可用儲存文件的應用程式,並自動儲存間隔可以由使用者定義。應用程式可以選擇只重新啟動支援或應用程式的復原開始 (適用於博士] 或 [檢視類型應用程式),在 MFC 應用程式精靈。
另一個是郵件的改良型別 [Windows 工作] 對話方塊 (請參閱 圖 9).MFC 現在已可以在您的應用程式中使用 [工作] 對話方塊的包裝函式。
圖 9工作對話方塊
回是 MFC 類別精靈
不僅已經新功能在中新增將 MFC 程式庫本版也就比較容易使用 Visual Studio IDE 中的 MFC。其中一個最常要求的功能,(如 中所示的 MFC 類別精靈圖 10),被帶回而獲得改善。您現在可以新增類別、 事件處理常式和其他項目至您的應用程式使用 MFC 類別精靈。
圖 10 **MFC 類別精靈 **
另一個加法是功能區設計工具可讓您以圖形方式設計您的功能區使用者介面 (而非在 Visual Studio 2008 中的程式碼中定義它),並將它儲存為 XML 資源。這個設計工具是很顯然適用於建立新的應用程式,但現有的應用程式也可以利用以更新其使用者介面設計工具。可以只由暫時將一行程式碼加入至現有的程式碼定義的功能區使用者介面建立 XML 定義:
m_wndRibbonBar.SaveToXMLFile(L"YourRibbon.mfcribbon-ms");
產生的 XML 檔案然後為資源檔耗用以及進一步修改可以使用功能區設計工具。
結論
Visual Studio 2010 是主要發行中的 Visual C++ 演進,使開發人員的生活更容易在許多方面。 我幾乎沒有有刮痕各種 C + + 相關改進的表面本文中。 在不同功能的進一步討論,請參閱 MSDN 說明文件,並在 Visual C++ 小組 ’s 部落格blogs.msdn.com/vcblog,已經用已也為基礎的一些本文章節。
Sumit Kumar 是 Visual C++ IDE 小組中的程式管理員。他從該大學的德州達拉斯在電腦科學中持有 MS 程度。
多虧到下列的技術專家: Stephan T。 Lavavej、 Marian Luparu 和 Tarek Madkour