■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)が取得されるされない条件等はあるのでしょうか?
|
|