15,978
社区成员
发帖
与我相关
我的任务
分享
LRESULT CSkinObjectBase::WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_NCCALCSIZE:
return OnNcCalcSize((BOOL)wParam, (NCCALCSIZE_PARAMS *)lParam );
。。。。。。。。。
}
}
LRESULT CSkinFrameBase::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS *lpncsp)
{
if ( bCalcValidRects )
{
CRect oldrect = lpncsp->rgrc[0];
NcCalcSize(lpncsp->rgrc[0]);
lpncsp->rgrc[1] = lpncsp->rgrc[0];
return 0;
}
return Default();
}
void CSkinFrameBase::NcCalcSize(RECT& rect)
{
if (HasCaption())
{
rect.left += m_nBorderLeftWidth;//窗体左边框的宽度
rect.right -= m_nBorderRightWidth;//窗体右边框的宽度
rect.top += m_nTitleHeight; //窗体标题栏的高度
rect.bottom -= m_nBorderBottomHeight;//窗体底边框的高度
}
。。。。。。。。
}
LRESULT CSkinFrameBase::OnNcPaint(HDC hDC)
{
CWindowDC dc(m_hWnd);
DrawTitleBar(&dc);
return TRUE;
}
void CSkinFrameBase::DrawTitleBar(CDC* pDC)
{
CRect wr,rClient;
GetDrawRect(wr,rClient);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap bmpFrame;
bmpFrame.CreateCompatibleBitmap(pDC,wr.Width(),wr.Height());
CBitmap* pOldbmp = memDC.SelectObject(&bmpFrame);
DrawFrame(memDC,!m_bActive,1);
CRect rSkinDraw(wr);
rSkinDraw.bottom = rSkinDraw.top + m_nTitleHeight;
rSkinDraw.left = m_pFrameBase->bDefaultDraw ? m_nBorderLeftWidth : 0;
rSkinDraw.right -= m_pFrameBase->bDefaultDraw ? m_nBorderRightWidth : 0;
DrawTitleBarText(memDC,rSkinDraw);
//////////////////////////////////////////////////////////////////////////
rSkinDraw = wr;
rSkinDraw.bottom = rSkinDraw.top + m_nTitleHeight;
DrawSystemButton(&memDC,rSkinDraw);
int nSavedDC = pDC->SaveDC();
CRect rcClip = GetExcludeClipRect();
pDC->ExcludeClipRect(rcClip);
pDC->BitBlt( 0, 0, wr.Width(),wr.Height(), &memDC, 0, 0, SRCCOPY );
pDC->RestoreDC(nSavedDC);
memDC.SelectObject(pOldbmp);
bmpFrame.DeleteObject();
memDC.DeleteDC();//*/
}
LRESULT CSkinFrameBase::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
LRESULT lResult = Default();
if (m_uCustomBtnHitTest != HTNOWHERE)
{
::SendMessage(m_hWndHooked,SM_TITLELBUTTONUP,(WPARAM)m_uCustomBtnHitTest,MAKELPARAM(point.x,point.y));
m_downHitTest = 0;
m_moveHitTest = 0;
OnNcPaint(NULL);
return lResult;
}
switch (nHitTest)
{
case HTCLOSE:
{
if (m_closeable)
{
//应该用postmessage
lResult = ::PostMessage(m_hWndHooked,WM_SYSCOMMAND,(WPARAM)SC_CLOSE,MAKELPARAM(point.x,point.y));
return lResult;
}
}
break;
................
}
}