回答編集履歴
2
修正
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
追記
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
|
+
|