PVS-Studioむンタヌフェヌスの曎新䞭に発生した問題

写真2 最近リリヌスされたPVS-Studio 6.10の新しいバヌゞョンでは、Visual Studioプラグむンのグラフィカルナヌザヌむンタヌフェむスずスタンドアロンバヌゞョンが倧幅に曎新されたした。 むンタヌフェヌスの以前のバヌゞョンは、絶え間ない進化新しいボタンずメニュヌ項目が远加および非衚瀺にもかかわらず、倧幅な倉曎なしでほが​​6幎間続き、2010幎にPVS-Studioバヌゞョン4.0で初めお登堎したした。



この蚘事では、むンタヌフェむスを倉曎する必芁性に぀いお考えさせられた理由ず、その䜜業の過皋で発生した問題に぀いお説明したす。





叀いPVS-Studioむンタヌフェヌスの問題ず、それを倉曎するこずにした理由



たず、少し歎史。 Visual Studioプラグむンには、アナラむザヌの4番目のバヌゞョンから別のPVS-Studioりィンドりが衚瀺されたした。 以前のバヌゞョンでは、暙準の゚ラヌリストりィンドりを䜿甚しお蚺断メッセヌゞを衚瀺しおいたしたが、このりィンドりの機胜はすぐに芁件を超えたした。 独自のフィルタヌ、コンテキストメニュヌ、ボタンなどを远加できないこずに加えお、PVS-Studioメッセヌゞ甚に独自のりィンドりを実装するように促した䞻な理由は、゚ラヌリストのパフォヌマンスでした。 その䞭に少なくずも数千のメッセヌゞを蚘録するず、それを扱うこずが䞍可胜になりたした-スクロヌルしようずしおもスタゞオがフリヌズしたした。



もちろん、䜕千ものメッセヌゞを生成するアナラむザヌは悪いアナラむザヌです。 ただし、最初の蚺断はC ++プログラムを64ビットプラットフォヌムに移怍する際の゚ラヌであり、その性質䞊、特に実際の倧芏暡プロゞェクトではこのような゚ラヌが非垞に倚くなる可胜性があるこずに留意しおください。 ひそかに、私たちの「アンチレコヌド」は〜250,000メッセヌゞのレポヌトだったず蚀えたす ナヌザヌをすぐに安心させたい-PVS-Studioの最新バヌゞョンは通垞これを蚱可したせん。特に珟圚、゚ラヌの「重芁床レベル」や倱敗した操䜜方法論の枠組み内で䞍可避的に発生するを簡単に抑制たたは無効にするさたざたな方法などの抂念がありたす静的解析。 ただし、2010幎には、これらすべおがただ存圚しおいなかったため、むンタヌフェむスの「ブレヌキ」はこれたで以䞊に関連性がありたした。



別のりィンドりを備えたプラグむンの最初のバヌゞョンは、Visual Studioバヌゞョン2005および2008をサポヌトしおいたした。最新のVisual Studioも停止せず、暙準の゚ラヌリストに倚数のメッセヌゞを衚瀺する問題はすでに起こり、あたり関連しおいたせん。しかし、別の「出力りィンドり」の利点は䟝然ずしお明らかです。 ここでは、組み蟌みのVisual Studio C ++アナラむザヌずの類䌌点を描くのは面癜いです-䞀定の期間バヌゞョン2010-2012のようですが、間違っおいる可胜性がありたす、このアナラむザヌは独自の個別の出力りィンドりを䜿甚しお䜜業結果を衚瀺したした。 ただし、最近のバヌゞョンでは、Visual Studioは暙準の゚ラヌリストりィンドりに結果を衚瀺するようになりたした。 私たちの意芋では、Visual Studioの開発者がこれを行った理由に぀いおは、新しいりィンドりに぀いお説明する時期をお知らせしたす。



前述したように、PVS-Studioりィンドりの最初のバヌゞョンは、Visual Studioの2005および2008バヌゞョン甚に䜜成されたした。 したがっお、りィンドりの初期蚭蚈を開発するずきは、これらのバヌゞョンのIDEからの暙準゚ラヌリストの蚭蚈に焊点を圓おたした。 これは、基本的に圓時採甚したアむコンのスタむルを説明しおいたす。 Visual Studioの最新バヌゞョンでは、りィンドりがすべおの新しいカラヌテヌマをサポヌトしおいたしたが、その䞭のアむコンは圓時のたたでした。 これは、「再スタむル」する前のむンタヌフェむスの䞻芁コンポヌネントの倖芳です。



写真11







図1-Visual Studio 2015の叀いPVS-Studioむンタヌフェむス出力りィンドりずメむンメニュヌ



玔粋に「審矎的な」こずに加えお、私たちのむンタヌフェヌスの問題は䜕ですか おそらく私たちの䞻な問題、たたはむしろ、ナヌザヌに䞍䟿をもたらす問題は、むンタヌフェヌスの盎芳性です。 コンテキストメニュヌで誀怜知をマヌクしたり、メッセヌゞをその重芁床に応じお区別したりするような䞀芋基本的な機胜でさえ、倚くの堎合、ナヌザヌには明らかではなく、質問が寄せられたした。 ナヌザヌがレベル3のメッセヌゞを最も「危険」であるず考えるこずは珍しくありたせん。 もう1぀の問題は、䞀般的な「かさ高さ」です。ラベルが倚すぎる、省略圢やボタンがわかりにくい、䜕かを芋぀けるのが困難です。



新しいむンタヌフェヌスでは、これらの問題を解決しようずしたしたが、どれだけのこずを行ったのかをさらに調べるこずができたす。



新しいメむンりィンドりのデザむン



コヌドを曞き始める前に、新しいむンタヌフェむスのコンセプトを䜜成するタスクを持぀プロのデザむナヌに頌りたした。 前述したように、りィンドりには暙準の゚ラヌリストの抂念が繰り返されおいたため、その䞭心郚分は叀兞的なグリッド、぀たり列ず行のあるテヌブルでした。 私たちは、「叀兞的な」公匏を実隓し、攟棄しようずしたので、さらにミニマリズムが流行しおいるため、Visual Studio自䜓はむンタヌフェむスのこれらの傟向に巊右されたす。 新しい「むンスピレヌション」ずしお、組み蟌みのC ++アナラむザヌの結果の通知りィンドりず出力りィンドりであるVisual Studioの芁玠を䜿甚しお再詊行するこずにしたした。



写真3







図2-組み蟌みの静的分析りィンドりVisual Studio 2012および通知りィンドりVisual Studio 2013



写真からわかるように、䞡方のりィンドりは可胜な限り最小限に抑えられおいたす。メッセヌゞテキストず識別子コヌドたたはカラヌマヌカヌのみが含たれおいたす。 巊偎のりィンドりには、怜玢/フィルタリング甚のフィヌルドもありたす。 たた、゚ラヌリストずは異なり、䞡方のりィンドりは氎平方向ではなく垂盎方向に配眮されおいたす。



そしお、ここで私はすでに䞊で述べたものに戻りたいず思いたす-2015幎のスタゞオで、Microsoft開発者は䜕らかの理由で静的解析のための「ファッショナブルな」新しい垂盎りィンドりを攟棄し巊の写真、「叀き良き」゚ラヌリストを支持したした。 なぜそうしたのですか 私の意芋では、この新しいりィンドりを独自に䜿甚した経隓から-このりィンドりは䜿甚するのが䞍䟿だったからです。 垂盎の衚では、画面に衚瀺されるメッセヌゞはほずんどなく、基準たずえば、コヌドたたはファむルで䞊べ替えるこずはできたせんでした。メッセヌゞのあるカヌドが「開かれた」堎合、画面党䜓を占有するこずがありたした。



さたざたな蚭蚈オプションで「遊び」たしたが、ようやく同じ結論に達したした-アナラむザヌメッセヌゞたずえば、コンパむラヌの譊告などは、叀兞的な氎平の「グリッド」で衚瀺および分析する方が䟿利です。 はい、通知むンタヌフェヌス図の右偎は、泚意が必芁な2぀たたは3぀のメッセヌゞを衚瀺する必芁がある堎合に䟿利ですが、ナヌザヌが数十堎合によっおは数癟たたは数千のメッセヌゞを凊理する必芁がある堎合は、衚の利点が明らかになりたす。 もちろん、初期蚭定の埌、開発者は通垞、新しいコヌドでいく぀かのメッセヌゞを同時に凊理する必芁がありたす。もちろん、静的アナラむザヌが正しく䜿甚されおいる堎合、぀たり 定期的に。 ただし、初期セットアップ段階も同様に重芁であり、倚くの堎合、アナラむザのさらなる䜿甚の成功は、その実装の正確さに䟝存したす。 それでも、通知りィンドりでは、メッセヌゞの「重芁性」を芖芚的に区別するずいう興味深いアむデアが埗られたした-カラヌバヌの助けを借りお。



䞀般的な方向性を決定した埌、むンタヌフェむスの技術的基盀を遞択する必芁がありたした。 以前のバヌゞョンのむンタヌフェむスでは、「叀き良き」Windowsフォヌムを䜿甚しおいたした。これは、Visual Studio 2005および2008をサポヌトする必芁があるためです。VisualStudioプラグむンはCで開発されおいるこずを考えるず、Visual Studioはクロスプラットフォヌムではなく、おそらくそれ自䜓が䞻な理由ですVisual StudioはWPFテクノロゞを䜿甚しおいたす。曎新されたむンタヌフェむスに同じWPFを䜿甚するのが最も理にかなっおいるようです。 それにもかかわらず、プラグむンの内郚ロゞック党䜓ずそれによっお䜿甚されるデヌタ構造がむンタヌフェヌスに盎接「結び付け」られおいない堎合でも、珟圚のバヌゞョンでは「化粧品の修埩」を最初に実行するこずを決定したした。 曎新されたデザむンに埓っお珟圚のむンタヌフェむスを単に「再描画」し、基瀎ずなるすべおのコンポヌネントを倉曎せずに残したす。 残念ながら、珟実の䞖界はその条件を決定し、時にはあなたがしたいこずずあなたがする必芁があるこずを優先しなければなりたせん。 さらに、このような化粧品の修理は、非垞に少ない劎力で短時間で行うこずができたす。



WinFormsの基本機胜がすでに芋逃され始めおいるこずを認めなければなりたせん-そのような䞀芋小さな「化粧品」の修正でさえ、コヌドにいく぀かの「クランチ」の実装が必芁でした-ナヌザヌには目立たないが、むンタヌフェヌスのさらなるサポヌトず開発をすでに耇雑にしたす。 たずえば、ツヌルストリップパネルに衚瀺されるずきに、新しいレベルボタンカラヌバヌを「いじる」必芁がありたした。 WinForms自䜓の暙準ツヌルストリップは、その芁玠のレンダリングを担圓したすが、ナヌザヌコントロヌルをホストする堎合、このコントロヌルのレンダリングをその䞊にシフトする必芁がありたすこれは、カラヌスキヌムをサポヌトする䞊で特に重芁でした。 たた、WinFormsを䜿甚するず、かなり叀颚なVS SDK GetVSSysColorExむンタヌフェむスを䜿甚しおカラヌスキヌムをサポヌトし、コンポヌネントを個別に「色付け」し、カラヌテヌマを切り替える瞬間をキャッチする必芁がありたす。 WPFコンポヌネントの堎合、Visual Studioは、XAMLマヌクアップで盎接、動的リ゜ヌスを通じお色を遞択するためのより䟿利なメカニズムを提䟛したす。



その結果、PVS-Studioむンタヌフェむスの次の珟圚の曎新埌のバヌゞョンは完党にWPFに基づいおいるず自信を持っお蚀えたす。 さお、私たちの目暙は、以前のむンタヌフェむスのむテレヌションず同様に、暙準のVisual Studioりィンドりずの関連で「信頌性」を維持するこずでした。 結果は次のずおりです。



図3-曎新されたPVS-Studioむンタヌフェむス出力りィンドりずメむンメニュヌ







図3-曎新されたPVS-Studioむンタヌフェむス出力りィンドりずメむンメニュヌ



メニュヌ項目、アむコン、熊手



叀いPVS-Studioプラグむンアむコンは、理想ずはほど遠い、たたはVisual Studioの暙準の「テヌマ」ずはほど遠いため、それらを眮き換えるこずが決定されたした。 新しいアむコンの䞻な芁件は、単䞀のスタむルぞの適合性ずすべおのVisual Studioカラヌスキヌムに察する優れたコントラストでした。



䞀連のアむコンを決定し、開発を開始したした。 最初に遭遇した問題は、奇劙なこずに、Visual Studioのメむンメニュヌにアむコンを盎接衚瀺するこずでした。 「埅っお、PVS-Studioの最初のバヌゞョンから始めお、このメニュヌにすでにアむコンを衚瀺しおいたす」ず蚀いたす。 実際、これはそうですが、以前に䜿甚した方法は私たちの目的には適しおいたせんでした。 アむコンを蚭定するために、単䞀のVisual Studio拡匵メカニズムを䜿甚しおメニュヌ項目vsctファむルを䜜成したこずを明確にしたす詳现に぀いおは、 こちらをご芧ください 。 このオプションで私たちに合わなかったのは䜕ですか たず第䞀に、アむコンは䞀床だけ蚭定できたす-プラグむンがスタゞオによっおロヌドされたずき。 暙準のスタゞオアむコンの動䜜をシミュレヌトしたかったのです。 遞択したカラヌスキヌムに応じおそれらを再描画したす埌で刀明したように、この芁件は冗長でした-スタゞオはそれ自䜓を行う方法を知っおいたす。 第二に、vsctファむルは、どのようにアむコンの画像でアルファチャネルを䜿甚するかを知らないため、芋た目が非垞に悪くなりたす。



質問が発生したしたメニュヌ項目アむコンの画像をプログラムで蚭定するにはどうすればよいですかこれを行うこずも可胜ですか 長い怜玢の埌、私はこれをうたく行うこずができるサヌドパヌティのVisual Studio拡匵機胜を芋぀けるこずができたした。 その゜ヌスコヌドの調査により、䞊蚘の質問に察する答えを芋぀けるこずができたした。 すべおが非垞にシンプルであるこずが刀明したした。



var commandBars = (CommandBars)DTE.CommandBars; var menuBar = commandBars[menuBarKey]; var pvsBar = menuBar.Controls["PVS-Studio"] as CommandBarPopup; ... cmdBtnControl.Picture = ImageHelper.BitmapToStdPicture(bmp);
      
      





たた、ナヌザヌが必芁な堎合およびその理由は、PVS-Studioのメニュヌ項目の名前を倉曎したい堎合、そのような方法は「壊れる」ずいう懞念がありたした。 しかし、これらの恐怖は無駄でした-commandBarオブゞェクトの内郚名は倉わりたせん。



アむコンの動的衚瀺の問題を解決した埌、アクティブなVisual Studioテヌマから遞択された色でモノクロアむコンを塗り぀ぶすアルゎリズムを実装したした。 プラグむンリ゜ヌスのすべおのアむコンを癜に反転し、画像の各ピクセルの色に必芁な色を掛ける簡単な倉換アルゎリズムを䜜成したした。



 public static void Colorize(ref Bitmap img, Color color) { for (int x = 0; x < img.Width; x++) { for (int y = 0; y < img.Height; y++) { //       //            var pixel = img.GetPixel(x, y); var r = (byte)(((float)pixel.R) * ((float)color.R / 255f)); var g = (byte)(((float)pixel.G) * ((float)color.G / 255f)); var b = (byte)(((float)pixel.B) * ((float)color.B / 255f)); img.SetPixel(x, y, Color.FromArgb(pixel.A, r, g, b)); } } }
      
      





出力では、次の結果が埗られたした。







図4-アむコンの色付けアルゎリズムの操䜜の䟋。










図4-アむコンの色付けアルゎリズムの操䜜の䟋。



しかし、予期しない動䜜が芋぀かりたした-たずえば、Visual Studioデザむンの「赀」テヌマが遞択された堎合、アむコンは正しく衚瀺されたした。 正しく、「ラむト」スキヌムで衚瀺されおいたした。 「暗い」スキヌムでは、アむコンは黒のたたで、予想どおり癜になりたせんでした。 スタゞオ自䜓が、遞択された配色の背景の「明るさ」に応じお画像の特定の色を反転できるこずが刀明したした-アむコンの色付けの以前の実隓は無駄であるこずが刀明したした。 スタゞオはすべおを行っおくれたした。 それにもかかわらず、アルファチャネルの問題のため、䞊蚘のアむコンをプログラムで蚭定する方法を残すこずにしたした。



同様に、PVS-Studioのメッセヌゞ出力りィンドりで、すべおのアむコンずアむコンを同じセットから適切なものに倉曎したした。 ただし、Visual Studioの配色に応じおメニュヌのアむコンの色が自動的に倉曎された堎合、プラグむンりィンドりのアむコンはすべおの配色に察しお元の圢匏のたたになりたす。



図5-Visual Studioの暗い配色でアむコンを衚瀺する際の問題。







図5-Visual Studioの暗い配色でアむコンを衚瀺する際の問題。



Visual Studio SDKを䜿甚しお、アむコンにスタゞオカラヌ化アルゎリズムを適甚できるかどうか疑問に思いたした。 結果は私たちを長く埅たせたせんでした。 数分怜玢した埌、 Microsoft.VisualStudio.PlatformUI名前空間のImageThemingUtilitiesクラスのGetThemedBitmapメ゜ッドに出䌚いたした。 圌は私たちが必芁なこずを正確にやった



図6-暗いVisual Studioテヌマのりィンドりでのアむコンの正しい衚瀺。







図6-暗いVisual Studioテヌマのりィンドりでのアむコンの正しい衚瀺。



アむコンを倉曎するずきに発生した別の問題は、100以倖のDPIでのがかしでした。 これは、すべおのアむコンのサむズが16x16ピクセルだったために発生したした。 最初は64x64アむコンを䜿甚しお、この問題を郚分的に無効にしたした。 この堎合、VisualStudioはそれらを自動的に目的のサむズに圧瞮したした。 しかし、この実斜圢態では、すべおが非垞に滑らかではないこずが刀明した。 珟圚、DPIが100の堎合、わずかにがやけおいたす。 その結果、100以倖のDPIでは最も蚱容できる結果が埗られ、100DPIではがかしが実質的に目立たなかったため、正確に64x64の画像を䜿甚するこずが決定されたした。



たた、DPIが115の堎合、アむコンの右端が数ピクセル分切れおいるこずがわかりたした。 プログラムで数ピクセルを右に远加しようずした画像のサむズが64x68になるように詊みも倱敗したした。 Visual Studioのアむコンは圧瞮されお正方圢のアスペクト比に戻され、トリミングは勝ちたしたが、ブラヌは時々増加したした。 最終的に、各アむコンにいく぀かの空癜ピクセルを远加し、サむズを64x64のたたにしたした。 この゜リュヌションは、最小限のがかしほずんど目に芋えないを提䟛し、アむコンの右偎の割瀌を陀倖したした。



おわりに



䞀芋重芁な倖郚の倉曎にもかかわらず、PVS-Studioの「内郚」むンタヌフェヌスは実際には同じたたでした。 叀いナヌザヌにずっおは新しいむンタヌフェむスが「なじみやすい」たたであり、新しいナヌザヌにずっおはより盎感的で楜しいものになるこずを願っおいたす。 そしおもちろん、それはすべおのナヌザヌの目には「きれい」になりたす。 私たちが䜕ずかしたかどうかはあなたの刀断次第です。





この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいIvan Kishchenko、Paul Eremeev。 PVS-Studioナヌザヌむンタヌフェむスを曎新するずきに盎面した問題 。



蚘事を読んで質問がありたすか
倚くの堎合、蚘事には同じ質問が寄せられたす。 ここで回答を集めたした PVS-Studioバヌゞョン2015に関する蚘事の読者からの質問ぞの回答 。 リストをご芧ください。




All Articles