- ベストアンサー
CreateFontIndirectとは?
フォントを設定するにのCreateFontを使っていましたがCreateFontIndirectというAPIも有るそうです。 マイクロソフトの解説に 「CreateFont 関数との違いは、パラメータの指定方法だけです。」 とあります。 しかしどうして同じような関数が2つ用意されているのか分かりません。 両者の特徴と意味とどのように使い分けるのか教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
数多くの引数を持つか、巨大な構造体を引数に持つかの違いですよね。 好みでいいんじゃないんですか? 個人的にはCreateFontIndirectを使ってますが、CreateFontを使うときもありますし。 GetObjectでフォント情報を取得したときはCreateFontIndirectになりますけど。 #ちなみに、削除の順番は、 1.Create 2.WM_SETFONT 3.前回コールされたときのフォントを削除 ですよ。セットしたばかりのフォントを削除するのではありません。
お礼
ありがとうございます。 前回の件で1つのフォントハンドルですまそうとするとどうしてもクリエイト前にデリートして瞬間的にフォントが設定されていない状態がでてきました。 2つの変数を使って以下のようにすべきですね。 1つの変数では扱いが難しいですね? #include <windows.h> HWND hB; LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { RECT rt; int W,H; HFONT hFx; 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; hFx=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)hFx,1); if(hF!=0)DeleteObject(hF); hF=hFx; 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); }