質問編集履歴

2

文章の追加

2017/05/27 06:00

投稿

BeatStar
BeatStar

スコア4958

test CHANGED
File without changes
test CHANGED
@@ -457,3 +457,69 @@
457
457
 
458
458
 
459
459
  よって、2もあり得ないと思います。
460
+
461
+
462
+
463
+ --------------------------------------
464
+
465
+
466
+
467
+ Chironianさん。
468
+
469
+
470
+
471
+ どうしてもパターンが思いつかない
472
+
473
+ ( 一応、思いついたものはすべてやりました。 )
474
+
475
+ のでネットで検索したところ、
476
+
477
+ [エディットコントロール [VC++の使い方] - トップ [nitoyon . com]](http://www.nitoyon.com/vc/reference/gui/edit.htm)
478
+
479
+
480
+
481
+ がヒットしました。
482
+
483
+
484
+
485
+ これによると
486
+
487
+
488
+
489
+ ```ここに言語を入力
490
+
491
+ リソースエディタで作成するような枠をつけたい場合は、
492
+
493
+ WS_EX_CLIENTEDGE スタイルを有効にするのがよいでしょう。
494
+
495
+ CreateWindowEx(WS_EX_CLIENTEDGE, ...); とします。
496
+
497
+ (省略した残りの引数は、CreateWindow 関数と同じものを書く。
498
+
499
+ ただし、WS_BORDER ははずしておいたほうがよいでしょう)
500
+
501
+ ```
502
+
503
+
504
+
505
+ とありました。
506
+
507
+
508
+
509
+ なので
510
+
511
+
512
+
513
+ ```ここに言語を入力
514
+
515
+ 1. ( Createメンバ関数内 ) CreateWindowEx の第一引数としてWS_EX_CLIENTEDGE を渡し、 通常のウィンドウスタイルから WS_BORDER をはずしておく
516
+
517
+ 2. ( SetBorderメンバ関数が呼ばれたら ) WS_EX_CLIENTEDGE を外す
518
+
519
+ ```
520
+
521
+ みたいにしようかと思っています。
522
+
523
+
524
+
525
+ ありがとうございます!!

1

文章の追加

2017/05/27 06:00

投稿

BeatStar
BeatStar

スコア4958

test CHANGED
File without changes
test CHANGED
@@ -279,3 +279,181 @@
279
279
 
280
280
 
281
281
  宜しくお願い致します。
282
+
283
+
284
+
285
+ ---------------------------------------
286
+
287
+
288
+
289
+ Chironianさん ご回答ありがとうございます。
290
+
291
+
292
+
293
+ ご回答ありがとうございます。
294
+
295
+
296
+
297
+ 外出先で質問&アンサーしているので、
298
+
299
+
300
+
301
+ 帰宅後に試してみました。
302
+
303
+
304
+
305
+
306
+
307
+ まず "3. WM_BORDERが設定されていても..." の方が怪しいと仰ったので、
308
+
309
+
310
+
311
+ 先に試してみました。
312
+
313
+
314
+
315
+
316
+
317
+ ShowWindow( hEdit, SW_SHOW ); // Edit1 を Show!
318
+
319
+
320
+
321
+ を置いて やっても同じでした。
322
+
323
+
324
+
325
+ 次に "1. そもそもウィンドウハンドルではない" をチェックしてみました。
326
+
327
+
328
+
329
+ ```C++
330
+
331
+ LRESULT CALLBACK EditProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ){
332
+
333
+ // 省略。 EDITのサブクラスってとこ。
334
+
335
+ }
336
+
337
+
338
+
339
+
340
+
341
+
342
+
343
+ LRESULT CALLBACK WindProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ){
344
+
345
+ static CMsgBox MsgBox(hWnd); // MessageBoxをクラス化したもの。
346
+
347
+ static WEdit* Edit1; // 質問にあるWEditクラスのオブジェクト
348
+
349
+ static HWND hEdit; // Edit1 のウィンドウハンドル
350
+
351
+ CWindowInfo* Info; // ウィンドウの情報を取得する自作クラス
352
+
353
+ DWORD dwStyle;
354
+
355
+
356
+
357
+ switch( msg ){
358
+
359
+ case WM_CREATE:
360
+
361
+ Edit1 = new WEdit( hWnd, 102, EditProc ); // 引数そのものは正しいとする。定義を書くのが面倒なので。
362
+
363
+ hEdit = Edit1->Create( 0, 0, 20, 100 ); // これも正しいとする。
364
+
365
+ ShowWindow( hEdit, SW_SHOW );
366
+
367
+ break;
368
+
369
+ case WM_RBUTTONDOWN:
370
+
371
+ // 右クリックされたら Edit1 の情報 ( 特に ウィンドウスタイル ) を取得する
372
+
373
+ Info = new CWindowInfo( hWnd, 102 );
374
+
375
+
376
+
377
+ dwStyle = Info->GetStyle();
378
+
379
+
380
+
381
+ if( dwStyle & WS_BORDER ){
382
+
383
+ MsgBox.Show( "Found" ); // WS_BORDER があれば "Found" というメッセージボックスを表示
384
+
385
+ }else{
386
+
387
+ MsgBox.Show( "Not Found" );
388
+
389
+ }
390
+
391
+
392
+
393
+ // 試しに Edit1 を非表示にしてみる。
394
+
395
+ ShowWindow( hEdit, SW_HIDE );
396
+
397
+ delete Info;
398
+
399
+ break;
400
+
401
+ case WM_DESTROY:
402
+
403
+ delete Edit1;
404
+
405
+ PostQuitMessage( 0 );
406
+
407
+ break;
408
+
409
+ }
410
+
411
+ return DefWindowProc( hWnd, msg, wp, lp );
412
+
413
+ }
414
+
415
+ ```
416
+
417
+
418
+
419
+ みたいにしました。
420
+
421
+
422
+
423
+ すると、
424
+
425
+
426
+
427
+ "Not Found" というMessageBox表示後、 Edit1 に相当する部分が非表示になりました。
428
+
429
+
430
+
431
+ 非表示になるということは、hEdit は ウィンドウハンドルで、ちゃんと格納されているってことですよね。
432
+
433
+
434
+
435
+ なので
436
+
437
+
438
+
439
+ 1 & 3 は違うと思います。
440
+
441
+
442
+
443
+
444
+
445
+ "2. そもそも WS_BORDERが設定されていない" ... (パターンからすると)ありえそうですが、
446
+
447
+
448
+
449
+ コードを見ると設定されていると思います。
450
+
451
+
452
+
453
+ ( 実際、実行時も 黒のボーダーが Edit1 に相当する部分に出ていますから。 )
454
+
455
+
456
+
457
+
458
+
459
+ よって、2もあり得ないと思います。