コンピュータや音楽の事書いてます

C#

ImageListにPNG画像を読み込んだら色が変わってしまう

Microsoft OfficeのTaskPaneにUserControlを配置し、そこへ画像ボタンを配置したら、元の画像ファイルよりも明るい色に変わった。 原因は全くわからない。バグでは? 現象はImageListにPNG画像を読み込んだ状態で起こった。ImageListならMouseHoverとかMouse…

SlideShowNextSlide 内でのスライド遷移による無限ループ回避

何らかの理由で一時的にスライド遷移を禁止したいので、遷移したときに瞬時に元にもどす処理。 SlideShowNextSlide 内で、GotoSlide()すると、再びSlideShowNextSlide イベントが発生する為、無限ループしてしまう。 それを回避する為に普通考えるのは、イベ…

ClickOnceでインストールされた場所を実行時に参照したいとき

ビルドアクション: コンテンツ 出力ディレクトリにコピー を指定したファイルをプログラム内で使用したいとき これだと一時的な実行pathなのでコンテンツファイルを参照出来ない var exepath = Assembly.GetEntryAssembly().Location; こっちなら、コンテン…

Microsoft Office ファイルにアドイン用の設定情報を埋め込むまとめ

埋め込む情報の親となるオブジェクトは Powerpointの場合、Presentationと、Slide それぞれの配下にCustomerData がある ExcelではWorkbookの配下にCustomXMLParts, Sheetの配下にCustomProperties がある WordではThisDocumentの配下にCustomXMLPartsがある…

Microsoft Office VSTOアドインのCustomTaskPane の幅調整

VSTOアドインでCustomTaskPane にUserControlを埋め込む際の幅の調整方法。 taskPaneの幅に、UserControlが収まらないのを自動調整はしてくれない。 UserControlの幅はTaskPaneに入れると変化してしまう(なぜだ?)ので苦戦した。色んな値を足したりして試…

CustomerData 内に CustomXMLPart を作成し、スライド上には見えない独自のデータを埋め込む

using Microsoft.Office.Interop.PowerPoint; using Microsoft.Office.Core; Microsoft.Office.Interop.PowerPoint.Application app; CustomXMLPart xml; ユーザがスライドを選択したら、 app.SlideSelectionChanged += App_SlideSelectionChanged; Customer…

リボン _LoadでActiveWindowを取得するとリボンが表示されない

リボンの .cs[デザイン] タブのプロパティ ControlId - ControlIdTypeをCustomにすると発生したトラブル。 public partial class Ribbon1 { DocumentWindow window; private void Ribbon1_Load(object sender, RibbonUIEventArgs e) { //この行を削除すると…

Powerpoint VSTO スライド上のポイント座標と画面全体のピクセル座標の関係

Powerpointスライド上の図形やテキストなどの座標はポイントで表される。黒い余白部分は含まない。 マウスを使ったPowerpointアプリをつくる場合、マウスのカーソル位置は黒い余白部分を含む画面全体のピクセル座標で検知される為、スライド上のオブジェクト…

DrawStringで変な縁取りが勝手についてしまうとき

頼んでもいないのに、黒くて汚い縁取りがつく。 TextRenderingHint を変更したら直った。 private void Form1_Load(object sender, EventArgs e) { //描画先とするImageオブジェクトを作成する Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.H…

Form.Loadイベント内での例外の謎

Loadイベントから呼ばれる処理がうまくいっていない原因をVisual Studioで調査中のこと。 this.Load += new System.EventHandler(this.AAA_Load); private void AAA_Load(object sender, EventArgs e) { Top = Parent.Top + Parent.Height; Top = 〜の行でPa…

2次元配列をLINQ可能に

C#

なるべく少ない手数でダメなソースを改善したいとき、急激にやる気を削がれるのが2次元配列だと思う。 コンストラクタで参照をコピーするので、メモリを2倍消費する事はないはず。(未検証)使用時 var qArray = new Queryable2DimensionalArray<string>(昔の人が作</string>…

Microsoft.Office.Interop.PowerPoint ShapesとPlaceholdersの謎

Shapesをforeachすると、Shape型ではないオブジェクトも出てくる。調べてみると、Type==14なので、Placeholderだということが分かる。Shapesの中にあるのに、これはShapeにCastしようとすると例外がでる。ShapesをLINQしようとして、Castしても例外が出る。O…

ExcelのRangeオブジェクトとstring[,]の相互一括代入

string[,]の大きさは string[,] table = new string[Rowの数, Columnの数]; string[,]からRangeは素直に。 sheet.get_Range("a:b").Value = table; Rangeからstring[,]の場合は、Rangeがdynamic型の為、as演算子?で変換する。 string[,] table = sheet.get_…

Xamarin でJavaライブラリを使う際のエラー:「アクセシビリティに一貫性がありません。 '(クラス名)' のアクセシビリティは (フィールド名やメソッド名) よりも低く設定されています。 」

Xamarinとは、C#でAndroidアプリを開発出来るという画期的な開発環境。 で、Javaで作られたライブラリをXamarinのC#から使うには、Java Bindings Libraryという project templateを使って、ラッパーdllを作る必要がある。Java Bindings Libraryテンプレート…

Officeリボン上でのIMEの状態制御

通常の.Netのtextboxなどには、ImeModeプロパティがあるので、簡単にIMEのON・OFFが出来るが、Officeのリボンのメニューに置いたeditBox(Microsoft.Office.Tools.Ribbon.RibbonEditBox)にはそれが無く、IMEを毎回手動でOFFにしなければならない。 Imm32.dll…

メモ C#ではC++式のRAIIが使えない

C#

RAIIとは、メモリ開放やファイルCloseやポートのCloseなど、書き忘れるとヤバイcodeを、スコープから抜ける時に自動的にやってくれる仕組み。これがC#では無くなっている。なぜ??! 代わりにIDisposableインターフェイスなclassを作って、using文を使う。…

Select して、ToListして、ForEach

private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; new List<int> { 1, 2, 3, 4, 5 } .Select(x => (x * 2).ToString()) .ToList() .ForEach(x => textBox1.Text += x + ","); }</int>

メモ: LINQは便利

using System.Linq; using PowerPoint = Microsoft.Office.Interop.PowerPoint; PowerPoint.Presentation pres = /* 何かのパワポのファイル */; pres.Windows.OfType<PowerPoint.DocumentWindow>() .Where(w => w.ViewType == PowerPoint.PpViewType.ppViewNormal) .ElementAt(0).Panes</powerpoint.documentwindow>…

PowerPointにはScreenUpdatingがない

Excelで重い描画処理をする場合、ScreenUpdatingプロパティを使えば高速化出来る。しかし、PowerPointにはこのプロパティが無い為困る。 この様にしたら速くなった。 準備 using PPT = Microsoft.Office.Interop.PowerPoint; using System.Runtime.InteropSe…