回答編集履歴

2

修正

2017/01/09 10:18

投稿

sharow
sharow

スコア1149

test CHANGED
@@ -58,6 +58,10 @@
58
58
 
59
59
  EndPaint(hwnd,&ps);
60
60
 
61
+ ...
62
+
63
+ break;
64
+
61
65
  ```
62
66
 
63
67
 

1

追記

2017/01/09 10:17

投稿

sharow
sharow

スコア1149

test CHANGED
@@ -5,6 +5,8 @@
5
5
 
6
6
 
7
7
  ```c
8
+
9
+ (1)
8
10
 
9
11
  hdc = BeginPaint(hwnd, &ps);
10
12
 
@@ -29,3 +31,43 @@
29
31
 
30
32
 
31
33
  WM_PAINT(に限らないが..)ではbreakせずにreturn 0したほうがよいと思います。breakした先がDefWindowProc()だと良からぬことが起こっても不思議ではありません。EndPaintされた時点で要更新リージョンは無くなったのでDefWindowProcはWM_PAINTがきても何もしないと期待するのもある意味自然ですが、ちらついているのはBeginPaint()しているのにDefWindowProc()が背景色で上書きしている、と推測することもできます。
34
+
35
+
36
+
37
+
38
+
39
+ ----追記
40
+
41
+ あまり説明することはありません。元の(質問者さんの)コードはこれです。
42
+
43
+ ```c
44
+
45
+ (2)
46
+
47
+ hdc = BeginPaint(hwnd, &ps);
48
+
49
+ hBrush = CreateSolidBrush(RGB(0,0,0));
50
+
51
+ SelectObject(hdc, hBrush); // hBrushをSelectしている
52
+
53
+ Rectangle(hdc, 0, 0, 17, 30);
54
+
55
+ hOldB = SelectObject(hdc, hBrush); // << hBrushをもう一回Selectしている
56
+
57
+ DeleteObject(hBrush); // << Select中のhBrushがDeleteされている
58
+
59
+ EndPaint(hwnd,&ps);
60
+
61
+ ```
62
+
63
+
64
+
65
+ [SelectObject 関数](https://msdn.microsoft.com/ja-jp/library/cc410576.aspx)より、
66
+
67
+ > アプリケーションは新しいオブジェクトを使い終えたら、必ず元の(既定)オブジェクトに置き換えるべきです。
68
+
69
+
70
+
71
+ ので、Deleteしてしまうのもマズいですが、hBrushをSelectしたままのもマズいです。私のコード片(1)では、最初のSelectObjectの戻り値を保持し、最後にそれに戻しています。APIの仕様(ドキュメント)を読めばこうなるというだけで、それ以上説明のしようがありません。
72
+
73
+