• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:最初ボタンが見えない)

ボタンが見えない?ボタンを大きく中央に表示する方法とは?

このQ&Aのポイント
  • ボタンを大きく中央に表示するプログラムを作りましたが、最初からボタンが現れません。どうしたら最初からボタンが現れるのでしょうか?
  • フォントをクリエイトし続けてリソースは尽きないのでしょうか?
  • ボタンの幅と高さ、親ウィンドウの幅と高さを表示するプログラム

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>フォントをクリエイトし続けてリソースは尽きないのでしょうか? 正しく削除できていれば平気です。 1.WM_PAINTの処理がおかしい 自分でメッセージを処理するのであれば、BeginPaint()、EndPaint()は必須です。 2.WM_PAINTでやるべき処理ではない 親ウィンドウのサイズが変更されたらフォントを変えるのであれば、WM_SIZEでかまわないのでは? 3.DeletObjectする順番が違う。 WM_SETFONTでボタンのフォントを変更してから削除しましょう。 一番大きな原因は、おそらく1でしょう

keyguy
質問者

お礼

1,2.WM_SIZEでやるとタイムラグが有り1テンポ遅れて文字サイズが変わると思って渋っていたのですが実際にやってみるとうまくいきました。 3.デリートする順番ですが以前指摘を受けたようにフォントをクリエイトしてセンドした後デリートすると文字が大きくならない(多分瞬間的にだけ大きくなっている)のです。 だからフォントをクリエイトする直前まで以前のフォントをデリートしてはいけないのです。 とにかく以下のコーディングでうまくいきました。 ありがとうございました。 LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { RECT rt; int W,H; static HFONT hF; switch(wM) { case WM_COMMAND: SetFocus(hW);return 0; case WM_SIZE: GetClientRect(hW,&rt); W=rt.right-rt.left;H=rt.bottom-rt.top; if(hF!=0)DeleteObject(hF); hF=CreateFont(H/4,W/4,0,0,FW_NORMAL,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"MS Pゴシック"); SendMessage(hB,WM_SETFONT,(WPARAM)hF,1); MoveWindow(hB,W/4,H/4,W/2,H/2,1); return 0; case WM_DESTROY: DeleteObject(hF); PostQuitMessage(0); return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; HWND hW; MSG ms; wc.lpszClassName ="I"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; wc.cbClsExtra =0; wc.cbWndExtra =0; wc.hIcon =0; wc.hCursor =LoadCursor(0,IDC_ARROW); wc.hbrBackground =HBRUSH(COLOR_WINDOW+1); wc.lpszMenuName =0; RegisterClass(&wc); hW=CreateWindow("I","親",WS_OVERLAPPEDWINDOW,0,0,99,99,0,0,hI,0); hB=CreateWindow("BUTTON","子",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,0,0,0,0,hW,0,hI,0); ShowWindow(hW,SW_SHOW); UpdateWindow(hW); while(GetMessage(&ms,0,0,0)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); }

関連するQ&A