2007-08-08

Todayアイテムを選択可能にする

WM_WININICHANGEを拾うことができない問題をそのままにして Today画面のアイテムを選択する方法を調べていました。
 
ドキュメントを読む限り WM_TODAYCUSTOM_ACTIONあたりが使えそうなのですが、SDKのサンプルを見ても具体的な使い方がよくわかりません。
いろいろ検索して、やっとそれらしい記述を見つけました。 日本語の記事もありました。  
古い記事なのにタイトルに誤植が残っているあたりに需要の低さを感じます。
 
ポイントとしては、
  • アイテムを選択するためにはレジストリで Selectabilityを設定する必要がありますよ

  • Selectability = 1だとアイテムが選択できるようになるけど、メッセージは送ってやらないよ
  • Selectability = 2だとメッセージを送ってあげるけど、背景は自前で処理しろよ
という事のようです。
 
早速実装してみました。
// ウィンドウプロシージャ
static LRESULT CALLBACK WndProc(HWND hwnd, UINT uimessage, WPARAM wParam, LPARAM lParam) {

    switch (uimessage) {

        case WM_TODAYCUSTOM_RECEIVEDSELECTION:
            g_bSelected = TRUE;
            return TRUE;

        case WM_TODAYCUSTOM_LOSTSELECTION:
            g_bSelected = FALSE;
            return TRUE;

        case WM_ERASEBKGND:
            if (!g_bSelected) {
                TODAYDRAWWATERMARKINFO dwi;
                dwi.hdc = (HDC)wParam;
                GetClientRect(hwnd, %amp;dwi.rc);
                
                dwi.hwnd = hwnd;
                SendMessage(GetParent(hwnd), TODAYM_DRAWWATERMARK, 0,(LPARAM)%amp;dwi);
            }
            return TRUE;

        case WM_PAINT:
            PAINTSTRUCT     ps;
            RECT            rcWindBounds;
            HDC             hDC;
            COLORREF        crText;

            GetWindowRect(hwnd, %amp;rcWindBounds);
            hDC = BeginPaint(hwnd, %amp;ps);

            if (g_bSelected) {
                // アイテム選択時は背景を塗りつぶす
                COLORREF crHighlight;
                HBRUSH   hHighlightBrush,
                         hOldBrush;
                crHighlight     = SendMessage(GetParent(hwnd), TODAYM_GETCOLOR, (WPARAM) TODAYCOLOR_HIGHLIGHT, NULL);
                hHighlightBrush = CreateSolidBrush(crHighlight);
                hOldBrush       = (HBRUSH)SelectObject(hDC, hHighlightBrush);
                Rectangle(hDC, 0, 0, rcWindBounds.right - rcWindBounds.left, rcWindBounds.bottom - rcWindBounds.top);
                SelectObject(hDC, hOldBrush);
                DeleteObject(hHighlightBrush);
                // 選択状態の文字色取得
                crText = SendMessage(GetParent(hwnd), TODAYM_GETCOLOR, (WPARAM) TODAYCOLOR_HIGHLIGHTEDTEXT, NULL);
            } else {
                // 標準の文字色取得
                crText = SendMessage(GetParent(hwnd), TODAYM_GETCOLOR, (WPARAM) TODAYCOLOR_TEXT, NULL);
            }
            SetBkMode(hDC, TRANSPARENT);
            SetTextColor(hDC, crText);

            :

 
ついでに wifictrlのソースを参考にして、WM_TODAYCUSTOM_ACTIONメッセージを受け取ったときに無線LANのON/OFFを切り替えるようにしてみました。
相変わらずアイコン無しな上に選択状態の枠(ペン?)が太いような気がするので、もう少し調整しないといけませんね。
 

0 件のコメント: