完整的应用代码下载
代码实现在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));
}else
t=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为工具栏的ID
NMLVCUSTOMDRAW *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;
}
//效果图,底部为工具栏控件
