アプリケーションの見た目を構成する重要な要素でもあります。ユーザーに見栄え良く見せるための工夫が必要になることがあります。した独自の描画を行ってもコントロールの本来の機能(WM_COMMANDの生成など)が失われないという利点があります。ボタンに対してオーナードローを行うには、ウインドウスタイルにBS_OWNERDRAWを指定することになります。この定数を指定した場合、ボタンは背景色だけが描画され、ボタンのテキストや輪郭などは描画されません。理由は、これらを描画するのがアプリケーションの役割になるからです。実際に描画を行うことになります。lParamはDRAWITEMSTRUCT構造体のアドレスが格納されます。DRAWITEMSTRUCT;CtlTypeは、コントロールのタイプを示す定数が格納されます。CtlIDは、コントロールのIDが格納されます。itemIDは、アイテムのIDやインデックスが格納されます。ボタンの場合はボタンそのものであると考えて問題ありません。itemActionは、アイテムに要求されたアクションを示す定数が格納されます。itemStateは、アイテムの現在の状態を示す定数が格納されます。hwndItemは、コントロールのウインドウハンドルが格納されます。hDCは、コントロールのデバイスコンテキストのハンドルが格納されます。rcItemは、アイテムの長方形の座標が格納されます。itemDataは、アプリケーション定義値が格納されます。この描画の仕方は状況によって変化することになります。そのような関数が必要になります。これには、DrawEdgeを呼び出します。grfFlags);hdcは、デバイスコンテキストのハンドルを指定します。qlprcは、RECT構造体のアドレスを指定します。edgeは、長方形の辺の内側と外側をどのように描画するかを示す定数を指定します。grfFlagsは、境界をどのように描画するかを示す定数を指定します。既定のボタンでは、キーボードフォーカスが割り当てられている場合に、点線の枠が表示されていることがあります。これを描画するには、DrawFocusRectを呼び出します。*lprc);hDCは、デバイスコンテキストのハンドルを指定します。lprcは、RECT構造体のアドレスを指定します。今回のプログラムは、ボタンを2つ作成します。片方のボタンは、オーナードローによって独自に描画されています。辺を描画するためにDrawEdgeを呼び出しています。この場合はボタンの内側と外側を陥没させる必要があるので、EDGE_SUNKENを指定しています。選択されていない場合は、ボタンの内側と外側を隆起させるためにEDGE_RAISEDを指定しています。第4引数は、上下左右の辺を描画することを意味するBF_RECTを指定しています。itemStateにODS_FOCUSが含まれている場合は、ボタンにキーボードフォーカスが割り当てられていることを意味します。内側に描画するために、InflateRectで長方形を縮小しています。ボタンテキストの描画は、DrawTextで行っています。必要なテキストは、ボタンのウインドウハンドルをGetWindowTextに指定することで取得できます。SetTextColorは描画時におけるテキストの色を変更し、SetBkModeはテキストを透過描画できるようにします。今回のようなオーナードローの方法は、常にボタンがクラシックに描画されるという問題があります。テーマを反映したボタンが描画されることをユーザーは望んでいるはずです。有効になっている場合はテーマを反映した描画を行う必要があるといえます。次節で取り上げるカスタムドローを利用した方がよいでしょう。WM_SETFONTでフォントを設定した方が遥かに簡単といえます。次にコード例を示します。0);WM_SETFONTのwParamには、設定したいフォントのハンドルを指定します。当然ながらCreateFontで作成した独自のフォントも指定できます。フォントが反映した状態でボタンが表示されることになります。