C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 136 を表示中)
■79932 / )  Re[4]: カラーパレット任意の座標に表示する
□投稿者/ kazu (4回)-(2016/05/30(Mon) 11:43:44)
No79917 (魔界の仮面弁士 さん) に返信
> ■No79910 (kazu さん) に返信

お返事が遅くなり、申し訳ございません。

>>メソッド内でnewしてない場合はdisposeしない方がいいと言うのをしりませんでした。
>
> メソッド内で new したかどうか、と言う話ではなく、
>  「Dispose したオブジェクトは再利用してはいけない」
> ということです。破棄したオブジェクトにアクセスした場合、
> ObjectDisposedException などの例外になりえます。
>
>
> ColorDialog は、Dispsose を処理していないクラスであるため、
> 今回は呼ぼうが呼ぶまいが影響しませんでしたが、もしも相手が
> Form だった場合、Dispose 後のアクセスは御法度です。
>
> var fm = new Form2();
> fm.ShowDialog();
> fm.Dispose();
> fm.ShowDialog(); // 例外
>
>

Disposeのルールをまだよく理解していなかったです。
ご教授ありがとうございます。今後、注意しながらプログラミングして行きます。

> >> ref ではなく out 引数の方が良いと思います。間違いではありませんけれどね。
>>outで書いた場合の書き方も教授していただけると幸いです
> 動作に影響する部分ではないので、変えなくても問題は無いですが、変更するなら
>   [DllImport("user32.dll", CharSet = CharSet.Auto)]
>   private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
> などとします。この場合の RECT は class ではなく struct です。
> 呼び出し側も、ref → out に変更することになります。
>

ご教授ありがとうございます。今、手前のプログラミングを変更して確認してみます。

>
> >>> if (msg == 0x110) 部分でmsg == 0x110がfalseになるため中の処理に入らず、
> >>その場合の msg は何でしたか?
>>この部分のメソッドが呼ばれるたびにmsgの値は変わっているので、これと言ってひとつではなかったです。
>>3桁から4桁の数字が入っていました。
>
> 2 桁もありますよね。
>
> HookProc の処理の冒頭に、if (msg == 0x110) を置いていると思いますが、
> その if の直前に、下記のようなコードを一時的に加えてみてください。
>
>  var m = Message.Create(hWnd, msg, wparam, lparam);
>  System.Diagnostics.Debug.WriteLine(m.ToString());
>
> その上でアプリを起動し、出力ウィンドウを確認してみてください。
>
> 出力ウィンドウが見当たらない場合は、メニューの
> [デバッグ]-[ウィンドウ]-[出力]で表示できます。
>
>
> そうすると恐らくは、
>  msg=0x30 (WM_SETFONT) hwnd=…
>  msg=0x55 (WM_NOTIFYFORMAT) hwnd=…
>    :
> のような記述が延々と表示されると思いますので、その中に、
> msg=0x110 (WM_INITDIALOG) な行があるかどうか探してみてください。

出力にmsg=0x110 (WM_INITDIALOG)のメッセージは存在しました。ただし、PictureBoxをクリックしてカラーパレットの標示ボタンを押すと
msg=0x110 (WM_INITDIALOG)は取得されない状況です。
msg=0x110 (WM_INITDIALOG)が取得されるされない条件等はあるのでしょうか?


返信 編集キー/


管理者用

- Child Tree -