我Hook CCombobox是为了想把CCombobox中的那个下拉按扭换成自己的图片.下面的代码,我就自己写的WM_PAINT消息处理函数.
若在语句1处,不调用CCombobox原来的WNDPROC函数的话,CPU就会达到90%了.若在语句1处,调用CCombobox原来的WNDPROC函数的话,默认的灰色下拉按扭有时候又会显示出来,影响美观.switch(msg) {
case WM_PAINT:
{
   语句1 //在此若不调用原始的WNDPROC ,CPU就会达到90%以上
   CRect rc;
   GetWindowRect(m_hwndHooked,&rc);
   rc.OffsetRect(-rc.left,-rc.top);
  HDC hWinDC;
  hWinDC = ::GetWindowDC(m_hwndHooked);
  HBITMAP hbitmap ;
  //加载图片
  hbitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BUTTON_BITMAP );
  HDC bitmapDC;
  bitmapDC =CreateCompatibleDC(NULL);
  HBITMAP pOldBitmap =(HBITMAP)SelectObject( bitmapDC,hbitmap);
  BITMAP bm ;
  GetObject( hbitmap , sizeof(bm) , &bm ) ;
  //绘制图片
  ::BitBlt(hWinDC,rClient.left,rClient.top,
rClient.Width(),rClient.Height(),bitmapDC,0,0,SRCCOPY);
return TREU ;
}
break ; //...
   }

解决方案 »

  1.   

    从代码上看不出哪有占CPU的.
    但你的代码中有些不合适的地方,改:switch(msg) {
    case WM_PAINT:
    {
    CRect rc;
    GetWindowRect(m_hwndHooked,&rc);PAINTSTRUCT ps;
    BeginPaint(hwndHooked, &ps);
    HDC hDC = ps.hdc;// 把LoadBitmap放到外面去,不要消息过程中,这样每次处理消息都要装入一次浪费资,另外如果
    // 用GetWindowDC的话,记得用完一定要ReleaseDC.
    HDC bitmapDC = CreateCompatibleDC(NULL);
    HBITMAP hOldBitmap = (HBITMAP)SelectObject(bitmapDC, hbitmap);BITMAP bm;
    GetObject( hbitmap , sizeof(bm) , &bm ) ;::BitBlt(hDC, rClient.left, rClient.top,
    rClient.Width(),rClient.Height(),bitmapDC,0,0,SRCCOPY);EndPaint(hwndHooked, &ps);return 0;
    }break;
      

  2.   

    对了,CreateCompatibleDC与DeleteDC成对使用.
      

  3.   

    楼上的讲的很清楚了,看来不用我回答了.
    其实,我想楼主应该试下不用Hook, 直接在WM_ERASEBKGND处理下
      

  4.   

    我发现问题的原因了
    没有调用BeginPaint(hwndHooked, &ps);和EndPaint(hwndHooked, &ps);
    来获得HDC