// DialogXP.cpp: implementation of the CDialogXP class. // ////////////////////////////////////////////////////////////////////// //#include "stdafx.h" //#include "test.h" //#include ////////////////////////////////////////////////////////////////////// /**************以下设置必需包含在每个子类中**********************/ //头部 //////////////////////////////////////////////////////////////////////////////////////////////////// // 编译预处理 #if _WIN32_WINNT < 0x0400 #define _WIN32_WINNT 0x0400 #endif // 强制使用 C 语言方式编译 #ifdef __cplusplus extern "C" { #endif // __cplusplus //////////////////////////////////////////////////////////////////////////////////////////////////// #include "DialogXP.h" //////////////////////////////////////////////////////////////////////////////////////////////////// // 全局变量 extern HHOOK g_hPrevHookXP ; // 窗口消息 HOOK 句柄 extern PCLASSXP g_pClassXP ; // 窗口的 CLASSXP 结构指针 extern COLORREF g_crDialogbkColor; // 窗口背景颜色 //WndColor[0]窗体颜色最深点, WndColor[1]为窗体的本色,WndColor[2]为最亮点的颜色,WndColor[3]为国次亮点颜色, WndColor[4]为国次次亮点颜色 const COLORREF WndColor[]={ RGB(0,32,175), RGB(0,81,229), RGB(144,175,249), RGB(43,144,255), RGB(13,134,255)}; const COLORREF WndColorUnAct[]={ RGB(79,83,188), RGB(104,141,224), RGB(132,159,234), RGB(152,178,232), RGB(129,167,232) }; const COLORREF MinMaxBTColor[]={ RGB(132,159,234), RGB(104,141,224) }; const COLORREF MinMaxBTColorAct[]={ RGB(144,175,249), RGB(0,81,229) }; const COLORREF MinMaxBTColorMsOn[]={ RGB(132,159,234), RGB(13,134,255) }; const COLORREF ExitBTColor[]={ RGB(180,155,185), RGB(175,102,115) }; const COLORREF ExitBTColorAct[]={ RGB(240,169,151), RGB(228,61,5) }; const COLORREF ExitBTColorMsOn[]={ RGB(240,169,151), RGB(238,101,35) }; //画按钮 //void DlgDrawButton2(HWND hWnd, HDC hdc, RECT rt, UINT iType, BOOL bActive, BOOL bAble, BOOL bMouseOn) //句柄、句柄、区域、类型、状态、有效 void DlgDrawButton2(HWND hWnd, HDC hdc, RECT rt, UINT iType, UINT nState, BOOL bAble) { RECT rttmp; // HPEN hPen; COLORREF colors[4]; COLORREF Pencolor=RGB(255,255,255); HANDLE hHandle; //画按钮边框 // pen.CreatePen(PS_SOLID, 1, Pencolor); hHandle = (HANDLE) SelectObject(hdc,CreatePen(PS_SOLID, 1, Pencolor)); // DeleteObject(SelectObject(hDC,(HGDIOBJ) hHandle)); // ::SelectObject(hdc, pen.m_hObject); ::MoveToEx(hdc, rt.left+1, rt.top, NULL); ::LineTo(hdc, rt.right, rt.top); ::MoveToEx(hdc, rt.right, rt.top+1, NULL); ::LineTo(hdc, rt.right, rt.bottom); ::MoveToEx(hdc, rt.right-1, rt.bottom, NULL); ::LineTo(hdc, rt.left, rt.bottom); ::MoveToEx(hdc, rt.left, rt.bottom-1, NULL); ::LineTo(hdc, rt.left, rt.top); //给按钮填充平滑颜色 if ( iType == 0 ) //EXIT { if (nState == StateFocus) { colors[0]=ExitBTColorMsOn[0]; colors[1]=ExitBTColorMsOn[1]; colors[2]=ExitBTColorMsOn[1]; colors[3]=ExitBTColorMsOn[1]; } else if(nState == StateDown) { colors[0]=ExitBTColor[0]; colors[1]=ExitBTColor[1]; colors[2]=ExitBTColor[1]; colors[3]=ExitBTColor[1]; } else { colors[0]=ExitBTColorAct[0]; colors[1]=ExitBTColorAct[1]; colors[2]=ExitBTColorAct[1]; colors[3]=ExitBTColorAct[1]; } } else //其它 { if (nState == StateFocus) { colors[0]=MinMaxBTColorMsOn[0]; colors[1]=MinMaxBTColorMsOn[1]; colors[2]=MinMaxBTColorMsOn[1]; colors[3]=MinMaxBTColorMsOn[1]; } else if(nState == StateDown) { colors[0]=MinMaxBTColor[0]; colors[1]=MinMaxBTColor[1]; colors[2]=MinMaxBTColor[1]; colors[3]=MinMaxBTColor[1]; } else { colors[0]=MinMaxBTColorAct[0]; colors[1]=MinMaxBTColorAct[1]; colors[2]=MinMaxBTColorAct[1]; colors[3]=MinMaxBTColorAct[1]; } } SetRect(&rttmp, rt.left+1, rt.top+1, rt.right, rt.bottom); GradientRectXP2( hdc, rttmp, colors, GRADIENT_FILL_TRIANGLE ); Pencolor = bAble? RGB(255,255,255):RGB(200,200,200); //画按扭内部图型 DeleteObject(SelectObject(hdc,(HGDIOBJ) hHandle)); switch( iType ) { case 0: hHandle = (HANDLE) SelectObject(hdc,CreatePen(PS_SOLID, 2, Pencolor)); // pen.DeleteObject(); // pen.CreatePen(PS_SOLID, 2, Pencolor); // ::SelectObject(hdc, pen.m_hObject); ::MoveToEx(hdc, rt.left+4, rt.top+4, NULL); ::LineTo(hdc, rt.right-4, rt.bottom-4); ::MoveToEx(hdc, rt.right-4, rt.top+4, NULL); ::LineTo(hdc, rt.left+4, rt.bottom-4); DeleteObject(SelectObject(hdc,(HGDIOBJ) hHandle)); break; case 1: //MAX hHandle = (HANDLE) SelectObject(hdc,CreatePen(PS_SOLID, 1, Pencolor)); // pen.DeleteObject(); // pen.CreatePen(PS_SOLID, 1, Pencolor); // ::SelectObject(hdc, pen.m_hObject); ::MoveToEx(hdc, rt.left+3, rt.top+4, NULL); ::LineTo(hdc, rt.right-3, rt.top+4); ::MoveToEx(hdc, rt.left+3, rt.top+5, NULL); ::LineTo(hdc, rt.right-4, rt.top+5); ::LineTo(hdc, rt.right-4, rt.bottom-4); ::LineTo(hdc, rt.left+3, rt.bottom-4); ::LineTo(hdc, rt.left+3, rt.top+5); DeleteObject(SelectObject(hdc,(HGDIOBJ) hHandle)); break; case 2: //RESTORE hHandle = (HANDLE) SelectObject(hdc,CreatePen(PS_SOLID, 1, Pencolor)); // pen.DeleteObject(); // pen.CreatePen(PS_SOLID, 1, Pencolor); // ::SelectObject(hdc, pen.m_hObject); ::MoveToEx(hdc, rt.left+6, rt.top+4, NULL); ::LineTo(hdc, rt.right-4, rt.top+4); ::LineTo(hdc, rt.right-4, rt.bottom-6); ::LineTo(hdc, rt.left+6, rt.bottom-6); ::LineTo(hdc, rt.left+6, rt.top+4); ::MoveToEx(hdc, rt.left+4, rt.top+6, NULL); ::LineTo(hdc, rt.right-6, rt.top+6); ::LineTo(hdc, rt.right-6, rt.bottom-4); ::LineTo(hdc, rt.left+4, rt.bottom-4); ::LineTo(hdc, rt.left+4, rt.top+6); DeleteObject(SelectObject(hdc,(HGDIOBJ) hHandle)); break; case 3: //MIN hHandle = (HANDLE) SelectObject(hdc,CreatePen(PS_SOLID, 2, Pencolor)); // pen.DeleteObject(); // pen.CreatePen(PS_SOLID,2,Pencolor); // ::SelectObject(hdc, HPEN(pen)); ::MoveToEx(hdc, rt.left+3, rt.bottom-5, NULL); ::LineTo(hdc, rt.right-6, rt.bottom-5); DeleteObject(SelectObject(hdc,(HGDIOBJ) hHandle)); break; case 4: //HELP ::SetTextColor(hdc, RGB(255,255,255)); ::SetBkMode(hdc, TRANSPARENT); rttmp = rt; ::DrawText(hdc, "?", 1, &rttmp, DT_VCENTER|DT_CENTER); break; default:break; } } /////////////////////////////////////////////////////////// void DlgDrawHelpButton(HWND hWnd,HDC hDC, RECT Rect) { static COLORREF s_crGradientXP[][4] = { {0x00C1CCD1, 0x00C1CCD1, 0x00EEF1F2, 0xFFEEF1F2}, {0x00CFF0FF, 0x00CFF0FF, 0x000097E5, 0xFF0097E5}, {0x00BDCBD6, 0x00C6CFD6, 0x00EFF3F7, 0xFFEFF3F7}, {0x00FFE7CE, 0x00FFE7CE, 0x00EE8269, 0xFFEE8269}, {0x00FFFFFF, 0x00FFFFFF, 0x00D6DFE2, 0xFFD6DFE2}, }; DWORD dwStyle ; int nWidth; RECT rc; dwStyle = GetWindowLong(hWnd, GWL_STYLE); if (!(dwStyle & WS_SYSMENU)) return; if (!(dwStyle & WS_EX_CONTEXTHELP))return; nWidth = Rect.bottom - Rect.top - 3; rc.top = Rect.top ; rc.bottom = rc.top + nWidth; if(dwStyle & WS_MAXIMIZEBOX || dwStyle & WS_MINIMIZEBOX) { rc.left = Rect.right - 4*(nWidth + 2); rc.right = rc.left + nWidth; } else { rc.left = Rect.right - 2*(nWidth + 2); rc.right = rc.left + nWidth; } DlgDrawButton2(hWnd,hDC, rc, 4, StateFocus, TRUE); /* if(dwStyle & WS_MAXIMIZEBOX || dwStyle & WS_MINIMIZEBOX) { rc.left = Rect.right - 4*(nWidth +4) -2; rc.right = rc.left + nWidth; GradientRectXP(hDC, &rc, s_crGradientXP[2]); RoundRect(hDC, rc.left-2, rc.top -2, rc.right +2, rc.bottom +2, 4,4); } ::SetTextColor(hDC, RGB(255,255,255)); ::SetBkMode(hDC, TRANSPARENT); ::DrawText(hDC, "~", 1, &rc, DT_VCENTER|DT_CENTER); */ } /////////////////////////////////////////////////////////// void DlgDrawExitButton(HWND hWnd,HDC hDC, RECT Rect, int iState) { /* static COLORREF s_crGradientXP[][4] = { {RGB(180,155,185), RGB(175,102,115), RGB(175,102,115), RGB(175,102,115)}, {0x00CFF0FF, 0x00CFF0FF, 0x000097E5, 0xFF0097E5}, {RGB(240,169,151), RGB(228,61,5), RGB(228,61,5), RGB(228,61,5)}, {RGB(240,169,151), RGB(238,101,35), RGB(238,101,35), RGB(238,101,35)}, {0x00FFFFFF, 0x00FFFFFF, 0x00D6DFE2, 0xFFD6DFE2}, }; */ DWORD dwStyle ; int nWidth; RECT rc; dwStyle = GetWindowLong(hWnd, GWL_STYLE); if(!(dwStyle & WS_SYSMENU)) return; nWidth = Rect.bottom - Rect.top - 3; rc.top = Rect.top ; rc.bottom = rc.top + nWidth; rc.left = Rect.right - (nWidth+ 2); rc.right = rc.left + nWidth; DlgDrawButton2(hWnd,hDC, rc, 0, iState, TRUE); /* rc.left = Rect.right - (nWidth+ 4); rc.right = rc.left + nWidth; GradientRectXP(hDC, &rc, s_crGradientXP[iState]); MoveToEx(hDC, rc.left + 3, rc.top + 3, NULL); LineTo(hDC, rc.right - 3, rc.bottom - 3); MoveToEx(hDC, rc.right - 3, rc.top + 3, NULL); LineTo(hDC, rc.left + 3, rc.bottom - 3); RoundRect(hDC, rc.left-2, rc.top -2, rc.right +2, rc.bottom +2, 4,4); */ // } } /////////////////////////////////////////////////////////// void DlgDrawMinButton(HWND hWnd, HDC hDC, RECT Rect, int iState) { /* static COLORREF s_crGradientXP[][4] = { {0x00C1CCD1, 0x00C1CCD1, 0x00EEF1F2, 0xFFEEF1F2}, {0x00CFF0FF, 0x00CFF0FF, 0x000097E5, 0xFF0097E5}, {0x00BDCBD6, 0x00C6CFD6, 0x00EFF3F7, 0xFFEFF3F7}, {0x00FFE7CE, 0x00FFE7CE, 0x00EE8269, 0xFFEE8269}, {0x00FFFFFF, 0x00FFFFFF, 0x00D6DFE2, 0xFFD6DFE2}, }; DWORD dwStyle ; int nWidth; RECT rc; dwStyle = GetWindowLong(hWnd, GWL_STYLE); nWidth = Rect.bottom - Rect.top - 8; rc.top = Rect.top +4; rc.bottom = rc.top + nWidth; //重画最小化button if(dwStyle & WS_MAXIMIZEBOX || dwStyle & WS_MINIMIZEBOX) { rc.left = Rect.right - 3*(nWidth +4) -2; rc.right = rc.left + nWidth; GradientRectXP(hDC, &rc, s_crGradientXP[iState]); MoveToEx(hDC, rc.left + 4, rc.bottom - 4, NULL); LineTo(hDC, rc.right - 4, rc.bottom - 4); MoveToEx(hDC, rc.left + 4, rc.bottom - 5, NULL); LineTo(hDC, rc.right - 4, rc.bottom - 5); RoundRect(hDC, rc.left-2, rc.top -2, rc.right +2, rc.bottom +2, 4,4); } */ DWORD dwStyle ; int nWidth; RECT rc; dwStyle = GetWindowLong(hWnd, GWL_STYLE); if(!(dwStyle & WS_SYSMENU)) return; //重画最大化/恢复button if(dwStyle & WS_MINIMIZEBOX) { nWidth = Rect.bottom - Rect.top - 3; rc.top = Rect.top; rc.bottom = rc.top + nWidth; rc.left = Rect.right - 3*(nWidth+2) ; rc.right = rc.left + nWidth; DlgDrawButton2(hWnd,hDC, rc, 3, iState, dwStyle & WS_MINIMIZEBOX); } } /////////////////////////////////////////////////////////// void DlgDrawMaxButton(HWND hWnd,HDC hDC, RECT Rect, int iState) { /* static COLORREF s_crGradientXP[][4] = { {0x00C1CCD1, 0x00C1CCD1, 0x00EEF1F2, 0xFFEEF1F2}, {0x00CFF0FF, 0x00CFF0FF, 0x000097E5, 0xFF0097E5}, {0x00BDCBD6, 0x00C6CFD6, 0x00EFF3F7, 0xFFEFF3F7}, {0x00FFE7CE, 0x00FFE7CE, 0x00EE8269, 0xFFEE8269}, {0x00FFFFFF, 0x00FFFFFF, 0x00D6DFE2, 0xFFD6DFE2}, }; DWORD dwStyle ; int nWidth; RECT rc; dwStyle = GetWindowLong(hWnd, GWL_STYLE); nWidth = Rect.bottom - Rect.top - 8; rc.top = Rect.top +4; rc.bottom = rc.top + nWidth; //重画最大化/恢复button if(dwStyle & WS_MAXIMIZEBOX || dwStyle & WS_MINIMIZEBOX) { rc.left = Rect.right - 2*(nWidth + 4) - 1; rc.right = rc.left + nWidth; GradientRectXP(hDC, &rc, s_crGradientXP[iState]); MoveToEx(hDC, rc.left + 2, rc.top + 5, NULL); LineTo(hDC, rc.left + 9, rc.top + 5); MoveToEx(hDC, rc.left + 5, rc.top + 2, NULL); LineTo(hDC, rc.left + 5, rc.top + 9); RoundRect(hDC, rc.left-2, rc.top -2, rc.right +2, rc.bottom +2, 4,4); } */ DWORD dwStyle ; int nWidth; RECT rc; dwStyle = GetWindowLong(hWnd, GWL_STYLE); if(!(dwStyle & WS_SYSMENU)) return; //重画最大化/恢复button if(dwStyle & WS_MAXIMIZEBOX || dwStyle & WS_MINIMIZEBOX) { nWidth = Rect.bottom - Rect.top - 3; rc.top = Rect.top; rc.bottom = rc.top + nWidth; rc.left = Rect.right - 2*(nWidth+2) ; rc.right = rc.left + nWidth; if (IsZoomed(hWnd) ) //没有最大化 DlgDrawButton2(hWnd,hDC, rc, 1, iState, dwStyle & WS_MAXIMIZEBOX); else DlgDrawButton2(hWnd,hDC, rc, 2, iState, dwStyle & WS_MAXIMIZEBOX); } } //画菜单按钮 BOOL DlgDrawTitleBarButtons(PCLASSXP pCxp, HDC hDC) { // int iExit = 0, iMax = 0, iMin = 0; // HANDLE hHandle, hOldBrush; //取得标题栏的位置 RECT Rect, rc; GetWindowRect(pCxp->hWnd, &rc); Rect.left = GetSystemMetrics(SM_CXDLGFRAME); Rect.top = GetSystemMetrics(SM_CYDLGFRAME); Rect.right = rc.right - rc.left - GetSystemMetrics(SM_CXDLGFRAME); Rect.bottom = Rect.top + GetSystemMetrics(SM_CYCAPTION); PDIALOGXP pDlg = (PDIALOGXP)pCxp->pData; //画标题栏按扭 DWORD dwStyle = GetWindowLong(pCxp->hWnd, GWL_STYLE); /* if(pDlg->m_ExitButtonState == StateNormal) { iExit = 2; } else if(pDlg->m_ExitButtonState == StateDown) { iExit = 0; } else if(pDlg->m_ExitButtonState == StateFocus) { iExit = 3; } if(WS_MAXIMIZEBOX & dwStyle) //最大化按钮 { if(IsZoomed(pCxp->hWnd))//最大化 { if(pDlg->m_MaximizeButtonState == StateNormal) { iMax = 2; } else if(pDlg->m_MaximizeButtonState == StateDown) { iMax = 0; } else if(pDlg->m_MaximizeButtonState == StateFocus) { iMax = 3; } } else { if(pDlg->m_MaximizeButtonState == StateNormal) { iMax = 2; } else if(pDlg->m_MaximizeButtonState == StateDown) { iMax = 0; } else if(pDlg->m_MaximizeButtonState == StateFocus) { iMax = 3; } } } else if(WS_MINIMIZEBOX & dwStyle) //最小化按钮 { if(IsZoomed(pCxp->hWnd))//最大化 { iMin = 4; } else { iMax = 4; } } if(WS_MINIMIZEBOX & dwStyle) //最小化按钮 { if(pDlg->m_MinimizeButtonState == StateNormal) { iMin = 2; } else if(pDlg->m_MinimizeButtonState == StateDown) { iMin = 0; } else if(pDlg->m_MinimizeButtonState == StateFocus) { iMin = 3; } } else if(WS_MAXIMIZEBOX & dwStyle)//最大化按钮 { iMin = 4; } //重画关闭button */ DlgDrawExitButton(pCxp->hWnd,hDC, Rect, pDlg->m_ExitButtonState); DlgDrawMinButton(pCxp->hWnd,hDC, Rect, pDlg->m_MinimizeButtonState); DlgDrawMaxButton(pCxp->hWnd,hDC, Rect, pDlg->m_MaximizeButtonState); DlgDrawHelpButton(pCxp->hWnd,hDC, Rect);//, pDlg->m_ExitButtonState); return TRUE; } //////////////////////////////////////////////////////////////////////////////////////////////////// // 绘制弹出窗口 LRESULT DlgOnNcPaint(PCLASSXP pCxp, WPARAM wParam) { RECT Rect; // MEMDCXP Mdcxp; HDC hDC; HRGN hRgn = NULL; GetWindowRect(pCxp->hWnd, &Rect); // 获取内存兼容设备场景 /* Mdcxp.hWnd = pCxp->hWnd; Mdcxp.bTransfer = FALSE; Mdcxp.hBitmap = NULL; GetMemDCXP(&Mdcxp); hDC = Mdcxp.hMemDC; */ hDC = GetWindowDC(pCxp->hWnd); HRGN hRgn2; if(wParam != 1) { hRgn = (HRGN)wParam; } if(hRgn != NULL) { SelectClipRgn(hDC, hRgn); OffsetClipRgn(hDC,0 - Rect.left,0 - Rect.top); } Rect.right -= Rect.left; Rect.bottom -= Rect.top; Rect.left = Rect.top = 0; if (!pCxp->hRgn) { if(!IsZoomed(pCxp->hWnd)) { // pCxp->hRgn = CreateRoundRectRgn(0,0,Rect.right ,Rect.bottom,10,10); pCxp->hRgn = CreateRoundRectRgn(0,0,Rect.right+1 ,Rect.bottom,16,16); hRgn2 = CreateRectRgn(Rect.left,Rect.bottom-10,Rect.right ,Rect.bottom); CombineRgn(pCxp->hRgn, pCxp->hRgn, hRgn2, RGN_OR); SetWindowRgn(pCxp->hWnd, pCxp->hRgn,TRUE); // set window region to make rounded window } } DlgDrawFrameBorder(pCxp, (WPARAM)hDC, hRgn); DlgDrawTitleBar(pCxp, (WPARAM)hDC); //输出 // Mdcxp.bTransfer = TRUE; // ReleaseMemDCXP(&Mdcxp); if(hRgn != NULL) { SelectClipRgn(hDC,NULL); DeleteObject(hRgn); } ReleaseDC(pCxp->hWnd,hDC); return FALSE; } LRESULT DlgOnNcActive(PCLASSXP pCxp, WPARAM wParam, LPARAM lParam) { HDC hDC; PDIALOGXP pDlg = (PDIALOGXP)pCxp->pData; pCxp->dwState |= CXPS_FOCUS; hDC = GetWindowDC(pCxp->hWnd); DlgDrawTitleBar(pCxp, (WPARAM)hDC); ReleaseDC(pCxp->hWnd, hDC); return TRUE; } LRESULT DlgOnActive(PCLASSXP pCxp, WPARAM wParam,LPARAM lParam) { LRESULT result = CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_ACTIVATE, wParam, lParam); // PDIALOGXP pDlg = (PDIALOGXP)pCxp->pData ; if(wParam == WA_INACTIVE) pCxp->dwState &= ~CXPS_FOCUS; else pCxp->dwState |= CXPS_FOCUS; DlgOnNcPaint(pCxp,1); return result; } // Dialog 消息处理程序 BOOL DlgDrawFrameBorder(PCLASSXP pCxp, WPARAM wParam, HRGN hRgn) { COLORREF colors[2]; RECT Rect, rc; HANDLE hHandle,hHandle2, hHandle3; int nWidth, nHeight; BOOL bNcActive; /* static COLORREF s_crGradientXP[][4] = { {0x00FF900B, 0x00FF900B,0x00F7CBAD, 0x00FF350B }, {0x00D6DFDE, 0x00EFF3F7, 0x00EFF3F7, 0x00FFFFFF}, {0x00FBFCFC, 0x00FBFCFC, 0x00E6EBEC, 0xFFE6EBEC}, {0x00FFE7CE, 0x00FFE7CE, 0x00EE8269, 0xFFEE8269}, {0x00FFFFFF, 0x00FFFFFF, 0x00D6DFE2, 0xFFD6DFE2}, {0x00DEE3E7, 0x00E7E7E7, 0x00DEE3E7, 0xFFDEE3E7}, {0x00FBFCFC, 0x00FBFCFC, 0x00E6EBEC, 0xFFE6EBEC}, }; */ HDC hDC = (HDC)wParam; HRGN hRgn2; GetWindowRect(pCxp->hWnd, &Rect); Rect.right -= Rect.left; Rect.bottom -= Rect.top; Rect.left = Rect.top = 0; nWidth = GetSystemMetrics(SM_CXDLGFRAME); nHeight =GetSystemMetrics(SM_CYDLGFRAME); if (!pCxp->hRgn && !IsZoomed(pCxp->hWnd)) { pCxp->hRgn = CreateRoundRectRgn(0,0,Rect.right+1 ,Rect.bottom,16,16); hRgn2 = CreateRectRgn(Rect.left,Rect.bottom - 10,Rect.right-1 ,Rect.bottom); CombineRgn(pCxp->hRgn, pCxp->hRgn, hRgn2, RGN_OR); SetWindowRgn(pCxp->hWnd, pCxp->hRgn,FALSE); // set window region to make rounded window } if (pCxp->dwState & CXPS_FOCUS) bNcActive = TRUE; else bNcActive = FALSE; //left border colors[0]=bNcActive? WndColor[1]:WndColorUnAct[1]; colors[1]=bNcActive? WndColor[4]:WndColorUnAct[4]; hHandle = CreateSolidBrush(colors[0]); hHandle3 = CreateSolidBrush(colors[1]); rc = Rect; rc.right = Rect.left + nWidth-1; FillRect(hDC, &rc,(HBRUSH) hHandle); rc.left = nWidth-1; rc.right = nWidth; FillRect(hDC, &rc,(HBRUSH) hHandle3); //other colors[1]=bNcActive? WndColor[0]:WndColorUnAct[0]; hHandle2 = CreateSolidBrush(colors[1]); //top rc = Rect; rc.bottom = Rect.top + nHeight; FillRect(hDC, &rc,(HBRUSH) hHandle2); //right border rc = Rect; rc.left = Rect.right - nWidth; FillRect(hDC, &rc,(HBRUSH) hHandle2); //bottom rc = Rect; rc.top = Rect.bottom - nHeight; FillRect(hDC, &rc,(HBRUSH) hHandle2); DeleteObject(hHandle); DeleteObject(hHandle2); DeleteObject(hHandle3); return TRUE; } //////////////////////////////////////// //画标题栏2 //BOOL DlgDrawTitleBar(HWND hWnd, HDC hdc, CRect &rt, BOOL bNcActive) BOOL DlgDrawTitleBar(PCLASSXP pCxp, WPARAM wParam) { RECT Rect, rt, rt2; char szTemp[256]; HANDLE hHandle; HDC hDC; HICON hIcon; COLORREF colors[4]; BOOL bNcActive; int XofText, mid,windowStyle; if (pCxp->dwState & CXPS_FOCUS) bNcActive = TRUE; else bNcActive = FALSE; hDC = (HDC)wParam; //取得标题栏的位置 DWORD style =GetWindowLong(pCxp->hWnd, GWL_STYLE); if(!(style & WS_CAPTION)) return TRUE; // 获取窗口大小 GetWindowRect(pCxp->hWnd, &Rect); Rect.right -= Rect.left; Rect.bottom -= Rect.top; Rect.left = Rect.top = 0; rt = Rect; //计算标题大小 rt.left += GetSystemMetrics(SM_CXDLGFRAME); rt.right -= GetSystemMetrics(SM_CYDLGFRAME); rt.top += GetSystemMetrics(SM_CYDLGFRAME); rt.bottom = rt.top + GetSystemMetrics(SM_CYCAPTION); //填两角的底色 colors[0]=bNcActive? WndColor[1]:WndColorUnAct[1]; hHandle = CreateSolidBrush(colors[0]); rt2 = rt; rt2.right = rt.left + 10; FillRect(hDC,&rt, (HBRUSH)hHandle); rt2 = rt; rt2.left = rt.right - 10; FillRect(hDC,&rt, (HBRUSH)hHandle); DeleteObject(hHandle); colors[0]=bNcActive? WndColor[1]:WndColorUnAct[1]; colors[1]=bNcActive? WndColor[4]:WndColorUnAct[4]; Rect.left = 5; Rect.top = 0; Rect.right = rt.right; Rect.bottom = rt.bottom - 4; GradientRectXP2(hDC, Rect, colors, GRADIENT_FILL_RECT_V); colors[0]=bNcActive? WndColor[3]:WndColorUnAct[3]; colors[1]=bNcActive? WndColor[1]:WndColorUnAct[1]; Rect.left = 2; Rect.top = 1; Rect.right = rt.right; Rect.bottom = 5; GradientRectXP2(hDC, Rect, colors, GRADIENT_FILL_RECT_V); // GradientFill(hDC, CRect(2, 1, rt.right-4, 5), colors, GRADIENT_FILL_RECT_V); colors[0]=bNcActive? WndColor[4]:WndColorUnAct[4]; colors[1]=bNcActive? WndColor[1]:WndColorUnAct[1]; Rect.left = 5; Rect.top = rt.bottom-4; Rect.right = rt.right; Rect.bottom = rt.bottom; GradientRectXP2(hDC, Rect, colors, GRADIENT_FILL_RECT_V); // GradientFill(hDC, CRect(0, rt.bottom-4, rt.right, rt.bottom), colors, GRADIENT_FILL_RECT_V); XofText=4; //标题栏上文字的启始位置 mid=(rt.bottom-rt.top)/2; windowStyle=GetWindowLong(pCxp->hWnd, GWL_STYLE); if ( windowStyle & WS_SYSMENU ) { hIcon=(HICON)::SendMessage(pCxp->hWnd, WM_QUERYDRAGICON, 0, 0); if ( hIcon != NULL ) { //画小图标,并将文字启始位置右移 ::DrawIconEx(hDC, 5, mid-6, hIcon, 16, 16, 0, NULL, DI_NORMAL); XofText += 3+16; } } //画标题栏文字 if (GetWindowText(pCxp->hWnd, szTemp, sizeof(szTemp))) { SetTextColor(hDC, RGB(255,255,255)); SetBkMode(hDC,TRANSPARENT); hHandle = (HANDLE) SelectObject(hDC, (HGDIOBJ) SendMessage(pCxp->hWnd, WM_GETFONT, 0, 0)); rt.left += XofText; DrawText(hDC, szTemp, -1, &rt, DT_LEFT | DT_SINGLELINE | DT_VCENTER); SelectObject(hDC, (HGDIOBJ) hHandle); } //画标题按钮 DlgDrawTitleBarButtons(pCxp,hDC); return TRUE; } //////////////////////// //画标题1 /* BOOL DlgDrawTitleBar(PCLASSXP pCxp, WPARAM wParam) { RECT Rect, rc; char szTemp[256]; HANDLE hHandle; HDC hDC; // MEMDCXP Mdcxp; static COLORREF s_crGradientXP[][4] = { {0x00FF900B, 0x00FF900B,0x00F7CBAD, 0x00FF350B }, {0x00FFFFFF, 0x00FFFFFF,0x00FF900B, 0x00FF900B } }; // 获取内存兼容设备场景 // Mdcxp.hWnd = pCxp->hWnd; // Mdcxp.bTransfer = FALSE; // Mdcxp.hBitmap = NULL; // GetMemDCXP(&Mdcxp); // hDC = Mdcxp.hMemDC; hDC = (HDC)wParam; //取得标题栏的位置 DWORD style =GetWindowLong(pCxp->hWnd, GWL_STYLE); if((style & WS_CAPTION) != WS_CAPTION) return TRUE; // 获取窗口大小 GetWindowRect(pCxp->hWnd, &Rect); Rect.right -= Rect.left; Rect.bottom -= Rect.top; Rect.left = Rect.top = 0; rc = Rect; //计算标题大小 rc.left += GetSystemMetrics(SM_CXDLGFRAME); rc.right -= GetSystemMetrics(SM_CYDLGFRAME); rc.top += GetSystemMetrics(SM_CYDLGFRAME); rc.bottom = rc.top + GetSystemMetrics(SM_CYCAPTION); //画标题 hHandle = CreateSolidBrush(0x00FF350B); FillRect(hDC,&rc, (HBRUSH)hHandle); DeleteObject(hHandle); if (pCxp->dwState & CXPS_FOCUS) GradientRectXP(hDC, &rc, s_crGradientXP[0]); else GradientRectXP(hDC, &rc, s_crGradientXP[1]); //画图标 HICON hIcon = (HICON)SendMessage(pCxp->hWnd,WM_GETICON,ICON_SMALL,0); if (hIcon) { DrawIconEx(hDC,rc.left+6,rc.top+2,hIcon,16,16,0,NULL,DI_NORMAL); rc.left += 18; } //画标题栏文字 if (GetWindowText(pCxp->hWnd, szTemp, sizeof(szTemp))) { SetTextColor(hDC, 0x000000); SetBkMode(hDC,TRANSPARENT); hHandle = (HANDLE) SelectObject(hDC, (HGDIOBJ) SendMessage(pCxp->hWnd, WM_GETFONT, 0, 0)); DrawText(hDC, szTemp, -1, &rc, DT_LEFT | DT_SINGLELINE | DT_VCENTER); SelectObject(hDC, (HGDIOBJ) hHandle); } //画标题按钮 DlgDrawTitleBarButtons(pCxp,hDC); //输出 // Mdcxp.bTransfer = TRUE; // ReleaseMemDCXP(&Mdcxp); return TRUE; } */ LRESULT DlgOnEraseBackGround(PCLASSXP pCxp, WPARAM wParam, LPARAM lParam) { RECT Rect; HANDLE hHandle;//, hPen; //保存原来设备句柄 HDC hDC; hDC = (HDC)wParam; //有效区域的句柄 //客户区域 GetClientRect(pCxp->hWnd, &Rect); Rect.right -= Rect.left; Rect.bottom -= Rect.top; // Rect.left = Rect.top = 0; //画客户区 // if (pCxp->dwState & CXPS_FOCUS) // hHandle = CreateSolidBrush(WndColor[1]); // else // hHandle = CreateSolidBrush(WndColorUnAct[1]); //left border // FillRect(hDC,&Rect,(HBRUSH)hHandle); // DeleteObject(hHandle); // hHandle = SelectObject(hDC,CreateSolidBrush(0x00FFFFFF)); // hHandle = SelectObject(hDC,CreateSolidBrush(g_crDialogbkColor)); // RoundRect(hDC, Rect.left+2, Rect.top+2, // Rect.right-2 , Rect.bottom-10 , 8,8); // DeleteObject(SelectObject(hDC, (HGDIOBJ) hHandle)); /* hHandle = SelectObject(hDC,CreateSolidBrush(g_crDialogbkColor)); RoundRect(hDC, Rect.left, Rect.top, Rect.right , Rect.bottom , 4,4); DeleteObject(SelectObject(hDC, (HGDIOBJ) hHandle)); hPen = CreatePen( PS_SOLID, 0, RGB(0, 0, 0) ); // 圆角矩形(4,4) hHandle = SelectObject(hDC, hPen); Rectangle(hDC, Rect.left, Rect.top , Rect.right , Rect.bottom ); DeleteObject(SelectObject(hDC, hHandle)); */ hHandle = SelectObject(hDC,CreateSolidBrush(g_crDialogbkColor)); FillRect(hDC, &Rect,(HBRUSH) hHandle); DeleteObject(SelectObject(hDC, (HGDIOBJ) hHandle)); return true; } LRESULT DlgOnNodify(PCLASSXP pCxp,WPARAM wParam, LPARAM lParam) { LRESULT nRet = CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_NOTIFY, wParam, lParam); /* HDC hDC = GetWindowDC(pCxp->hWnd); DlgDrawTitleBar(pCxp, (WPARAM)hDC); ReleaseDC(pCxp->hWnd, hDC); */ return nRet; } LRESULT DlgOnActiveApp(PCLASSXP pCxp, WPARAM wParam,LPARAM lParam) { // LRESULT result = CDialog::WindowProc(WM_ACTIVATEAPP,wParam,lParam); LRESULT result = CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_ACTIVATEAPP, wParam, lParam); if (wParam) pCxp->dwState |= CXPS_FOCUS; else pCxp->dwState &= ~CXPS_FOCUS; return 0; } LRESULT DlgOnSetText(PCLASSXP pCxp, WPARAM wParam, LPARAM lParam) { LRESULT nRet = CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_SETTEXT, wParam, lParam); HDC hDC = GetWindowDC(pCxp->hWnd); DlgDrawTitleBar(pCxp, (WPARAM)hDC); ReleaseDC(pCxp->hWnd, hDC); return nRet; } LRESULT DlgOnSetIcon(PCLASSXP pCxp, WPARAM wParam, LPARAM lParam) { LRESULT nRet = CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_SETICON, wParam, lParam); HDC hDC; if(IsWindow(pCxp->hWnd)) { hDC = GetWindowDC(pCxp->hWnd); DlgDrawTitleBar(pCxp, (WPARAM)hDC); ReleaseDC(pCxp->hWnd, hDC); } return nRet; } LRESULT OnNcMouseMove(PCLASSXP pCxp ,WPARAM wParam,LPARAM lParam) { LRESULT result = 0; HDC hDC; hDC = GetWindowDC(pCxp->hWnd); PDIALOGXP pDlg = (PDIALOGXP)pCxp->pData; switch(wParam) { case HTMAXBUTTON: if(pDlg->m_NcMouseState == MouseStateNormal) { if(pDlg->m_MaximizeButtonState != StateFocus) { pDlg->m_MaximizeButtonState = StateFocus; pDlg->m_MinimizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; DlgDrawTitleBarButtons(pCxp, hDC); //RTDrawTitleBarButtons(&dc); } } else if(pDlg->m_NcMouseState == MouseStateDown) { if(pDlg->m_SelTitleButton == MaximizeButton) { if(pDlg->m_MaximizeButtonState != StateDown) { pDlg->m_MaximizeButtonState = StateDown; DlgDrawTitleBarButtons(pCxp, hDC); // RTDrawTitleBarButtons(&dc); } } else if(pDlg->m_SelTitleButton != NoneButton) { pDlg->m_MinimizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; DlgDrawTitleBarButtons(pCxp, hDC); //RTDrawTitleBarButtons(&dc); } } break; case HTMINBUTTON: if(pDlg->m_NcMouseState == MouseStateNormal) { if(pDlg->m_MinimizeButtonState != StateFocus) { pDlg->m_MinimizeButtonState = StateFocus; pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; DlgDrawTitleBarButtons(pCxp, hDC); //RTDrawTitleBarButtons(&dc); } } else if(pDlg->m_NcMouseState == MouseStateDown) { if(pDlg->m_SelTitleButton == MinimizeButton) { if(pDlg->m_MinimizeButtonState != StateDown) { pDlg->m_MinimizeButtonState = StateDown; DlgDrawTitleBarButtons(pCxp, hDC); // RTDrawTitleBarButtons(&dc); } } else if(pDlg->m_SelTitleButton != NoneButton) { pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; DlgDrawTitleBarButtons(pCxp, hDC); // RTDrawTitleBarButtons(&dc); } } break; case HTCLOSE: if(pDlg->m_NcMouseState == MouseStateNormal) { if(pDlg->m_ExitButtonState != StateFocus) { pDlg->m_ExitButtonState = StateFocus; pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_MinimizeButtonState = StateNormal; DlgDrawTitleBarButtons(pCxp, hDC); // RTDrawTitleBarButtons(&dc); } } else if(pDlg->m_NcMouseState == MouseStateDown) { if(pDlg->m_SelTitleButton == ExitButton) { if(pDlg->m_ExitButtonState != StateDown) { pDlg->m_ExitButtonState = StateDown; DlgDrawTitleBarButtons(pCxp, hDC); // RTDrawTitleBarButtons(&dc); } } else if(pDlg->m_SelTitleButton != NoneButton) { pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_MinimizeButtonState = StateNormal; DlgDrawTitleBarButtons(pCxp, hDC); // RTDrawTitleBarButtons(&dc); } } break; default: if(pDlg->m_ExitButtonState != StateNormal || pDlg->m_MinimizeButtonState != StateNormal || pDlg->m_MaximizeButtonState != StateNormal) { pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_MinimizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; DlgDrawTitleBarButtons(pCxp, hDC); // RTDrawTitleBarButtons(&dc); } result = 0;//DefWindowProc(WM_NCMOUSEMOVE,wParam,lParam); break; } ReleaseDC(pCxp->hWnd, hDC); return result; } LRESULT DlgOnNcLMouseDown(PCLASSXP pCxp, WPARAM wParam,LPARAM lParam) { LRESULT result = 0; DWORD dwStyle; HDC hDC; hDC = GetWindowDC(pCxp->hWnd); PDIALOGXP pDlg = (PDIALOGXP)pCxp->pData; dwStyle = GetWindowLong(pCxp->hWnd, GWL_STYLE); switch(wParam) { case HTMAXBUTTON: if(!(dwStyle & WS_MAXIMIZEBOX))return 0;//break; pDlg->m_NcMouseState = MouseStateDown; pDlg->m_SelTitleButton = MaximizeButton; pDlg->m_MaximizeButtonState = StateDown; //RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); SetCapture(pCxp->hWnd); /* if(!IsZoomed(pCxp->hWnd)) { SelectClipRgn(hDC,NULL); DeleteObject(pCxp->hRgn); pCxp->hRgn = NULL; ShowWindow(pCxp->hWnd,SW_SHOWMAXIMIZED); return TRUE; } */ break; case HTMINBUTTON: if(!(dwStyle & WS_MINIMIZEBOX)) return 0;//break; pDlg->m_NcMouseState = MouseStateDown; pDlg->m_SelTitleButton = MinimizeButton; pDlg->m_MinimizeButtonState = StateDown; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); SetCapture(pCxp->hWnd ); break; case HTCLOSE: if(!(dwStyle & WS_SYSMENU)) return 0;//break; pDlg->m_NcMouseState = MouseStateDown; pDlg->m_SelTitleButton = ExitButton; pDlg->m_ExitButtonState = StateDown; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); SetCapture(pCxp->hWnd); break; default: //移动 //屏闭标题栏,禁止原标题栏重绘 dwStyle = GetWindowLong(pCxp->hWnd, GWL_STYLE); if(!(dwStyle & WS_CAPTION))break; dwStyle &= ~WS_CAPTION; SetWindowLong(pCxp->hWnd, GWL_STYLE, dwStyle); result =DefWindowProc(pCxp->hWnd, WM_NCLBUTTONDOWN, wParam, lParam); dwStyle |= WS_CAPTION; SetWindowLong(pCxp->hWnd, GWL_STYLE, dwStyle); result = 0; break; } DlgDrawTitleBar(pCxp, (WPARAM)hDC); ReleaseDC(pCxp->hWnd, hDC); return result; } LRESULT DlgOnNcLMouseUp(PCLASSXP pCxp, WPARAM wParam,LPARAM lParam) { LRESULT result = 0; HDC hDC; hDC = GetWindowDC(pCxp->hWnd); PDIALOGXP pDlg = (PDIALOGXP)pCxp->pData; if(pDlg->m_NcMouseState == MouseStateNormal) { //return CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam); return CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_NCLBUTTONUP, wParam, lParam); } pDlg->m_NcMouseState = MouseStateNormal; ReleaseCapture(); //ReleaseCapture(pCxp->hWnd); if(wParam == HTMAXBUTTON) { if(pDlg->m_SelTitleButton == MaximizeButton) { pDlg->m_SelTitleButton = NoneButton; pDlg->m_MaximizeButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); if(IsZoomed(pCxp->hWnd)) { SendMessage(pCxp->hWnd,WM_SYSCOMMAND, SC_RESTORE, lParam); } else { SendMessage(pCxp->hWnd,WM_SYSCOMMAND, SC_MAXIMIZE,lParam); } } } else if(wParam == HTMINBUTTON) { if(pDlg->m_SelTitleButton == MinimizeButton) { pDlg->m_SelTitleButton = NoneButton; pDlg->m_MinimizeButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); SendMessage(pCxp->hWnd,WM_SYSCOMMAND, SC_MINIMIZE,lParam); } } else if(wParam == HTCLOSE) { if(pDlg->m_SelTitleButton == ExitButton) { pDlg->m_SelTitleButton = NoneButton; pDlg->m_ExitButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); SendMessage(pCxp->hWnd,WM_CLOSE,0,0); } } else { pDlg->m_MinimizeButtonState = StateNormal; pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; //result = CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam); result = CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_NCLBUTTONUP, wParam, lParam); } ReleaseDC(pCxp->hWnd, hDC); return result; } LRESULT DlgOnLButtonUp(PCLASSXP pCxp, WPARAM wParam, LPARAM lParam) { UINT hit; RECT rtWnd; POINT point; PDIALOGXP pDlg = (PDIALOGXP)pCxp->pData; if(pDlg->m_NcMouseState != MouseStateNormal) { GetWindowRect(pCxp->hWnd,&rtWnd); point.x = LOWORD(lParam); point.y = HIWORD(lParam); ClientToScreen(pCxp->hWnd,&point); //UINT hit = (UINT)CDialog::WindowProc(WM_NCHITTEST,wParam,MAKELPARAM(point.x,point.y)); hit = (UINT)CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_NCHITTEST,wParam, MAKELPARAM(point.x,point.y)); return DlgOnNcLMouseUp(pCxp, hit,MAKELPARAM(point.x,point.y)); } // return CDialog::WindowProc(WM_LBUTTONUP,wParam,lParam); return CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_LBUTTONUP,wParam,lParam); } LRESULT DlgOnMouseMove(PCLASSXP pCxp,WPARAM wParam, LPARAM lParam) { UINT hit; RECT rtWnd; POINT point; HDC hDC; PDIALOGXP pDlg = (PDIALOGXP)pCxp->pData; if(pDlg->m_NcMouseState != MouseStateNormal) { GetWindowRect(pCxp->hWnd,&rtWnd); point.x = LOWORD(lParam); point.y = HIWORD(lParam); ClientToScreen(pCxp->hWnd,&point); // hit = (UINT)CDialog::WindowProc(WM_NCHITTEST,wParam,MAKELPARAM(point.x,point.y)); hit = (UINT)CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_NCHITTEST,wParam, MAKELPARAM(point.x,point.y)); return DlgOnNcMouseMove(pCxp,hit,MAKELPARAM(point.x,point.y)); } else { if(pDlg->m_ExitButtonState != StateNormal || pDlg->m_MinimizeButtonState != StateNormal || pDlg->m_MaximizeButtonState != StateNormal) { hDC = GetWindowDC(pCxp->hWnd); pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_MinimizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); ReleaseDC(pCxp->hWnd, hDC); } } // return CDialog::WindowProc(WM_MOUSEMOVE,wParam,lParam); return DefWindowProc(pCxp->hWnd ,WM_MOUSEMOVE, wParam, lParam); // return CallWindowProc(pCxp->wpPrev, pCxp->hWnd, // WM_MOUSEMOVE,wParam,lParam); } LRESULT DlgOnNcMouseMove(PCLASSXP pCxp, WPARAM wParam,LPARAM lParam) { LRESULT result = 0; HDC hDC; DWORD dwStyle; hDC = GetWindowDC(pCxp->hWnd); PDIALOGXP pDlg = (PDIALOGXP)pCxp->pData; dwStyle = GetWindowLong(pCxp->hWnd, GWL_STYLE); switch(wParam) { case HTMAXBUTTON: if(!(dwStyle & WS_MAXIMIZEBOX))return 0;//break; if(pDlg->m_NcMouseState == MouseStateNormal) { if(pDlg->m_MaximizeButtonState != StateFocus) { pDlg->m_MaximizeButtonState = StateFocus; pDlg->m_MinimizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; //RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } } else if(pDlg->m_NcMouseState == MouseStateDown) { if(pDlg->m_SelTitleButton == MaximizeButton) { if(pDlg->m_MaximizeButtonState != StateDown) { pDlg->m_MaximizeButtonState = StateDown; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } } else if(pDlg->m_SelTitleButton != NoneButton) { pDlg->m_MinimizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } } break; case HTMINBUTTON: if(!(dwStyle & WS_MINIMIZEBOX)) return 0;//break; if(pDlg->m_NcMouseState == MouseStateNormal) { if(pDlg->m_MinimizeButtonState != StateFocus) { pDlg->m_MinimizeButtonState = StateFocus; pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } } else if(pDlg->m_NcMouseState == MouseStateDown) { if(pDlg->m_SelTitleButton == MinimizeButton) { if(pDlg->m_MinimizeButtonState != StateDown) { pDlg->m_MinimizeButtonState = StateDown; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } } else if(pDlg->m_SelTitleButton != NoneButton) { pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } } break; case HTCLOSE: if(!(dwStyle & WS_SYSMENU)) return 0;//break; if(pDlg->m_NcMouseState == MouseStateNormal) { if(pDlg->m_ExitButtonState != StateFocus) { pDlg->m_ExitButtonState = StateFocus; pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_MinimizeButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } } else if(pDlg->m_NcMouseState == MouseStateDown) { if(pDlg->m_SelTitleButton == ExitButton) { if(pDlg->m_ExitButtonState != StateDown) { pDlg->m_ExitButtonState = StateDown; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } } else if(pDlg->m_SelTitleButton != NoneButton) { pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_MinimizeButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } } break; default: if(pDlg->m_ExitButtonState != StateNormal || pDlg->m_MinimizeButtonState != StateNormal || pDlg->m_MaximizeButtonState != StateNormal) { pDlg->m_MaximizeButtonState = StateNormal; pDlg->m_MinimizeButtonState = StateNormal; pDlg->m_ExitButtonState = StateNormal; // RTDrawTitleBarButtons(&dc); DlgDrawTitleBarButtons(pCxp,hDC); } result = 0;//DefWindowProc(WM_NCMOUSEMOVE,wParam,lParam); break; } ReleaseDC(pCxp->hWnd, hDC); return result; } LRESULT DlgOnNcRButtonUp(PCLASSXP pCxp,WPARAM wParam,LPARAM lParam) { HDC hDC = GetWindowDC(pCxp->hWnd); DlgDrawTitleBar(pCxp, (WPARAM)hDC); ReleaseDC(pCxp->hWnd, hDC); return CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_NCRBUTTONUP, wParam, lParam); } LRESULT DlgOnNcRButtonDown(PCLASSXP pCxp,WPARAM wParam,LPARAM lParam) { return 0; } LRESULT DlgOnSysCommand(PCLASSXP pCxp,WPARAM wParam,LPARAM lParam) { HDC hDC = GetWindowDC(pCxp->hWnd); DlgDrawTitleBar(pCxp, (WPARAM)hDC); ReleaseDC(pCxp->hWnd, hDC); return CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_SYSCOMMAND, wParam, lParam); } LRESULT DlgOnSetCursor(PCLASSXP pCxp,WPARAM wParam,LPARAM lParam) { HDC hDC; LRESULT rt = CallWindowProc(pCxp->wpPrev, pCxp->hWnd, WM_SETCURSOR,wParam, lParam); /* UINT nHitTest = LOWORD(lParam); switch(nHitTest) { case HTBORDER: case HTLEFT: case HTRIGHT: case HTTOP: case HTBOTTOM: case HTBOTTOMLEFT: case HTBOTTOMRIGHT: case HTTOPLEFT: case HTTOPRIGHT: pCxp->dwState &= CXPS_FOCUS; hDC = GetWindowDC(pCxp->hWnd); DlgDrawTitleBar(pCxp, (WPARAM)hDC); ReleaseDC(pCxp->hWnd, hDC); break; return 0; default: break; } */ return rt; } LRESULT DlgOnSize(PCLASSXP pCxp, WPARAM wParam, LPARAM lParam) { RECT Rect; UINT nWidth = GetSystemMetrics(SM_CXDLGFRAME); UINT nHeight =GetSystemMetrics(SM_CYDLGFRAME); GetWindowRect(pCxp->hWnd, &Rect); Rect.right -= Rect.left; Rect.bottom -= Rect.top; Rect.left = Rect.top = 0; if (wParam == SIZE_MAXHIDE) return FALSE; if (IsZoomed(pCxp->hWnd)) { //SelectClipRgn(GetWindowDC(pCxp->hWnd),NULL); SetWindowRgn(pCxp->hWnd, NULL,TRUE); // set window region to make rounded window DeleteObject((HGDIOBJ)pCxp->hRgn); pCxp->hRgn = NULL; } else if(wParam == SIZE_RESTORED) { /* GetWindowRect(pCxp->hWnd, &Rect); // MoveWindow(pCxp->hWnd, Rect.top,Rect.left, Rect.right, Rect.bottom, TRUE); // return TRUE; Rect.right -= Rect.left; Rect.bottom -= Rect.top; Rect.left = Rect.top = 0; //nWidth += LOWORD(lParam); // width of client area //nHeight += HIWORD(lParam); // height of client area nWidth = Rect.right; nHeight = Rect.bottom; if(pCxp->hRgn) DeleteObject((HGDIOBJ)pCxp->hRgn); pCxp->hRgn = CreateRoundRectRgn(0,0,nWidth,nHeight,16,16); SetWindowRgn(pCxp->hWnd,pCxp->hRgn,TRUE); // set window region to make rounded window */ } // RedrawWindow(pCxp->hWnd, NULL, NULL, // RDW_UPDATENOW|RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ERASENOW); // 重画窗口 return TRUE; } LRESULT DlgWindowProc(PCLASSXP pCxp, UINT message, WPARAM wParam, LPARAM lParam) { long lReturn; switch(message) { case WM_SIZE: return DlgOnSize(pCxp, wParam, lParam); case WM_INITMENUPOPUP: // return DlgOnSysCommand(pCxp,wParam,lParam); //return 0; case WM_NCPAINT: //1 return DlgOnNcPaint(pCxp, wParam); case WM_NCACTIVATE: //2 return DlgOnNcActive(pCxp,wParam,lParam); case WM_ACTIVATE: //3 return DlgOnActive(pCxp, wParam,lParam); case WM_ACTIVATEAPP: //4 return DlgOnActiveApp(pCxp,wParam,lParam); case WM_NOTIFY: //5 return DlgOnNodify(pCxp, wParam,lParam); case WM_SETTEXT: //6 return DlgOnSetText(pCxp, wParam,lParam); case WM_SETICON: //7 return DlgOnSetIcon(pCxp, wParam,lParam); case WM_NCMOUSEMOVE: //8 return DlgOnNcMouseMove(pCxp, wParam,lParam); case WM_NCLBUTTONDOWN: //9 return DlgOnNcLMouseDown(pCxp, wParam,lParam); case WM_NCLBUTTONUP: //10 DlgOnNcLMouseUp(pCxp, wParam,lParam); case WM_LBUTTONUP: //11 return DlgOnLButtonUp(pCxp, wParam,lParam); case WM_MOUSEMOVE: //12 return DlgOnMouseMove(pCxp, wParam,lParam); case WM_ERASEBKGND: //13 return DlgOnEraseBackGround(pCxp, wParam,lParam); case WM_NCRBUTTONUP: //14 return DlgOnNcRButtonUp(pCxp, wParam,lParam); case WM_NCRBUTTONDOWN: //15 return DlgOnNcRButtonDown(pCxp,wParam,lParam); case WM_SYSCOMMAND: //16 return DlgOnSysCommand(pCxp, wParam,lParam); case WM_SETCURSOR: //17 return DlgOnSetCursor(pCxp, wParam,lParam); default: break; } // 调用原来的回调函数 lReturn = CallWindowProc(pCxp->wpPrev, pCxp->hWnd, message, wParam, lParam); if (message == WM_NCDESTROY) // 窗口销毁 DeleteClassXP(pCxp->hWnd); return lReturn; // return DefWindowProc(pCxp->hWnd, message, wParam, lParam); } //////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __cplusplus } #endif // __cplusplus ////////////////////////////////////////////////////////////////////////////////////////////////////