タイトルバー上に透明なコントロールを配置
できました。
…カテゴリこれじゃないような気もするけど
で、スクリーンショット。
はい、要点だけまとめます
タイトルバー上にedit controlを配置
とりあえず、これすら一筋縄では行かないのです。
- WS_POPUPな普通のwindow(gHWndStatus)を作成 : 枠ナシwindow
- その上に、edit control(gHWndEditStatus)を配置
タイトルバーと、edit controlの載ってるののサイズ合わせ
- ::GetSystemMetrics(SM_CYEDGE)で元window(gHWndFrameWindow)の境界の幅を取得
- ::GetSystemMetrics(SM_CYCAPTION)でタイトルバーの幅を取得
- あとは::GetWindowRectで元windowの位置を取得し、移動
edit controlの位置あわせと、fontの指定
- こんなもん。空気を感じてください。
NONCLIENTMETRICS ncm; ncm.cbSize = sizeof(ncm); ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); HFONT hFont=::CreateFontIndirect(&ncm.lfCaptionFont); int offset = (int)((::GetSystemMetrics(SM_CYCAPTION) - abs(ncm.lfCaptionFont.lfHeight)) / 2);
- で、このoffset分下にずらしてeditを作成し、このfontをsetする
視覚的に透過させる
- edit controlが載ってるの(gHWndStatus)に、WS_EX_LAYEREDを指定しておく
- edit controlが載ってるの(gHWndStatus)の背景を赤にしておく(文字とカブらない色であればなんでも)
wndclass.hbrBackGround=(HBRUSH)::CreateSolidBrush(RGB(255,0,0))
- で、edit controlの背景を赤にし、文字色をタイトルと合わせる
// 親windowのwindow procで // editはES_READONLYで表示専用にしてあります。 //ES_READONLYでないなら、WM_CTLCOLOREDIT case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wparam; ::SetBkColor(hdc, RGB(255, 0, 0)); ::SetTextColor(hdc, ::GetSysColor(COLOR_CAPTIONTEXT)); return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH); } break;
- で、edit controlが載ってるの(gHWndStatus)の透過色を赤にする。editは不要。
::SetLayeredWindowAttributes(gHWndStatus, RGB(255,0,0), 255, LWA_COLORKEY);
マウスイベントを透過させる
- そう、視覚的に透過しただけでは、マウスイベントをひっかけてしまうのです。
- ということで、edit control(gHWndEditStatus)と、それが載ってるの(gHWndStatus)の両方を、こうする。
// それぞれのwindowprocにて // これでマウスイベントを透過させる…らしい case WM_NCHITTEST: return HTTRANSPARENT; break;
はい、終了
疲れましたね。約10時間。自分乙。
たしかにこれは、しょぼいアプリなのかもしれません。
でも、のみなにとってはたぶん、大きな一歩なのです。
…そうなれば、いいな(疲