質問するログイン新規登録

回答編集履歴

2

修正

2017/01/09 10:18

投稿

sharow
sharow

スコア1151

answer CHANGED
@@ -28,6 +28,8 @@
28
28
  hOldB = SelectObject(hdc, hBrush); // << hBrushをもう一回Selectしている
29
29
  DeleteObject(hBrush); // << Select中のhBrushがDeleteされている
30
30
  EndPaint(hwnd,&ps);
31
+ ...
32
+ break;
31
33
  ```
32
34
 
33
35
  [SelectObject 関数](https://msdn.microsoft.com/ja-jp/library/cc410576.aspx)より、

1

追記

2017/01/09 10:17

投稿

sharow
sharow

スコア1151

answer CHANGED
@@ -2,6 +2,7 @@
2
2
  普通は最初のSelectObjectの戻り値で古い方を保持します。
3
3
 
4
4
  ```c
5
+ (1)
5
6
  hdc = BeginPaint(hwnd, &ps);
6
7
  hBrush = CreateSolidBrush(RGB(0,0,0));
7
8
  hOld = SelectObject(hdc, hBrush);
@@ -13,4 +14,23 @@
13
14
  return 0;
14
15
  ```
15
16
 
16
- WM_PAINT(に限らないが..)ではbreakせずにreturn 0したほうがよいと思います。breakした先がDefWindowProc()だと良からぬことが起こっても不思議ではありません。EndPaintされた時点で要更新リージョンは無くなったのでDefWindowProcはWM_PAINTがきても何もしないと期待するのもある意味自然ですが、ちらついているのはBeginPaint()しているのにDefWindowProc()が背景色で上書きしている、と推測することもできます。
17
+ WM_PAINT(に限らないが..)ではbreakせずにreturn 0したほうがよいと思います。breakした先がDefWindowProc()だと良からぬことが起こっても不思議ではありません。EndPaintされた時点で要更新リージョンは無くなったのでDefWindowProcはWM_PAINTがきても何もしないと期待するのもある意味自然ですが、ちらついているのはBeginPaint()しているのにDefWindowProc()が背景色で上書きしている、と推測することもできます。
18
+
19
+
20
+ ----追記
21
+ あまり説明することはありません。元の(質問者さんの)コードはこれです。
22
+ ```c
23
+ (2)
24
+ hdc = BeginPaint(hwnd, &ps);
25
+ hBrush = CreateSolidBrush(RGB(0,0,0));
26
+ SelectObject(hdc, hBrush); // hBrushをSelectしている
27
+ Rectangle(hdc, 0, 0, 17, 30);
28
+ hOldB = SelectObject(hdc, hBrush); // << hBrushをもう一回Selectしている
29
+ DeleteObject(hBrush); // << Select中のhBrushがDeleteされている
30
+ EndPaint(hwnd,&ps);
31
+ ```
32
+
33
+ [SelectObject 関数](https://msdn.microsoft.com/ja-jp/library/cc410576.aspx)より、
34
+ > アプリケーションは新しいオブジェクトを使い終えたら、必ず元の(既定)オブジェクトに置き換えるべきです。
35
+
36
+ ので、Deleteしてしまうのもマズいですが、hBrushをSelectしたままのもマズいです。私のコード片(1)では、最初のSelectObjectの戻り値を保持し、最後にそれに戻しています。APIの仕様(ドキュメント)を読めばこうなるというだけで、それ以上説明のしようがありません。