我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处,不调用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 ; //...
}
解决方案 »
- Jmail的问题
- 关于监听多个客户机的问题
- 在VC++中用Web引用自动生成的WebService调用代理,如何向Webservice的方法传递日期类型值?
- 如何实现切分的两个窗口同时滚动?
- SDI程序,在View类里自己写了一个输出函数如何实现重绘?
- Shell_NotifyIcon()怎么样响应右击鼠标事件?SetTimer()使用TimeProc怎么调用?
- 提问:在vc中,如何使数组的个数可变?
- 数制转换的问题
- 【跪求 急 在线等】VC ODBC 菜鸟提问。数据库修改失败为什么
- QT引用com组件的参数不匹配的
- 改变CComboBox那个下拉按扭的背景颜色(或者换成自己的图片好了)
- 急死了,使用ado com组件的一个大问题
但你的代码中有些不合适的地方,改: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;
其实,我想楼主应该试下不用Hook, 直接在WM_ERASEBKGND处理下
没有调用BeginPaint(hwndHooked, &ps);和EndPaint(hwndHooked, &ps);
来获得HDC