サブクラスボタンの応答速度

[戻る]
富沢 2006/07/04(火) 13:54:34
よろしくお願いします。

 ダイアログに配置したボタンをサブクラス化し、背景色・文字色を変えています。
Wクリックに近い速度でクリックすると、2回目のクリックに応答出来ません
(表示上の応答です)。
 同じダイアログ上のサブクラス化していない標準ボタンでは応答しています。
 サブクラス化したボタンの応答を標準ボタンに近い速さにしたいのですが、
対処法などありましたらお教え下さい。

富沢 2006/07/04(火) 13:57:24
 すみません。抜けがありました。
VC.net2005 + MFCでダイアログアプリを開発しています。

2006/07/04(火) 14:20:17
それだけじゃサブクラス化した処理に問題があるとしかいえないのでは…
ソースはったら?

富沢 2006/07/04(火) 15:23:40
 確かに。長くなりますが、ソースです。
あるHP(忘れました)で見たもののほぼそのままです。
OnInitDialog()で、SubclassDlgItem()を使用してボタンにアタッチしています。

void CColorBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
  CDC*  pDC=CDC::FromHandle(lpDIS->hDC);
  CRect btnRect;
  btnRect.CopyRect(&lpDIS->rcItem);
  // キャプション取得
  CString strCaption;
  GetWindowText(strCaption);
  // ボタン描画
  DrawBkGround(pDC, btnRect, GetBackGroundColor());
  DrawCaption(pDC, btnRect, GetTextColor(), strCaption);
  pDC->DrawEdge(btnRect, EDGE_RAISED, BF_RECT);
  UINT nState = lpDIS->itemState; 
  if (nState & ODS_FOCUS){
    if (nState & ODS_SELECTED)
      pDC->DrawEdge(btnRect, EDGE_ETCHED, BF_RECT);
    btnRect.left += 4;
    btnRect.right -= 4;
    btnRect.top += 4;
    btnRect.bottom -= 4;
    pDC->DrawFocusRect(btnRect);  // フォーカス矩形領域描画
  } else if(nState & ODS_DISABLED) // ボタンが無効
    DrawCaption(pDC, btnRect, GetDisabledColor(), strCaption);
}
// 背景色描画
void CColorBtn::DrawBkGround(CDC *pDC, CRect rect, COLORREF col)
{ 
  CBrush  brush(col);
  pDC->FillRect(rect, &brush);
}
// キャプション描画
void CColorBtn::DrawCaption(CDC *pDC, CRect rect, COLORREF col, CString& str)
{
  COLORREF oldcol = pDC->SetTextColor(col);
  pDC->SetBkMode(TRANSPARENT);
  pDC->DrawText(str, rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  pDC->SetTextColor(oldcol);
}

dairygoods 2006/07/04(火) 16:07:08
オーナー描画にすると、何故かダブルクリックに反応しなくなります。
例えば、以下のようにダブルクリックをクリックに置き換えてしまえばよいです。

void CMyButton::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
  const MSG* msg = GetCurrentMessage();
  DefWindowProc(WM_LBUTTONDOWN, msg->wParam, msg->lParam);
}

富沢 2006/07/04(火) 16:22:29
[[解決]]
dairygoods様、ありがとうございます。
サブクラスボタンのダブルクリック処理は不要ですので、これで解決となります。
…様、レスありがとうございました。

古いスレッドには追加発言できません。