www.gusucode.com > VC++ 网络视频语音系统-源码程序 > VC++ 网络视频语音系统-源码程序/code/PROJECT/UI/GraphDlg.cpp

    //NetTalk
/*------------------------------------------------------------------------------*\
 =============================
   模块名称: GraphDlg.cpp
 =============================
 
 [版权]
 
   2000-2002  115软件工厂  版权所有
                                              
\*------------------------------------------------------------------------------*/

#include "wndx.h"
#include "GraphDlg.h"
#include <Windowsx.h>
#include "resource.h"
#define BORDER_WIDTH 1
#define TITLE_HEIGHT 18



/*------------------------------------------------------------------------------*/
CGraphDlg::CGraphDlg()
{
	m_bHilight=0;
	m_hbBkS=CreateSolidBrush(0x00b9b4b3);//Static ctrl's bg color
	m_hbBkE=CreateSolidBrush(0x00ffffff);//Edit ctrl's bg color
}


/*------------------------------------------------------------------------------*/
CGraphDlg::~CGraphDlg()
{
	if(m_hbBkS)
		DeleteObject(m_hbBkS);
	if(m_hbBkE)
		DeleteObject(m_hbBkE);
}
/*------------------------------------------------------------------------------*/
LRESULT CGraphDlg::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	
	case WM_CTLCOLORSTATIC:
		{
			SetBkMode((HDC)wParam,TRANSPARENT);
			return (LRESULT)m_hbBkS;
		}
		break;
	case WM_CTLCOLOREDIT:
		{
			SetTextColor((HDC)wParam,0x00632201);
			return (LRESULT)m_hbBkE;
		}
		break;
	case WM_DESTROY:
		OnDestroy();
		break;
	case WM_INITDIALOG:
		
		return OnInitDialog();
		break;
	case WM_COMMAND:
		return OnCommand(wParam,lParam);
		
		break;
	case WM_ERASEBKGND:
		OnEraseBkgnd((HDC)wParam);
		return TRUE;
	
	
	case WM_MOUSEMOVE:
		{
			POINT point;
			point.x=GET_X_LPARAM(lParam); 
			point.y=GET_Y_LPARAM(lParam); 
			OnMouseMove(wParam,point);
		}
		break;
	case WM_LBUTTONDOWN:
		{
			POINT point;
			point.x=GET_X_LPARAM(lParam); 
			point.y=GET_Y_LPARAM(lParam); 
			OnLButtonDown(wParam,point);	
		}
		break;
	case WM_TIMER:
		OnTimer(wParam);
		break;
	default:
		return CDialogX::WndProc(uMsg,wParam,lParam);
	}
	return TRUE;

}

/*------------------------------------------------------------------------------*/

void CGraphDlg::OnEraseBkgnd(HDC hdc)
{
	
	CRectX rc;
	GetClientRect(m_hWnd,&rc);
	HDC hMemDC=CreateCompatibleDC(hdc);
	HBITMAP hb=CreateCompatibleBitmap(hdc,rc.Width(),rc.Height());
	HBITMAP hob=(HBITMAP)SelectObject(hMemDC,hb);
	//画客户区

	FillSolidRectX(hMemDC,CRectX(rc.left+2,BORDER_WIDTH,rc.right-2,rc.bottom-2),0x00b9b4b3);
	//画标题栏
	DrawTitleBar(hMemDC);
	
	//画框架
	DrawRectX(hMemDC,rc,0);
	CRectX rc2;
	rc2=rc;
	InflateRect(&rc2,-1,-1);
	Draw3dRectX(hMemDC,rc2,0x00e8e8e8,0x009c9c9c,1);
	
	BitBlt(hdc,0,0,rc.Width(),rc.Height(),hMemDC,0,0,SRCCOPY);
	SelectObject(hMemDC,hob);
	DeleteObject(hb);
	DeleteDC(hMemDC);
}

/*------------------------------------------------------------------------------*/
//make the title bar dragable
void CGraphDlg::OnLButtonDown(UINT nFlags, POINT &point)
{	
	
	if(PtInRegion(m_hTRgn,point.x,point.y))
	{

		SetCapture(m_hWnd);
		
		RECT rc;
		GetWindowRect(m_hWnd,&rc);
		MSG msg;
		while(GetMessage(&msg, NULL, 0, 0))
		{
			if (GetCapture()!=m_hWnd)
			{
				DispatchMessage(&msg);
				break;
			}
			switch(msg.message)
			{
			case WM_MOUSEMOVE:
				{
					POINT pt;
					pt.x=GET_X_LPARAM(msg.lParam);
					pt.y=GET_Y_LPARAM(msg.lParam);
					rc.left+=pt.x-point.x;
					rc.top+=pt.y-point.y;
					SetWindowPos(m_hWnd,0,rc.left,
						rc.top,0,0,SWP_NOSIZE);
				}
				break;
			case WM_LBUTTONUP:
				
				goto EXITLOOP1;					
				
			default:
				DispatchMessage(&msg);
				break;
				
			}
		}
EXITLOOP1:
		ReleaseCapture();
	}
}
/*------------------------------------------------------------------------------*/
//Hilight the title bar when mouse hover the title bar
void CGraphDlg::OnMouseMove(UINT nFlags, POINT &point)
{
	if(PtInRegion(m_hTRgn,point.x,point.y))
	{
		if(!m_bHilight)
		{
			m_bHilight=TRUE;
			HDC hdc=GetDC(m_hWnd);
			DrawTitleBar(hdc);
			ReleaseDC(m_hWnd,hdc);
			SetTimer(m_hWnd,101,50,0);
		}
	}
}


/*------------------------------------------------------------------------------*/
//
BOOL CGraphDlg::OnInitDialog()
{
	RECT rc;
	//
	
	GetClientRect(m_hWnd,&rc);
	//make the title bar region
	POINT pt[4];
	pt[0].x=2;
	pt[0].y=2;
	pt[1].x=rc.right-30;
	pt[1].y=2;
	pt[2].x=rc.right-30-TITLE_HEIGHT;
	pt[2].y=TITLE_HEIGHT+BORDER_WIDTH;
	pt[3].x=2;
	pt[3].y=TITLE_HEIGHT+BORDER_WIDTH;
	m_hTRgn=CreatePolygonRgn(pt,4,ALTERNATE);

	//create the close button
	rc.left=rc.right-20;
	rc.right-=8;
	rc.top=5;
	rc.bottom=17;
	m_btnClose.LoadBitmaps(IDB_CLOSE1,IDB_CLOSE2,IDB_CLOSE3);
	m_btnClose.Create(rc,m_hWnd,IDC_CLOSE);
	return FALSE;
}
/*------------------------------------------------------------------------------*/
BOOL CGraphDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
	CDialogX::OnCommand(wParam,lParam);
	switch(LOWORD(wParam))
	{
	case IDC_CLOSE:
		SendMessage(m_hWnd,WM_CLOSE,0,0);
		break;
	}
	return TRUE;
}
/*------------------------------------------------------------------------------*/
void CGraphDlg::DrawTitleBar(HDC hdc)
{
	//file the title bar region,and make it 3d look
	RECT rc;
	GetClientRect(m_hWnd,&rc);
	HBRUSH hbr;
	if(m_bHilight)
		hbr=CreateSolidBrush(0x00886655);		
	else
		hbr=CreateSolidBrush(0x00553322);		

	FillRgn(hdc,m_hTRgn,hbr);
	DeleteObject(hbr);
	
	HPEN hp=CreatePen(PS_SOLID,1,0);
	HPEN hop=(HPEN)SelectObject(hdc,hp);
	MoveToEx(hdc,2,TITLE_HEIGHT+BORDER_WIDTH,0);
	LineTo(hdc,2,2);
	LineTo(hdc,rc.right-30,2);
	SelectObject(hdc,hop);
	DeleteObject(hp);
	hp=CreatePen(PS_SOLID,1,0x00eeeeee);
	hop=(HPEN)SelectObject(hdc,hp);
	LineTo(hdc,rc.right-30-TITLE_HEIGHT+1,TITLE_HEIGHT+BORDER_WIDTH);
	LineTo(hdc,1,TITLE_HEIGHT+BORDER_WIDTH);
	SelectObject(hdc,hop);
	DeleteObject(hp);

	//画标题栏caption
	char szTitle[64]="";
	NONCLIENTMETRICS ncm;
	ncm.cbSize = sizeof(ncm);
	SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
	HFONT hf=CreateFontIndirect(&ncm.lfCaptionFont);
	HFONT hof=(HFONT)SelectObject(hdc,hf);
	SetBkMode(hdc,TRANSPARENT);
	SetTextColor(hdc,0x00ffffff);
	GetWindowText(m_hWnd,szTitle,63);
	
	DrawText(hdc,szTitle,strlen(szTitle),&CRectX(6,4,rc.right-30,30),DT_LEFT);
	SelectObject(hdc,hof);
	DeleteObject(hf);
}
/*------------------------------------------------------------------------------*/
//when the mouse leave the region of title bar ,recover the title bar
void CGraphDlg::OnTimer(UINT nIDEvent)
{
	if(nIDEvent==101)
	{
		DWORD dw=GetMessagePos();
		POINT pt;
		pt.x=GET_X_LPARAM(dw);
		pt.y=GET_Y_LPARAM(dw);
		ScreenToClient(m_hWnd,&pt);
		if(m_bHilight)
		{
					
			if(!PtInRegion(m_hTRgn,pt.x,pt.y))
			{
				RECT rc;
				SetRect(&rc,2,2,119,16);
				m_bHilight=FALSE;
				HDC hdc=GetDC(m_hWnd);
				
				DrawTitleBar(hdc);
				ReleaseDC(m_hWnd,hdc);
				KillTimer(m_hWnd,nIDEvent);
			}
			
			
		}
	}
}
/*------------------------------------------------------------------------------*/
//
void CGraphDlg::OnDestroy()
{
	DeleteObject(m_hTRgn);
}