タイトルバー上に透明なコントロールを配置

できました。

…カテゴリこれじゃないような気もするけど

で、スクリーンショット


はい、要点だけまとめます

タイトルバー上に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時間。自分乙。


たしかにこれは、しょぼいアプリなのかもしれません。
でも、のみなにとってはたぶん、大きな一歩なのです。


…そうなれば、いいな(疲