プログラムとかデジタル系趣味とか

趣味の開発の協力者

今、XnViewや古のViXのような画像ビューアーを作ろうとちまちま開発しています。
ViXはもうだめだし、XnViewは仕事に使えない(商用非フリー)。

同じ考えのような人がいたら一緒にできればいいのにっていう思いと、
今の状態ではオープンにできない、思ってた感じと変わったら嫌だな、なども思ったりする。
そもそも、どこでそんな人みつけるのかという問題もある。

まあとりあえず一人でちまちまやっていようか。

マウス右ボタンドラッグ&ドロップ時コンテキストメニューを求めて

IContextMenu::QueryContextMenu (shobjidl_core.h) - Win32 apps | Microsoft Learn
SHCreateDefaultContextMenu 関数 (shlobj_core.h) - Win32 apps | Microsoft Learn
この2つを中心に色々と調査、試行錯誤、Github Copilot Proと会話しましたけどね。
いや~、だめだね。

対象のフォルダ自体、またはドラッグ元ファイルのシェルコンテキストメニューかしかでない。

まぁ、どうせフォルダ対象時に「ここにコピー」「ここに移動」「ショートカットをここに作成」(セパレータ)「キャンセル」。
アプリケーション対象時に「プログラムから開く」(セパレータ)「キャンセル」
さえあればいいだろう。

エクスプローラー上でやれば7zipとCRC SHAってメニューあるけど。
でもせめてこの項目名取れないかな……。一応リソースを英語と日本語にしてるから、日本語固定なのはよろしくないし、ここだけ固定名のバレるのもなんだかなあ。
オープンソースC++で書かれたファイラでこのあたりやってるやつないかなあ……。

任意パスの集合からのIShellItemListはITEMIDLIST経由しないとできない?

任意のファイルパスの配列からIShellItemArrayを作成したかった。
無事、IShellItemArrayができたのはいいけど、ITEMIDLISTを経由しない方法だと最後の最後にコケる。
なんとかIShellItemの集まりからの作成にできないだろうか。。

Formデザイナがクラッシュする問題のほかでは見つからなかった原因

Visual StudioWindows Formsアプリを開発時、Formデザイナが様々な原因でクラッシュすることがこれまでもあった。

かつてはそもそもVisual Studioが32bitの時代(2019までか?)はx64だと駄目だったり。
そもそもVisual Studioの細かいバージョンのバグが原因だったり。

今回はそういう原因ではなかった。

リソースファイルに言語リソースが付随するとき。
つまり。
Resource.resxに対してResource.ja-JP.resxなどがあるとき。
リソース(アイコン)のja-JPの方を空っぽのままにしていたのが悪かったらしい。

でもそのアイコンフォームで使ってないんだけどなあ……。

あと、もうちょっと、具体的なエラー示してくれてもいいと思うんだよね。
object instance がnullとか、依存関係が0?とかそんなログ表示ではわからん。

なんにせよ治ってよかった。
同じ失敗をしてしまった方の目に止まりますように。

.Net Windows.Forms ListView利用メモ

自分用メモ

OwnerDraw時に項目単位で通常描画を行う

これでいい。

e.DrawDefault = true;
base.OnDrawItem(e);
OwnerDraw+Details時はカラムヘッダとサブアイテムに注意

こいつらもOwnerDrawになる。
通常で良ければそれぞれのOwnerDraw Eventを上記の方法で処理する。

//列ヘッダ
protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
    e.DrawDefault = true;
    base.OnDrawColumnHeader(e);
}
//サブアイテム
protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
    e.DrawDefault = true;
    base.OnDrawColumnHeader(e);
}