1. 程式人生 > >VS2008中自定義C++工程模板與修改新建檔案預設編碼的辦法

VS2008中自定義C++工程模板與修改新建檔案預設編碼的辦法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

VS2008中自定義C++工程模板與修改新建檔案預設編碼的辦法

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

討論新聞組及檔案

一、  
需求

網上講VS(以下VS均特指VS2008)自定義模板的不少,不過大部分都是講C#或者Web開發的,什麼export template的,都不適合C++工程,由於MS的確是減弱了對C++的支援,(這點沒有人否認吧?)所以在VSC++總是被遺忘在那個沒有人理睬的角落,所以現在很多人寧願還用著C++MFC最輝煌的版本VC6.0,哪怕那個版本的C++這麼不符合標準。。。。。既然MS不關心C++使用者,那就只有自己奮發圖強羅,還好再怎麼樣,沒有了VS,我們總還是有VIM+G+++GDB/Emacs的,沒有了MFC我們還有QtGTK+的,何況個人用EclipseLinux下做Qt程式的感覺也不錯,閒話不說了,看看正題。

自定義工程模板是用途很大的,當你有一個簡單的模板用於開發的時候,沒有VS內部的支援時,你有兩種辦法,其一你將原有整個工程拷貝一份,然後改工程名(在我以前的公司就是這樣乾的),改名不說,要進VSS,還得改工程的GUID(不懂的就算了),其二是新建一個工程,然後一個一個新增檔案,假如有自己的目錄結構的時候,還得重新控制目錄結構,工程大時也是異常麻煩,其實這些用上了VS自定義模板,一切都可以很簡單,就像你進行Win32 SDKMFC開發MS給你的模板一樣。

修改VS中新建檔案的預設編碼嘛,純Windows人士請忽略,我是因為需要在Linux下編輯和檢視這些檔案才有此需求。事實上,即使想要在

Linux下檢視或者編輯這些程式碼也可以不做改變,但是我就是想將其全部改成UTF8,不喜歡將Linux下設定一大堆東西,gcc需要加gb2312的選項,vim需要加配置,Eclipse也需要改配置,其他文字編輯工具也需要選定編碼,全部是因為VS在中文Windows下的預設編碼是gb2312(我用的是英文VS2008,這個可能是跟著作業系統環境走的),雖然也不怪MS。。。。既然VS也支援UTF8,就讓Windows遷就Linux了。。。。還需要遷就的是Linux下的換行與Windows不同,順面一起解決了,雖然大部分時候,在公司,都是用Linux的東西來遷就Windows。修改預設編碼的辦法我在網上找了很久也沒有找到,大部分人都說是直接用Advanced Save Option來選擇儲存,那樣多麻煩啊,或者先建立工程以後用find批量改,那樣也不見的簡單啊。。。。。。。。看下面的解決辦法。

 

二、   解決辦法

1.      新建檔案

奧祕在Microsoft Visual Studio 9.0/VC/vcprojectitems中(Microsoft Visual Studio 9.0根據你安裝目錄而定)

新建的C++檔案,主要是newc++file.cpp這個檔案,目前是空的,你將其改成什麼樣,那就是什麼樣,比如,我需要在每個檔案的頭部新增一大串的GPL說明,(不是我想,這是FSF規定的),那麼就直接在此檔案新增我的檔案頭即可,以後用add->add new item->C++ files時,就都會自動帶著檔案頭出來了。。。更好用的是,我現在將此檔案轉為UTF8+Unix換行格式,那麼以後新建的檔案都是如此了。。。呵呵,此謂之一勞永逸。

新建的標頭檔案是hfile.h這個檔案,如上更改,一勞永逸。事實上,我將上面的檔案複製一份,重新命名為hfile.h^^

普通文字檔案由於常做Readme用,也改了。是text.txt這個檔案。

 

2.      授人以魚不如授人以漁

我當然不是一個一個檔案試出來的,也不是猜出來的,授人以魚不如授人以漁,這裡告訴大家怎麼去自己摸索。上述三個檔案有個共同特點,那就是可以通過右鍵add->new item,那麼我首先檢視的就是new item了,這裡,我的Visual C++下的下面有UICodeDataResourceWebUtilityProperty Sheets7個選項,與Microsoft Visual Studio 9.0/VC/vcprojectitems下面的7個目錄及目錄名一一對應,很明顯了,這些選項由此7個目錄中的內容控制的,首先看Code目錄,一個code.vsdir的檔案,開啟一看

 ../NewC++File.cpp|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1075|10|#1076|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9031|4096|#1077

../HFile.h|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1078|15|#1079|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9030|4096|#1080

../IDLFile.idl|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1084|20|#1085|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9035|4096|#1086

../DEFFile.vsz|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1087|35|#1088|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9036|4096|#1089

../addmc++componentclass.vsz|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1236|85|#1237|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9563|4096|#1238

../installer.vsz|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|#1245|85|#1246|{1B027A40-8F43-11D0-8D11-00A0C91BC942}|9564|4096|#1247

咋一看,亂碼?2進位制檔案?的確像,再仔細看看,前面的一部分,那不就是選單中有的Items項?一一對應的。再仔細看,發現其實前面的字串都是一個目錄,指向父目錄下的各個檔案,其中前面兩個就是.. /NewC++File.cpp.. /HFile.h兩個檔案,那就是上一節中我發現的兩個檔案,對應新新增的C++檔案和標頭檔案。vsdir後面的東西是更詳細的說明,長串的{}GUID#xxx是通過ID來表示資源。但是這裡我們不去詳細瞭解了,想要詳細瞭解的參看MSDN這裡,同理,文字檔案在Utility目錄下的VCUtilityItems.vsdir制定的,我就不多說了。

 

3.      自定義工程模板

新建工程中有個Custom Wizard選項,我將其命名為Win32OpenGLWizard。建立以後是一個完整的Wizard工程,天哪,一看,真複雜,我僅僅想建立一個簡單的C++工程嘛,至於這樣複雜嗎?很顯然,MS設計VS的自定義模板的時候就是給其他軟體開發商用的,根本沒有考慮過個人使用-_-!因為其中包含了HTML,CSS,JS….並不是每個人都是做網頁的**。。。。作為用C++的我們,就知道想辦法摸索摸索羅,符合我們的要求就好。要將引導框設計的多麼完美我個人是沒有什麼希望了。所以建立Win32OpenGLWizard工程時,使用者的UI選擇就不需要了吧,直接通過名字就好。

首先利用剛才新建的Wizard去建立一個工程,(會出現在New ProjectWizard下,實際的檔案放在 我的文件/Visual Studio 2008/Wizards中)發現我們主要關注的是Template Files下的兩個檔案,那就是生成後工程會包含的檔案。嘗試一下。

template Files下新增main.cpp,修改Readme.txt,刪除sample.txt,實際操作時請將檔案新增到/Templates/1033目錄下面去,並且手動修改Templates.inf新增進main.cpp。新建工程後果然可行。

 

4.      修改自定義工程模板

有個問題是Readme.txtSource File目錄下,而main.cpp跑到Source Files外面去了。作為半個完美主義者,雖然工程已經能編譯通過,但是還是有點不爽,我希望進一步改進,那麼下一步看看Source Files是哪裡規定的羅,在default.js中可以看到

function AddFilters(proj)

{

       try

       {

              // Add the folders to your project

              var strSrcFilter = wizard.FindSymbol('SOURCE_FILTER');

              var group = proj.Object.AddFilter('Source Files');

              group.Filter = strSrcFilter;

       }

       catch(e)

       {

              throw e;

       }

}

此函式,已經明白一半了,此函式不就是尋找匹配的過濾文字,然後將其加入Source Files中去嘛。^^就看SOURCE_FILTER是什麼symbo

這裡分兩種情況:

wizard UI

假如沒有新增Wizards UI可以在新增的wizard工程下看到一個vsz檔案,我這裡如下:

VSWIZARD 7.0

Wizard=VsWizard.VsWizardEngine.9.0

 

Param="WIZARD_NAME = Win32OpenGL"

Param="ABSOLUTE_PATH = D:/MyDocument/Visual Studio 2008/WizardTemplate/Win32OpenGL/Win32OpenGL"

Param="FALLBACK_LCID = 1033"

Param="WIZARD_UI = FALSE"

Param="SOURCE_FILTER = txt"

 

這就是一個簡單的類INI檔案,詳細資訊可以參考MSDN這裡。我們關心的自然是SOURCE_FILTER引數,改成cpp,竟然沒有效果,不知道其他人怎麼樣,我這裡沒有效果的原因不明。但是雖然不知道此js wizard.FindSymbol的實現方法,但是我們還是可以用暴力解決!呵呵,將上述js函式改成如下形式:

 function AddFilters(proj)

{

       try

       {

              // Add the folders to your project

              //var strSrcFilter = wizard.FindSymbol('SOURCE_FILTER');

              var strSrcFilter = 'cpp';

              var group = proj.Object.AddFilter('Source Files');

              group.Filter = strSrcFilter;

       }

       catch(e)

       {

              throw e;

       }

}

就好了。我得意的笑啊,我得意的笑^^對於MS奇怪的失靈,有的時候暴力也是必須的。

 

wizard UI

假如添加了UIMS就要考慮你在wizard UI中改變此Symbo的可能了,會在HTML/1033/default.htm這個UI管理檔案下看到

<SYMBOL NAME='SOURCE_FILTER' TYPE=text VALUE='txt'></SYMBOL>

改之

<SYMBOL NAME='SOURCE_FILTER' TYPE=cpp VALUE='cpp'></SYMBOL>

有效。

再次建立工程,cpp檔案已經在Source Files中了,ReadMe.txt也死出去了,以後再需要標頭檔案什麼的也一樣處理就好了。

 

5.      接近完美

好了嗎?已經很好了,但是作為3/4個完美主義者,我還有有點想改的地方,那就是我平時建工程,很簡單的工程主檔案與工程名一直,這樣萬一哪天想全部拷貝到一起管理也方便,但是按上述方式檔案將全部是main.cpp,解決之,電腦上沒有咋程式設計師解決不了的事情。

看上述js指令碼,如下函式:

function GetTargetName(strName, strProjectName)

{

       try

       {

              // TODO: set the name of the rendered file based on the template filename

              var strTarget = strName;

 

              if (strName == 'readme.txt')

                     strTarget = 'ReadMe.txt';

 

              if (strName == 'sample.txt')

                     strTarget = 'Sample.txt';

 

              return strTarget;

       }

       catch(e)

       {

              throw e;

       }

}

 

再看看它的使用,就知道此處就是我們需要修改的地方,實際上MS已經考慮了這樣的情況了,我們不需要暴力^^改成如下內容:

function GetTargetName(strName, strProjectName)

{

       try

       {

              // TODO: set the name of the rendered file based on the template filename

              var strTarget = strName;

 

              if (strName == 'readme.txt')

                     strTarget = 'ReadMe.txt';

 

              if (strName == 'main.cpp')

                     strTarget = strProjectName + ".cpp";

 

              return strTarget;

       }

       catch(e)

       {

              throw e;

       }

}

測試,OK

 

三、   後記

所有的說明,版權資訊都在,檔案內容,編碼,換行符都搞定了,檔名也符合我的要求了,接近完美,鑑定完畢!

此過程發狂的得不到MSDN滿篇.Net的幫助,又難領悟廣大C#網民的旁敲側擊,獨自在VS的漆黑中摸索,逢JS大山則開路,逢HTML大石則劈之,屢次撞壁,失敗數回,嘆MS之棄cpper至此,捶胸頓足,奮發自強,吐血三升,乃作此文,以茲紀念。

 

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述 你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

新的改變

我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:

  1. 全新的介面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支援甘特圖的mermaid語法1 功能;
  6. 增加了 多螢幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G

合理的建立標題,有助於目錄的生成

直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC語法後生成一個完美的目錄。

如何改變文字的樣式

強調文字 強調文字

加粗文字 加粗文字

標記文字

刪除文字

引用文字

H2O is是液體。

210 運算結果是 1024.

插入連結與圖片

連結: link.

圖片: Alt

帶尺寸的圖片: Alt

當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的程式碼片

部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片.

// An highlighted block var foo = 'bar'; 

生成一個適合你的列表

  • 專案
    • 專案
      • 專案
  1. 專案1
  2. 專案2
  3. 專案3
  • 計劃任務
  • 完成任務

建立一個表格

一個簡單的表格是這麼建立的:

專案 Value
電腦 $1600
手機 $12
導管 $1

設定內容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文字居中 第二列文字居右 第三列文字居左

SmartyPants

SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

建立一個自定義列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何建立一個註腳

一個具有註腳的文字。2

註釋也是必不可少的

Markdown將文字轉換為 HTML

KaTeX數學公式

您可以使用渲染LaTeX數學表示式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通過尤拉積分

Γ ( z ) = 0 t z 1 e t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多關於的資訊 LaTeX 數學表示式here.

新的甘特圖功能,豐富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 現有任務
        已完成               :done,    des1, 2014-01-06,2014-01-08
        進行中               :active,  des2, 2014-01-09, 3d
        計劃一               :         des3, after des2, 5d
        計劃二               :         des4, after des3, 5d
  • 關於 甘特圖 語法,參考 這兒,

UML 圖表

可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖::

這將產生一個流程圖。:

  • 關於 Mermaid 語法,參考 這兒,

FLowchart流程圖

我們依舊會支援flowchart的流程圖:

  • 關於 Flowchart流程圖 語法,參考 這兒.

匯出與匯入

匯出

如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。

匯入

如果你想載入一篇你寫過的.md檔案或者.html檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎