WIN32 工具栏贴图背景图的实现

来源:互联网 发布:差额比例计算法 编辑:程序博客网 时间:2024/06/10 01:56
完整的应用代码下载
代码实现在miniwinouter.rar 的dvbhelper.c里面
LRESULT WINAPI DVBWndProc(HWND hWnd,UINT msgID,WPARAM wParam,LPARAM lParam){switch(msgID){case WM_CREATE:{LPCREATESTRUCT cs=(LPCREATESTRUCT)lParam;SetWindowLong(hWnd,GWL_DVB_OLDPROC,(LONG)cs->lpCreateParams);SetWindowLong(hWnd,GWL_DVB_AUTOCLOSE_TIME,MAKELONG(0,2));if(cs->dwExStyle&(WS_EXDVB_TIME|WS_EXDVB_AUTOCLOSE)){SetTimer(hWnd,IDT_DVBTIME,1000,NULL);}return 0;}case WM_NCACTIVATE:return 0;case WM_NCCALCSIZE:{RECT *rc=(LPRECT) lParam;rc->top+=40;}return WVR_VREDRAW|WVR_HREDRAW;/*case WM_ACTIVATE:{WORD fActive = LOWORD(wParam);  HWND hw=GetFocus();if(fActive==WA_INACTIVE){SetWindowLong(hWnd,GWL_DVB_FOCUS,hw);}else{hw=GetWindowLong(hWnd,GWL_DVB_FOCUS);if(hw)SetFocus(hw);}}break;*/case WM_NCPAINT:{RECT rc;HBITMAP hobmp,hbmpTitle;HBRUSH hbrush;BITMAP bmp;HDC hdc;HRGN hrgn;CHAR Caption[64];INT iCaptionLen;HICON hico=(HICON)GetClassLong(hWnd,GCL_HICON);GetClientRect(hWnd,&rc );MapWindowPoints(hWnd,0,(POINT*)&rc,2);hrgn=CreateRectRgnIndirect(&rc);/*if((UINT)clip>1){CombineRgn(hrgn,clip,hrgn,RGN_DIFF );hdc = GetDCEx(hWnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);}else*/hdc=GetDCEx( hWnd, hrgn,/* DCX_USESTYLE |*/ DCX_WINDOW | DCX_EXCLUDERGN );hbmpTitle=LoadBitmap(hInstDVBRes,MAKEINTRESOURCE(IDB_WINTITLE));DeleteObject((HGDIOBJ)hrgn);hbrush=CreatePatternBrush(hbmpTitle);GetObject((HGDIOBJ)hbmpTitle,sizeof(BITMAP),&bmp);GetWindowRect(hWnd,&rc);OffsetRect(&rc,-rc.left,-rc.top);rc.bottom=rc.top+40;FillRect(hdc,&rc,hbrush);iCaptionLen=GetWindowText(hWnd,Caption,64);rc.left+=40;SetBkMode(hdc,TRANSPARENT);//DrawIcon(hdc,4,4,hico);DrawIconEx(hdc,4,4,hico,32,32,0,0,DI_MASK|DI_IMAGE);DrawText(hdc,Caption,iCaptionLen,&rc,DT_VCENTER|DT_LEFT|DT_SINGLELINE);if(GetWindowLong(hWnd,GWL_EXSTYLE)&WS_EXDVB_TIME){char sdate[128],stime[64];SYSTEMTIME tnow;GetLocalTime(&tnow);GetDateFormat(LOCALE_NEUTRAL,0,&tnow,0,sdate,64);GetTimeFormat(LOCALE_NEUTRAL,/*TIME_NOSECONDS|*/TIME_FORCE24HOURFORMAT,&tnow," hh:mm:ss tt",stime,64);strcat(sdate,stime);rc.right-=16;DrawText(hdc,sdate,-1,&rc,DT_VCENTER|DT_RIGHT|DT_SINGLELINE);}DeleteObject((HGDIOBJ)hbrush); DeleteObject((HGDIOBJ)hbmpTitle);ReleaseDC(hWnd,hdc);}return 0;case WM_TIMER:{DWORD exStyle=GetWindowLong(hWnd,GWL_EXSTYLE);if(wParam==IDT_DVBTIME){if(exStyle&WS_EXDVB_TIME)SendMessage(hWnd,WM_NCPAINT,1,0);if(exStyle&WS_EXDVB_AUTOCLOSE){DWORD t=GetWindowLong(hWnd,GWL_DVB_AUTOCLOSE_TIME);if(LOWORD(t)>=HIWORD(t)){SendMessage(hWnd,WM_CLOSE,0,0);t=MAKELONG(0,HIWORD(t));}elset=MAKELONG(t+1,HIWORD(t));SetWindowLong(hWnd,GWL_DVB_AUTOCLOSE_TIME,t);}}else{WNDPROC proc=(WNDPROC)GetWindowLong(hWnd,0);if(proc)return proc(hWnd,msgID,wParam,lParam);}}break;case WM_NOTIFY:{NMHDR *nmhdr = (PVOID)lParam;if((nmhdr->code == NM_CUSTOMDRAW)&&(nmhdr->idFrom==IDC_TOOLBAR_WINHELP)) {//IDC_TOOLBAR_WINHELP为工具栏的IDNMLVCUSTOMDRAW *nmlvcd = (PVOID)nmhdr;switch(nmlvcd->nmcd.dwDrawStage) {case CDDS_PREPAINT://工具栏绘图输出准备阶段绘制背景{HBITMAP hbmp=LoadBitmap(hInstDVBRes,MAKEINTRESOURCE(IDB_WINTITLE));HBRUSH hb=CreatePatternBrush(hbmp);FillRect(nmlvcd->nmcd.hdc,&nmlvcd->nmcd.rc,hb);DeleteObject((HGDIOBJ)hb);DeleteObject((HGDIOBJ)hbmp);}return CDRF_SKIPDEFAULT;//因为已经绘制背景图片,告诉UI系统跳过绘制背景default:return CDRF_DODEFAULT;}}else{WNDPROC proc=(WNDPROC)GetWindowLong(hWnd,0);if(proc)return proc(hWnd,msgID,wParam,lParam);return DefWindowProc(hWnd,msgID,wParam,lParam);}}break;case WM_ERASEBKGND: {HBRUSH hbrush;  //画背景hbrush=CreateSolidBrush(RGB(61,185,197));FillRect((HDC)wParam,NULL,hbrush);DeleteObject((HGDIOBJ)hbrush);}return 1;case WM_KEYDOWN:{DWORD t=GetWindowLong(hWnd,GWL_DVB_AUTOCLOSE_TIME);t=MAKELONG(0,HIWORD(t));SetWindowLong(hWnd,GWL_DVB_AUTOCLOSE_TIME,t);}default:{WNDPROC proc=(WNDPROC)GetWindowLong(hWnd,0);if(proc)return proc(hWnd,msgID,wParam,lParam);return DefWindowProc(hWnd,msgID,wParam,lParam);}}return 0;}
//效果图,底部为工具栏控件