ドキュメントを読む限り 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 件のコメント:
コメントを投稿