午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

Owner指定するタイミング、別WindowとMainWindowとの連携、カラーピッカーを追加してパレットの色変更

 
カラーピッカーを追加してパレットの色を変更できるようにした。
ダウンロード先
別のWindowとMainWindowとの連携する場合に、Ownerの指定するタイミングを間違えて、めんどくさいことになったはなし
 
パレットを使った減色で誤差拡散 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15432449.html
これに
 
カラーピッカーのdll(ライブラリ)作った、WPFユーザーコントロール ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15447603.html
これを追加して
パレットの色を変更できるようにした
 
イメージ 1
パレットの色をクリックするとカラーピッカーのウィンドウが開く
色を選んでSetボタンを押すとパレットの色が変更される
 
イメージ 2
元の画像
 
4色減色
イメージ 3
辺中央パレットで減色
茶色より赤がほしい
 
イメージ 4
茶色を赤に変更
 
イメージ 5
変更したパレットで減色
赤が入った
 
 
RGBの3色だと
イメージ 6
これは違うw
 
RGB+白黒の5色
イメージ 8
これはきれいにできた!
白黒が入ると全然違うなあ
 
 
YCMの3色
イメージ 7
これはこれできれいだなあ
 
YCM+白黒の5色
イメージ 9
おお、これもきれいにできた
RGB+白黒にそっくり、こうなるんだなあ
 
 
イメージ 10
 
イメージ 11
RGBYCMの6色
白黒なくても頑張っているけど
やっぱり白黒は重要だねえ
 
 
イメージ 12
白黒
 
イメージ 13
黄色と青
 
 
カラーピッカーはプロジェクトにWindowを追加したところに作った

f:id:gogowaten:20191212144207p:plain

こうして追加したWindowに名前は
Window1ColorPickerにした
 

f:id:gogowaten:20191212144219p:plain

ColorPickerコントロールとSetとCancelボタンの2つを追加した。
 
これをMainWindowのパレットの色を左クリックイベントで表示するようにしたいから、準備として

f:id:gogowaten:20191212144231p:plain

35行目、MainWindowのフィールドにWindow1ColorPickerを入れておくColorPickerWindowを作っておいて
 
アプリ起動時に
イメージ 17
79行目、Window1ColorPickerを作成してColorPickerWindowに入れておいて
アプリ起動完了時(Loaded)に
イメージ 18
126行目、ColorPickerWindowのオーナーにthis(MainWindow)を指定
 
 
パレットの色をクリックでカラーピッカー表示

f:id:gogowaten:20191212144243p:plain

138行目、Showメソッドで表示
 
Window1ColorPicker(カラーピッカーWindow)

f:id:gogowaten:20191212144253p:plain

これで全部
36行目、Setボタンのクリック時にMainWindowに色を送っている
ここで自身(this)のオーナー(MainWindow)を取得して、中のSetColorメソッドを使って色を送っている(37行目)
このためにオーナー指定が必要だった
その他はキャンセルボタンとウィンドウの閉じるボタンが押されたときは、実際には閉じないで非表示にする処理
 
 
 
ここまでの失敗例、難しかったところは
ColorPickerWindowのOwnerにMainWindow指定するタイミング
 
イメージ 20
80行目、カラーピッカーWindowのオーナーにMainWindowを指定
 

f:id:gogowaten:20191212144307p:plain

なんかエラーが出て起動できない
たぶんアプリの起動中ってことはMainWindowも作っている最中で
まだ存在していないから存在していないものを指定することはできない
ってことなのかも
 
それならカラーピッカーWindowを開く直前ならどうかなと
イメージ 22
138行目、カラーピッカーWindowを開く直前に指定した場合
 
イメージ 24
普通に起動して動いていて
タスクマネージャーでも確認できる
アプリを終了すると
 
イメージ 25
タスクマネージャーのプロセスタブから消える、まだ正常
けど詳細タブを見ると
 
イメージ 26
残っている!終了できていない
なので起動と終了を繰り返すと
見た目は終了しているのに
 
イメージ 27
実際には終了していないみたいで
起動回数分増えて無駄にメモリを消費するし
実行中だから新たにビルドもできなくなって
それでこの状態に気づいた
これを終了させるにはここで項目を右クリックメニューからタスクの終了で
イメージ 29
プロセスの終了で終了できる
システムが不安定になる可能性とか言われているけど
起動しているから不安定になっているんだよなあ
自分のせいなんだけど…
 
 
ビルドエラーの例
イメージ 28
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー ファイル "obj\Release\20180410_減色パレットとカラーピッカー.exe" を "bin\Release\20180410_減色パレットとカラーピッカー.exe" にコピーできません。別のプロセスで使用されているため、プロセスはファイル 'bin\Release\20180410_減色パレットとカラーピッカー.exe' にアクセスできません。 20180410_減色パレットとカラーピッカー
 
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー "obj\Release\20180410_減色パレットとカラーピッカー.exe" を "bin\Release\20180410_減色パレットとカラーピッカー.exe" にコピーできませんでした。10 回の再試行回数を超えたため、失敗しました。このファイルは "20180410_減色パレットとカラーピッカー (6252), 20180410_減色パレットとカラーピッカー (7644), 20180410_減色パレットとカラーピッカー (11200), 20180410_減色パレットとカラーピッカー (2068)" によってロックされています。 20180410_減色パレットとカラーピッカー
こんなふうに別のプロセスで使用されているって出るけど、タスクマネージャーのプロセスタブでは確認できないから、なかなか気づけなかった
 
要は
別のWindowとMainWindowとの連携する場合にOwnerの指定するときは
アプリ起動完了直後が良さそう、MainWindowのLoadedイベントが適当。
 
 
 
コード
 
アプリダウンロード先(ヤフーボックス)
20180226forMyBlog/20180410_減色パレットとカラーピッカー at master · gogowaten/20180226forMyBlog