首先,是遇到的問題:
一天,使用VS2010看新專案程式碼時候,發現選中某個變數後,其它位置高亮顯示的變數顏色太淡,不利於閱讀程式碼,如下圖。所以想修改這個顏色。
後來網上找了一遍,可以這樣設定:工具——選項——環境——字型和顏色——VA Find Reference——項背景色——自定義。設定後效果圖如下圖:
然後,我也想通過同樣的辦法在VS2015裡設定 int_my_color 的背景色。於是,折磨來了。
首先,按照VS2010裡的辦法設定變數的背景色:選項——工具——自定義顏色,發現不能生效。
然後,又嘗試修改了多項設定,仍然不行,int_my_color的高亮背景色完全不給反應。
再然後,想到了
1.這些顏色設定肯定是儲存在VS的配置檔案裡;
2.顏色肯定有對應的畫素值;
於是:
1.找到了這個目錄:C:\Users\Administrator\AppData\Local\Microsoft\VisualStudio\vshub\Settings,以及《SharedSettings.xml》,UI裡修改顏色設定後,該檔案會更新,可以推斷出這個檔案肯定是我要找的目標。
2.取到int_my_color背景色畫素值(226,230,214),對應值#e2e6d6,14870230。如下圖:
所以去《SharedSettings.xml》搜尋上面的畫素值,然而,搜不到。
於是:我懷疑是畫素值不對。所以進行測試。
測試過程:
1、首先要找到一個正確的標識(這裡使用註釋的背景色),來確定 if (設定的顏色 == 實際取到的顏色)。
第一步:設定註釋的背景色為RGB(255,0,0),純文字背景色為白色RGB(255,255,255)。但是實際測試發現:註釋的背景色為RGB(255,51,51),與設定不同。
這就很奇怪了,為什麼設定為RGB(255,0,0),實際得到的卻是RGB(255,51,51)呢?
第二步:繼續測試:重新設定純文字背景顏色為黑色RGB(0,0,0),註釋的背景色為RGB(255,0,0),但是得到的畫素值卻是(204,0,0),如下圖,也是很奇怪。
於是,通過第一步和第二步的結果,我做了推斷1:
VS2015顯示的背景色不是由單一設定的顏色來決定的,它可能是兩個背景色RGB值的疊加。比如上面的RGB值=純文字背景RGB + 註釋背景RGB。
然後,就是分析,疊加規則是什麼呢?
已有資料:
a.實際註釋背景色RGB(255,51,51) = 純文字白色RGB(255,255,255)+註釋紅色RGB(255,0,0)
b.實際註釋背景色RGB(204,0,0) = 純文字黑色RGB(0,0,0)+註釋紅色RGB(255,0,0)
由a,b知道使用白色背景會在後兩位加51,使用黑色背景就會變成204。好像看不出什麼規律。
此時只能繼續猜測 (純文字背景色,註釋的背景色)兩者之間的疊加關係。黑色RGB(0,0,0),似乎比白色RGB(255,255,255)要方便,因為初始值為0,可能會不受某些資料干擾。
於是選擇黑色疊加註釋的背景色,繼續做測試:
1.仍然是純文字黑色RGB(0,0,0),設定註釋的背景色為紅色RGB(200,0,0),實際註釋背景色RGB(160,0,0)
2.純文字黑色RGB(0,0,0),設定註釋的背景色為紅色RGB(150,0,0),實際註釋背景色RGB(120,0,0)
3.純文字黑色RGB(0,0,0),設定註釋的背景色為紅色RGB(100,0,0),實際註釋背景色RGB(80,0,0)
很明顯的結論:
純文字黑色條件下:實際註釋的背景色R = 設定註釋的背景紅色R * 0.8
記作:Real_R = Remark_R * 0.8 (規則1)
同理,測試了G,B兩位的畫素值規律,仍然滿足上面的結論。
所以:在純文字的黑色條件下,上面的規律可以用來計算變數 int_my_color背景色的設定值嗎?
再次測試:
變數int_my_color 實際背景色畫素值RGB(175, 179, 163),各位除以0.8,計算得到的畫素值RGB(218.75,223.75,203.75),有小數。
而畫素值會取整,所以有:218.75<R<218.75+1/0.8,可以得到
R=219,G=224,B=204
所以理論上:設定變數int_my_color高亮顯示的背景畫素值RGB為(219,224,204),#DBE0CC,14409932。
於是,去《SharedSettings.xml》裡搜尋14409932,仍然搜不到!!!
做到這裡。。。不得不再次想一下:
雖然最後得到的理論RGB(219,224,204) 滿足推斷1:VS2015顯示的背景色不是由單一設定的顏色來決定的,它可能是兩個背景色RGB值的疊加,並且滿足規則1:純文字黑色條件下:實際註釋的背景色R = 設定註釋的背景紅色R * 0.8。
但在《SharedSettings.xml》裡搜不到,就意味著哪裡錯了。
可能是:
推斷2:VS2015顯示的背景色不是由單一設定的顏色來決定的,它可能是三個(及以上)背景色RGB值的疊加。
三個及以上的變數疊加,這個複雜度。。。
我選擇了笨辦法:一個個試試。。。
使用分段查詢思想: 一次多設定幾個——然後確認——觀察 int_my_color 背景色有沒有改變。。。
最後的最後,終於讓我試出來了!就是這個“突出顯示的引用”。
我們再看看:
實際註釋的背景RBG(175,179,163) 是否等於 設定註釋的背景RGB(219,224,204)*0.8
219 * 0.8 = 175.2,取整175
224 * 0.8 = 179.2,取整179
204 * 0.8 = 163.2,取整163
完全符合上面的推斷過程!!!說明規則1:
純文字黑色條件下:實際註釋的背景色R = 設定註釋的背景紅色R * 0.8
記作:Real_R = Remark_R * 0.8
以及,推斷1:
VS2015顯示的背景色不是由單一設定的顏色來決定的,它可能是兩個背景色RGB值的疊加。
是對的。(三個及以上沒有驗證了)
只是(219,224,204)對應的畫素值#DBE0CC,14409932 在《SharedSettings.xml》是真的搜不到。(可能還是把這個值疊加到了某個欄位的Background裡)
耗費三個小時,終於搞清楚了。