エアロの続き
先日Aero関係を調べていてMSDNの面白い資料がありました。その資料では、リボンのようにタイトルーバーにボタン等を配置する方法がかかれておりなかなか興味ぶかい内容でした。リボンインタフェースを始めてみたときに、お~!と思うのはタイトルバーにはみ出たでっかいアイコンと操作ボタンですよね。それからずーとどうやってやっているのだろうと思ってました。拙い英語力で理解したのは、DWMがフレームを描画したあとでウィンドウマネージャ側のフレームを外してウィンドウサイズをDWMのフレームサイズにウィンドウサイズを変更するということらしいです。結構荒業な感じですがこうするとウィンドウ全体がクライアント領域として描画可能になるということらしいです。あとは、この重なった部分のシステム系イベント回りを自力でケアするということらしいです。そのための、APIが幾つか用意されているところをみるとたまたまこうなったのではなく最初からRibonインタフェース等で使うために意図的に設計されているのですね。と、ここまで書いて拙作のAeroの調べでDWM側のフレームを外してみると、え!ちゃんとウィンドウマネージャのフレームが付いてるじゃん????ん~。また新たな謎が。。。。追記:もう一度資料を確認してみると、WM_CREATEで RECT rcClient; GetWindowRect(hWnd, &rcClient); // Inform application of the frame change. SetWindowPos( hWnd, NULL, rcClient.left, rcClient.top, RECTWIDTH(rcClient), RECTHEIGHT(rcClient), SWP_FRAMECHANGED);としているだけで、スタイルビットをいじっているわけでないようです。で、SWP_FRAMECHANGEでWM_WM_NCCALCSIZEを発生させてここでシステムをだますわけですね。あとはHITTESTを自力で行う。とこんな段取りのようです。この資料は、こちらで見れます。