質問編集履歴

2

セクションの修正

2019/04/29 08:37

投稿

Weapon
Weapon

スコア106

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- ### 追記のコード
13
+ ### コード(修正して追記)
14
14
 
15
15
  指摘をもとに修正
16
16
 

1

修正と追記

2019/04/29 08:37

投稿

Weapon
Weapon

スコア106

test CHANGED
File without changes
test CHANGED
@@ -4,9 +4,17 @@
4
4
 
5
5
 
6
6
 
7
+ ###追記
8
+
9
+ 指摘をもとに多少の修正と引数の変更を行いましたが上手くいきません.一応動作するサンプルも追記しましたがスクリーンDCを使用しなくても動いてしまうらしいので気をつけます.しかし動作するサンプルの`UpdateLayeredWindow func.`の第四引数のウィンドウの座標を変更したりNULLにしたりすると表示がされない上タスクバーにアイコンができないなど挙動が理解できません.
10
+
11
+
12
+
7
- ### 該当のコード
13
+ ### 追記のコード
14
+
8
-
15
+ 指摘をもとに修正
16
+
9
- 80行目付近の`UpdateLayeredWindow func.`
17
+ `UpdateLayeredWindow func.`は130行目付近
10
18
 
11
19
  ```C
12
20
 
@@ -100,7 +108,7 @@
100
108
 
101
109
  LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
102
110
 
103
- static RECT wrc;
111
+ static RECT crc;
104
112
 
105
113
  static int iWidth = 0;
106
114
 
@@ -122,6 +130,10 @@
122
130
 
123
131
 
124
132
 
133
+ static SIZE wsz = { 0 };
134
+
135
+ static POINT pt = { 0 };
136
+
125
137
 
126
138
 
127
139
  switch (uMsg) {
@@ -140,7 +152,7 @@
140
152
 
141
153
  hbufdc = CreateCompatibleDC(hmdc);
142
154
 
143
- ReleaseDC(hwnd, hmdc);
155
+ ReleaseDC(0, hmdc);
144
156
 
145
157
  }
146
158
 
@@ -152,132 +164,514 @@
152
164
 
153
165
  {
154
166
 
155
- SelectObject(hbufdc, hbmp);
156
-
157
-
158
-
159
167
  PAINTSTRUCT ps = {};
160
168
 
161
169
  HDC hdc = BeginPaint(hwnd, &ps);
162
170
 
163
171
 
164
172
 
165
- if (BitBlt(hdc, 0, 0, iWidth, iHeight, hbufdc, 0, 0, SRCCOPY) == FALSE)MessageBox(hwnd, L"BitBlt ERROR", L"WM_PAINT ERROR", MB_OK);
173
+ if (BitBlt(hdc, 0, 0, iWidth, iHeight, hbufdc, 0, 0, SRCCOPY | CAPTUREBLT) == FALSE)MessageBox(hwnd, L"BitBlt ERROR", L"WM_PAINT ERROR", MB_OK);
174
+
166
-
175
+ SetBkMode(hdc, TRANSPARENT);
176
+
177
+
178
+
167
-
179
+ EndPaint(hwnd, &ps);
180
+
168
-
181
+ }
182
+
183
+ break;
184
+
185
+
186
+
187
+ case WM_SIZE:
188
+
189
+ {
190
+
191
+ GetClientRect(hwnd, &crc);
192
+
193
+ int crWidth = crc.right - crc.left;
194
+
195
+ int crHeight = crc.bottom - crc.top;
196
+
197
+ if ((crWidth != iWidth) || (crHeight != iHeight)) {
198
+
199
+ iWidth = crWidth;
200
+
201
+ iHeight = crHeight;
202
+
203
+
204
+
205
+ wsz.cx = crWidth;
206
+
207
+ wsz.cy = crHeight;
208
+
209
+
210
+
211
+ /* Create BITMAP */
212
+
213
+ if (hbmp != NULL)DeleteObject(hbmp);
214
+
215
+
216
+
217
+ void* pv;
218
+
219
+ BITMAPINFO bmi = {
220
+
221
+ sizeof(BITMAPINFOHEADER), iWidth, iHeight, 1, 32, BI_RGB, 0, 0, 0, 0, 0, 0
222
+
223
+ };
224
+
225
+
226
+
227
+ hbmp = CreateDIBSection(hbufdc, &bmi, DIB_RGB_COLORS, &pv, NULL, 0);
228
+
229
+
230
+
231
+ if (hbmp == NULL) {
232
+
233
+ if (iWidth != 0 && iHeight != 0) {
234
+
235
+ MessageBox(hwnd, L"CreateDIBSection ERROR", L"WM_SIZE ERROR", MB_OK);
236
+
237
+ }
238
+
239
+ break;
240
+
241
+ }
242
+
243
+
244
+
245
+ DWORD* lpdw = (DWORD*)pv;
246
+
247
+ int mdsize = iWidth * iHeight;
248
+
249
+ for (int i = 0; i < mdsize; i++)lpdw[i] = 0x7fff00ff;
250
+
251
+
252
+
253
+ SelectObject(hbufdc, hbmp);
254
+
255
+ /* END Create BITMAP */
256
+
257
+
258
+
259
+ /* TRANSPARENT Process */
260
+
261
+ RECT wrc;
262
+
263
+ GetWindowRect(hwnd, &wrc);
264
+
265
+ pt.x = wrc.left;
266
+
267
+ pt.y = wrc.top;
268
+
269
+
270
+
271
+ HDC sdc = GetDC(NULL);
272
+
169
- if (UpdateLayeredWindow(hwnd, hdc, NULL, NULL, hbufdc, NULL, 0, &bf, ULW_ALPHA) == FALSE) {
273
+ if (UpdateLayeredWindow(hwnd, sdc, NULL, &wsz, hbufdc, &pt, 0, &bf, ULW_ALPHA) == FALSE) {
170
-
274
+
171
- MessageBox(hwnd, L"Update ERROR", L"WM_PAINT ERROR", MB_OK);
275
+ MessageBox(hwnd, L"Update ERROR", L"WM_SIZE ERROR", MB_OK);
276
+
277
+ DestroyWindow(hwnd);
278
+
279
+ }
280
+
281
+ ReleaseDC(0, sdc);
282
+
283
+ /* END TRANSPARENT Process */
284
+
285
+ InvalidateRect(hwnd, NULL, FALSE);
172
286
 
173
287
  }
174
288
 
175
-
176
-
177
- EndPaint(hwnd, &ps);
178
-
179
289
  }
180
290
 
181
291
  break;
182
292
 
183
293
 
184
294
 
185
- case WM_SIZE:
186
-
187
- {
188
-
189
- GetClientRect(hwnd, &wrc);
190
-
191
- int crWidth = wrc.right - wrc.left;
192
-
193
- int crHeight = wrc.bottom - wrc.top;
194
-
195
- if ((crWidth != iWidth) || (crHeight != iHeight)) {
196
-
197
- iWidth = crWidth;
198
-
199
- iHeight = crHeight;
200
-
201
-
202
-
203
- if (hbmp != NULL)DeleteObject(hbmp);
204
-
205
-
206
-
207
- void* pv;
208
-
209
- BITMAPINFO bmi = {
210
-
211
- sizeof(BITMAPINFOHEADER), iWidth, iHeight, 1, 32, BI_RGB, 0, 0, 0, 0, 0, 0
212
-
213
- };
214
-
215
-
216
-
217
- hbmp = CreateDIBSection(hbufdc, &bmi, DIB_RGB_COLORS, &pv, NULL, 0);
218
-
219
-
220
-
221
- if (hbmp == NULL) {
222
-
223
- if (iWidth != 0 && iHeight != 0) {
224
-
225
- MessageBox(hwnd, L"CreateDIBSection ERROR", L"WM_SIZE ERROR", MB_OK);
226
-
227
- }
228
-
229
- break;
230
-
231
- }
232
-
233
-
234
-
235
- DWORD* lpdw = (DWORD*)pv;
236
-
237
- int mdsize = iWidth * iHeight;
238
-
239
- for (int i = 0; i < mdsize; i++)lpdw[i] = 0x7fff00ff;
240
-
241
-
242
-
243
- InvalidateRect(hwnd, NULL, FALSE);
295
+ case WM_DESTROY:
296
+
297
+ DeleteDC(hbufdc);
298
+
299
+ DeleteObject(hbmp);
300
+
301
+ PostQuitMessage(0);
302
+
303
+ return 0;
304
+
305
+ }
306
+
307
+
308
+
309
+ return DefWindowProc(hwnd, uMsg, wParam, lParam);
310
+
311
+ }
312
+
313
+
314
+
315
+ ```
316
+
317
+ ###参考にしているサンプル(追記)
318
+
319
+ ```C
320
+
321
+ #define UNICODE
322
+
323
+ #include <windows.h>
324
+
325
+
326
+
327
+ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
328
+
329
+ ATOM InitApp(HINSTANCE);
330
+
331
+ BOOL InitInstance(HINSTANCE, int);
332
+
333
+
334
+
335
+ LPCWSTR szClassName = L"layer01"; //ウィンドウクラス
336
+
337
+ HINSTANCE hInst;
338
+
339
+
340
+
341
+ HBITMAP hBmpGra; //グラデーションを格納
342
+
343
+
344
+
345
+ int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
346
+
347
+ LPSTR lpsCmdLine, int nCmdShow) {
348
+
349
+ MSG msg;
350
+
351
+ BOOL bRet;
352
+
353
+
354
+
355
+ hInst = hCurInst;
356
+
357
+ if (!InitApp(hCurInst))
358
+
359
+ return FALSE;
360
+
361
+ if (!InitInstance(hCurInst, nCmdShow))
362
+
363
+ return FALSE;
364
+
365
+ while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
366
+
367
+ if (bRet == -1) {
368
+
369
+ break;
244
370
 
245
371
  }
246
372
 
373
+ else {
374
+
375
+ TranslateMessage(&msg);
376
+
377
+ DispatchMessage(&msg);
378
+
379
+ }
380
+
247
381
  }
248
382
 
383
+ return (int)msg.wParam;
384
+
385
+ }
386
+
387
+
388
+
389
+ //ウィンドウ・クラスの登録
390
+
391
+ ATOM InitApp(HINSTANCE hInst) {
392
+
393
+ WNDCLASSEX wc;
394
+
395
+ wc.cbSize = sizeof(WNDCLASSEX);
396
+
397
+ wc.style = CS_HREDRAW | CS_VREDRAW;
398
+
399
+ wc.lpfnWndProc = WndProc; //プロシージャ名
400
+
401
+ wc.cbClsExtra = 0;
402
+
403
+ wc.cbWndExtra = 0;
404
+
405
+ wc.hInstance = hInst;//インスタンス
406
+
407
+ wc.hIcon = (HICON)LoadImage(NULL,
408
+
409
+ MAKEINTRESOURCE(IDI_APPLICATION),
410
+
411
+ IMAGE_ICON,
412
+
413
+ 0,
414
+
415
+ 0,
416
+
417
+ LR_DEFAULTSIZE | LR_SHARED);
418
+
419
+ wc.hCursor = (HCURSOR)LoadImage(NULL,
420
+
421
+ MAKEINTRESOURCE(IDC_ARROW),
422
+
423
+ IMAGE_CURSOR,
424
+
425
+ 0,
426
+
427
+ 0,
428
+
429
+ LR_DEFAULTSIZE | LR_SHARED);
430
+
431
+ wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
432
+
433
+ wc.lpszMenuName = NULL; //メニュー名
434
+
435
+ wc.lpszClassName = szClassName;
436
+
437
+ wc.hIconSm = (HICON)LoadImage(NULL,
438
+
439
+ MAKEINTRESOURCE(IDI_APPLICATION),
440
+
441
+ IMAGE_ICON,
442
+
443
+ 0,
444
+
445
+ 0,
446
+
447
+ LR_DEFAULTSIZE | LR_SHARED);
448
+
449
+
450
+
451
+ return (RegisterClassEx(&wc));
452
+
453
+ }
454
+
455
+
456
+
457
+ //ウィンドウの生成
458
+
459
+ BOOL InitInstance(HINSTANCE hInst, int nCmdShow) {
460
+
461
+ HWND hWnd;
462
+
463
+
464
+
465
+ hWnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
466
+
467
+ szClassName,
468
+
469
+ L"Test Layer Window", //Title
470
+
471
+ WS_POPUP,
472
+
473
+ 50, //X
474
+
475
+ 50, //Y
476
+
477
+ 960, //width
478
+
479
+ 520, //height
480
+
481
+ NULL, //hWnd
482
+
483
+ NULL, //Menu
484
+
485
+ hInst,
486
+
487
+ NULL);
488
+
489
+ if (!hWnd)
490
+
491
+ return FALSE;
492
+
493
+ ShowWindow(hWnd, nCmdShow);
494
+
495
+ UpdateWindow(hWnd);
496
+
497
+ return TRUE;
498
+
499
+ }
500
+
501
+
502
+
503
+ //グラデーションのBitmapの作成
504
+
505
+ HBITMAP make_gradation(HWND hWnd, unsigned height, unsigned width, BYTE _r, BYTE _g, BYTE _b) {
506
+
507
+ void* lpBits;
508
+
509
+
510
+
511
+ BITMAPINFO bi = {
512
+
513
+ sizeof(BITMAPINFOHEADER), 960, 520, 1, 32, BI_RGB, 0, 0, 0, 0, 0, 0
514
+
515
+ };
516
+
517
+
518
+
519
+ HDC hdc = GetDC(hWnd);
520
+
521
+ HBITMAP hbmp = CreateDIBSection(hdc, (BITMAPINFO*)& bi, DIB_RGB_COLORS,
522
+
523
+ (void**)& lpBits, NULL, (DWORD)0);
524
+
525
+ ReleaseDC(hWnd, hdc);
526
+
527
+
528
+
529
+ DWORD* lpdw = (DWORD*)lpBits;
530
+
531
+ int mdsize = 960 * 520;
532
+
533
+ for (int i = 0; i < mdsize; i++)lpdw[i] = 0x7fff00ff;
534
+
535
+
536
+
537
+ return hbmp;
538
+
539
+ };
540
+
541
+
542
+
543
+
544
+
545
+ //ウィンドウプロシージャ
546
+
547
+ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
548
+
549
+ int id;
550
+
551
+ HDC hdc, hdc_mem, hsdc;
552
+
553
+ HBRUSH hBrush;
554
+
555
+ PAINTSTRUCT ps;
556
+
557
+ LPCWSTR szBuf = L"Test Layer Window";
558
+
559
+ BITMAP bmp_info;
560
+
561
+ HBITMAP hBmp;
562
+
563
+ int wx, wy;
564
+
565
+ const COLORREF col = RGB(0, 255, 0);
566
+
567
+ HGDIOBJ hOldObj;
568
+
569
+ BLENDFUNCTION blend;
570
+
571
+ POINT wndPos;
572
+
573
+ SIZE wndSize;
574
+
575
+ RECT rc;
576
+
577
+ POINT po;
578
+
579
+
580
+
581
+ switch (msg) {
582
+
583
+ case WM_CREATE:
584
+
585
+ hBmpGra = make_gradation(hWnd, 520, 960, 0, 255, 60);
586
+
587
+
588
+
589
+ case WM_PAINT:
590
+
591
+ hsdc = GetDC(hWnd);
592
+
593
+ hdc = BeginPaint(hWnd, &ps);
594
+
595
+ hdc_mem = CreateCompatibleDC(hdc);
596
+
597
+ SelectObject(hdc_mem, hBmpGra);
598
+
599
+ BitBlt(hdc, 0, 0, 960, 520, hdc_mem, 0, 0, SRCCOPY | CAPTUREBLT);
600
+
601
+
602
+
603
+ wndSize.cx = 960; wndSize.cy = 520;
604
+
605
+ po.x = po.y = 0;
606
+
607
+ blend.BlendOp = AC_SRC_OVER;
608
+
609
+ blend.BlendFlags = 0;
610
+
611
+ blend.SourceConstantAlpha = 0xff;
612
+
613
+ blend.AlphaFormat = AC_SRC_ALPHA;
614
+
615
+ UpdateLayeredWindow(hWnd, hsdc, nullptr, &wndSize, hdc_mem, &po, 0, &blend, ULW_ALPHA);
616
+
617
+
618
+
619
+ DeleteDC(hdc_mem);
620
+
621
+ SetBkMode(hdc, TRANSPARENT);
622
+
623
+ EndPaint(hWnd, &ps);
624
+
625
+ ReleaseDC(0, hsdc);
626
+
249
627
  break;
250
628
 
251
-
629
+ case WM_CLOSE:
630
+
252
-
631
+ id = MessageBox(hWnd,
632
+
253
-
633
+ L"終了してもよろしいですか",
634
+
635
+ L"確認",
636
+
637
+ MB_YESNO | MB_ICONQUESTION);
638
+
639
+ if (id == IDYES)
640
+
641
+ DestroyWindow(hWnd);
642
+
643
+ break;
644
+
645
+ case WM_RBUTTONDOWN:
646
+
647
+ SendMessage(hWnd, WM_CLOSE, 0, 0);
648
+
649
+ break;
650
+
651
+ case WM_LBUTTONDOWN:
652
+
653
+ PostMessage(hWnd, WM_NCLBUTTONDOWN, (WPARAM)HTCAPTION, lp);
654
+
655
+ break;
254
656
 
255
657
  case WM_DESTROY:
256
658
 
257
- DeleteDC(hbufdc);
258
-
259
- DeleteObject(hbmp);
260
-
261
659
  PostQuitMessage(0);
262
660
 
263
- return 0;
661
+ break;
662
+
663
+ default:
664
+
665
+ return (DefWindowProc(hWnd, msg, wp, lp));
264
666
 
265
667
  }
266
668
 
267
-
268
-
269
- return DefWindowProc(hwnd, uMsg, wParam, lParam);
669
+ return 0;
270
670
 
271
671
  }
272
672
 
273
-
274
-
275
673
  ```
276
674
 
277
-
278
-
279
-
280
-
281
675
  ### 補足情報
282
676
 
283
677
  Windows10 Pro