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

質問編集履歴

2

コードの要約

2020/12/17 11:15

投稿

tettyA
tettyA

スコア93

title CHANGED
File without changes
body CHANGED
@@ -27,8 +27,7 @@
27
27
  switch (msg)
28
28
  {
29
29
  case WM_DESTROY:
30
- DeleteObject(hBitmap);
31
- PostQuitMessage(0);
30
+ ...
32
31
  return 0;
33
32
  case WM_CREATE:
34
33
  InitCommonControls();
@@ -47,69 +46,11 @@
47
46
  300, 300,
48
47
  hClientWindow, hIns, 0
49
48
  );
50
- hChildWndTil = CreateMDIWindow(MDI_CHILD, TEXT("タイル"), WS_OVERLAPPEDWINDOW,
51
- 0, 300,
52
- 300, 300,
53
- hClientWindow, hIns, 0
54
- );
55
49
  }
56
-
57
-
58
-
59
-
60
- hBitmap = LoadBitmap(
61
- ((LPCREATESTRUCT)lp)->hInstance,
62
- TEXT("IDB_BITMAP2")
63
- );
64
- hToolbar = CreateToolbarEx(
65
- hWnd,
66
- WS_CHILD | WS_VISIBLE,
67
- IDR_TOOLBAR1,
68
- 10,
50
+ ...
69
- NULL,
70
- (UINT_PTR)hBitmap,
71
- tbs,
72
- 18,
73
- 0, 0,
74
- 16, 16,
75
- sizeof(TBBUTTON)
76
- );
77
- hStatus = CreateWindowEx(
78
- NULL,
79
- STATUSCLASSNAME,
80
- NULL,
81
- WS_CHILD
82
- | SBARS_SIZEGRIP
83
- | CCS_BOTTOM
84
- | WS_VISIBLE,
85
- 0, 0, 0, 0,
86
- hWnd,
87
- (HMENU)ID_STATUS,
88
- ((LPCREATESTRUCT)lp)->hInstance,
89
- NULL
90
- );
91
51
  return 0;
92
52
  case WM_SIZE:
93
- int wx, wy, sx, sy;
94
- RECT rc;
53
+ ...
95
- GetWindowRect(hToolbar, &rc);
96
- SendMessage(hToolbar, WM_SIZE, wp, lp);
97
- SendMessage(hStatus, msg, wp, lp);
98
- SbSize[0] = LOWORD(lp) - 400;
99
- SbSize[1] = -1;
100
- SendMessage(hStatus, SB_SETPARTS, 2, (LPARAM)SbSize);
101
- //文字を挿入
102
- SendMessage(hStatus, SB_SETTEXT, 0 | 1, (WPARAM)TEXT("マップのサイズ:100x40 グリッドのサイズ:16x16"));
103
- SendMessage(hStatus, SB_SETTEXT, 0 | 0, (WPARAM)TEXT("X:0 Y:0 種類:0 横幅:16 高さ:16"));
104
- SendMessage(hStatus, WM_SIZE, wp, lp);
105
-
106
- GetWindowRect(hStatus, &rc);
107
- sx = rc.right - rc.left;
108
- sy = rc.bottom - rc.top;
109
- wx = LOWORD(lp);
110
- wy = HIWORD(lp);
111
- wy -= sy;
112
- MoveWindow(hClientWindow, 0, 30, wx, wy-30, TRUE);
113
54
  return 0;
114
55
  case WM_PAINT:
115
56
 
@@ -125,7 +66,7 @@
125
66
  CheckMenuItem(GetMenu(hWnd), IDM_NEWMINIMAP, MFS_UNCHECKED);
126
67
  }
127
68
  else {//ついていない
128
- hCHildWndMap = CreateMDIWindow(MDI_CHILD, TEXT("ミニマップ"), 0,
69
+ hCHildWndMap = CreateMDIWindow(MDI_CHILD, TEXT("マップ"), 0,
129
70
  0, 0,
130
71
  300, 300,
131
72
  hClientWindow, hIns, 0

1

コードの追加

2020/12/17 11:15

投稿

tettyA
tettyA

スコア93

title CHANGED
File without changes
body CHANGED
@@ -1,2 +1,168 @@
1
1
  二つ以上のMDI子ウィンドウから成るMDIアプリケーションに於いて、利用者が自らの手でそのウィンドウを削除したときに、どのMDI子ウィンドウが削除されたかを知る術はありますか。
2
- もしあったら、その方法も教えてださい。
2
+ もしあったら、その方法も教えてださい。
3
+
4
+ ```C++
5
+ #include <windows.h>
6
+ #include <commctrl.h>
7
+
8
+ #include "resource.h"
9
+ #include "common.h"
10
+
11
+ #pragma comment(lib,"comctl32.lib")
12
+
13
+ #define TITLE TEXT("MDI")
14
+ #define MDI_FRAME TEXT("FRAMEWINDOW")
15
+ #define MDI_CHILD TEXT("MDICHILD")
16
+
17
+ HINSTANCE hIns;//現在のインターフェース
18
+ HWND hCHildWndMap;
19
+ HWND hChildWndTil;
20
+ HWND hToolWnd;
21
+ #define ID_CHILDWND 0x100
22
+ LRESULT CALLBACK FrameProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
23
+ static HWND hToolbar;
24
+ static HBITMAP hBitmap;
25
+ CLIENTCREATESTRUCT ccsClient;
26
+ static HWND hClientWindow;
27
+ switch (msg)
28
+ {
29
+ case WM_DESTROY:
30
+ DeleteObject(hBitmap);
31
+ PostQuitMessage(0);
32
+ return 0;
33
+ case WM_CREATE:
34
+ InitCommonControls();
35
+ ccsClient.idFirstChild = ID_CHILDWND;
36
+
37
+ hClientWindow = CreateWindow(TEXT("MDICLIENT"), NULL,
38
+ WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | WS_CLIPSIBLINGS,
39
+ 0, 0, 0, 0, hWnd, (HMENU)1, ((LPCREATESTRUCT)lp)->hInstance, &ccsClient
40
+ );
41
+ {
42
+ RECT wndrct;
43
+ GetWindowRect(hWnd, &wndrct);
44
+
45
+ hCHildWndMap = CreateMDIWindow(MDI_CHILD, TEXT("マップ"), 0,
46
+ 0, 0,
47
+ 300, 300,
48
+ hClientWindow, hIns, 0
49
+ );
50
+ hChildWndTil = CreateMDIWindow(MDI_CHILD, TEXT("タイル"), WS_OVERLAPPEDWINDOW,
51
+ 0, 300,
52
+ 300, 300,
53
+ hClientWindow, hIns, 0
54
+ );
55
+ }
56
+
57
+
58
+
59
+
60
+ hBitmap = LoadBitmap(
61
+ ((LPCREATESTRUCT)lp)->hInstance,
62
+ TEXT("IDB_BITMAP2")
63
+ );
64
+ hToolbar = CreateToolbarEx(
65
+ hWnd,
66
+ WS_CHILD | WS_VISIBLE,
67
+ IDR_TOOLBAR1,
68
+ 10,
69
+ NULL,
70
+ (UINT_PTR)hBitmap,
71
+ tbs,
72
+ 18,
73
+ 0, 0,
74
+ 16, 16,
75
+ sizeof(TBBUTTON)
76
+ );
77
+ hStatus = CreateWindowEx(
78
+ NULL,
79
+ STATUSCLASSNAME,
80
+ NULL,
81
+ WS_CHILD
82
+ | SBARS_SIZEGRIP
83
+ | CCS_BOTTOM
84
+ | WS_VISIBLE,
85
+ 0, 0, 0, 0,
86
+ hWnd,
87
+ (HMENU)ID_STATUS,
88
+ ((LPCREATESTRUCT)lp)->hInstance,
89
+ NULL
90
+ );
91
+ return 0;
92
+ case WM_SIZE:
93
+ int wx, wy, sx, sy;
94
+ RECT rc;
95
+ GetWindowRect(hToolbar, &rc);
96
+ SendMessage(hToolbar, WM_SIZE, wp, lp);
97
+ SendMessage(hStatus, msg, wp, lp);
98
+ SbSize[0] = LOWORD(lp) - 400;
99
+ SbSize[1] = -1;
100
+ SendMessage(hStatus, SB_SETPARTS, 2, (LPARAM)SbSize);
101
+ //文字を挿入
102
+ SendMessage(hStatus, SB_SETTEXT, 0 | 1, (WPARAM)TEXT("マップのサイズ:100x40 グリッドのサイズ:16x16"));
103
+ SendMessage(hStatus, SB_SETTEXT, 0 | 0, (WPARAM)TEXT("X:0 Y:0 種類:0 横幅:16 高さ:16"));
104
+ SendMessage(hStatus, WM_SIZE, wp, lp);
105
+
106
+ GetWindowRect(hStatus, &rc);
107
+ sx = rc.right - rc.left;
108
+ sy = rc.bottom - rc.top;
109
+ wx = LOWORD(lp);
110
+ wy = HIWORD(lp);
111
+ wy -= sy;
112
+ MoveWindow(hClientWindow, 0, 30, wx, wy-30, TRUE);
113
+ return 0;
114
+ case WM_PAINT:
115
+
116
+ break;
117
+ case WM_COMMAND:
118
+
119
+ switch (LOWORD(wp))
120
+ {
121
+ case IDM_NEWMINIMAP:
122
+ //チェックがついている
123
+ if (GetMenuState(GetMenu(hWnd), IDM_NEWMINIMAP, MF_BYCOMMAND) & MFS_CHECKED) {
124
+ SendMessage(hClientWindow, WM_MDIDESTROY, (WPARAM)hCHildWndMap, 0);
125
+ CheckMenuItem(GetMenu(hWnd), IDM_NEWMINIMAP, MFS_UNCHECKED);
126
+ }
127
+ else {//ついていない
128
+ hCHildWndMap = CreateMDIWindow(MDI_CHILD, TEXT("ミニマップ"), 0,
129
+ 0, 0,
130
+ 300, 300,
131
+ hClientWindow, hIns, 0
132
+ );
133
+ CheckMenuItem(GetMenu(hWnd), IDM_NEWMINIMAP, MFS_CHECKED);
134
+ }
135
+ break;
136
+ }
137
+ }
138
+ return DefFrameProc(hWnd, hClientWindow, msg, wp, lp);
139
+ }
140
+ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
141
+ PSTR lpCmdLine, int nCmdShow) {
142
+ HWND hWnd;
143
+ MSG msg;
144
+ WNDCLASS winc;
145
+ hIns = hInstance;
146
+
147
+ ...
148
+
149
+ winc.lpfnWndProc = DefMDIChildProc;
150
+ winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
151
+ winc.lpszClassName = MDI_CHILD;
152
+
153
+
154
+ if (!RegisterClass(&winc)) return 1;
155
+
156
+ hWnd = CreateWindow(
157
+ MDI_FRAME, TITLE,
158
+ WS_OVERLAPPEDWINDOW|WS_MAXIMIZE|WS_VISIBLE|WS_CLIPCHILDREN,
159
+ CW_USEDEFAULT, CW_USEDEFAULT,
160
+ CW_USEDEFAULT, CW_USEDEFAULT,
161
+ NULL, NULL, hInstance, NULL
162
+ );
163
+
164
+ ...
165
+
166
+ return msg.wParam;
167
+ }
168
+ ```