📄 buttonssl.cpp
字号:
void CButtonSSL::SetSSLCheck (int nCheck, BOOL bRedraw/* = TRUE*/) {
UINT nType = GetControlType ();
if (BS_AUTORADIOBUTTON == (BS_AUTORADIOBUTTON & nType) ||
BS_RADIOBUTTON == (BS_RADIOBUTTON & nType) ||
BS_AUTOCHECKBOX == (BS_AUTOCHECKBOX & nType) ||
BS_CHECKBOX == (BS_CHECKBOX & nType)) {
if (0 == nCheck) {
m_nCheck = 0;
}
else {
m_nCheck = 1;
}
if (TRUE == bRedraw) {
Invalidate ();
}
}
}
int CButtonSSL::GetSSLCheck () {
return m_nCheck;
}
/////////////////////////////////////////////////////////////////////////////
// Menu Functions
BOOL CButtonSSL::SetSSLButtonMenu (UINT nMenuResourceID) {
// Ensure the SSL_BS_MENU_BTN style is set
m_nStyle |= SSL_BS_MENU_BTN;
if (NULL != m_menu.m_hMenu) {
m_menu.DestroyMenu ();
}
BOOL bReturn = m_menu.LoadMenu (nMenuResourceID);
m_bMenuLoaded |= bReturn;
// Resize the button if necessary
if (SSL_BS_AUTOSIZE == (SSL_BS_AUTOSIZE & m_nStyle)) {
SetSize ();
}
return bReturn;
}
BOOL CButtonSSL::SetSSLButtonMenu (LPCTSTR lpszResourceName) {
// Ensure the SSL_BS_MENU_BTN style is set
m_nStyle |= SSL_BS_MENU_BTN;
if (NULL != m_menu.m_hMenu) {
m_menu.DestroyMenu ();
}
BOOL bReturn = m_menu.LoadMenu (lpszResourceName);
m_bMenuLoaded |= bReturn;
// Resize the button if necessary
if (SSL_BS_AUTOSIZE == (SSL_BS_AUTOSIZE & m_nStyle)) {
SetSize ();
}
return bReturn;
}
UINT CButtonSSL::CheckSSLMenuItem (UINT nIDCheckItem, UINT nCheck/* = MF_CHECKED*/) {
if (FALSE == m_bMenuLoaded) {
return MF_DOES_NOT_EXIST;
}
return m_menu.CheckMenuItem (nIDCheckItem, nCheck);
}
BOOL CButtonSSL::CheckSSLMenuRadioItem (UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags) {
if (FALSE == m_bMenuLoaded) {
return FALSE;
}
return m_menu.CheckMenuRadioItem (nIDFirst, nIDLast, nIDItem, nFlags);
}
UINT CButtonSSL::EnableSSLMenuItem (UINT nIDEnableItem, UINT nEnable) {
if (FALSE == m_bMenuLoaded) {
return MF_DOES_NOT_EXIST;
}
return m_menu.EnableMenuItem (nIDEnableItem, nEnable);
}
UINT CButtonSSL::GetSSLMenuItemCount () const {
if (FALSE == m_bMenuLoaded) {
return MF_DOES_NOT_EXIST;
}
return m_menu.GetMenuItemCount ();
}
UINT CButtonSSL::GetSSLMenuItemID (int nPos) const {
if (FALSE == m_bMenuLoaded) {
return MF_DOES_NOT_EXIST;
}
return m_menu.GetMenuItemID (nPos);
}
UINT CButtonSSL::GetSSLMenuState (UINT nID, UINT nFlags) {
if (FALSE == m_bMenuLoaded) {
return MF_DOES_NOT_EXIST;
}
return m_menu.GetMenuState (nID, nFlags);
}
int CButtonSSL::GetSSLMenuString (UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) {
if (FALSE == m_bMenuLoaded) {
return 0;
}
return m_menu.GetMenuString (nIDItem, lpString, nMaxCount, nFlags);
}
int CButtonSSL::GetSSLMenuString (UINT nIDItem, CString& rString, UINT nFlags) {
if (FALSE == m_bMenuLoaded) {
return 0;
}
return m_menu.GetMenuString (nIDItem, rString, nFlags);
}
BOOL CButtonSSL::GetSSLMenuItemInfo (UINT nIDItem, LPMENUITEMINFO lpMenuItemInfo,
BOOL ByPos/*=FALSE*/) {
if (FALSE == m_bMenuLoaded) {
return FALSE;
}
return m_menu.GetMenuItemInfo (nIDItem, lpMenuItemInfo, ByPos);
}
BOOL CButtonSSL::ModifySSLMenu (UINT nPosition, UINT nFlags, UINT nIDNewItem/*=0*/,
LPCTSTR lpszNewItem/*=NULL*/) {
if (FALSE == m_bMenuLoaded) {
return FALSE;
}
return m_menu.ModifyMenu (nPosition, nFlags, nIDNewItem, lpszNewItem);
}
BOOL CButtonSSL::ModifySSLMenu (UINT nPosition, UINT nFlags, UINT nIDNewItem,
const CBitmap* pBmp) {
if (FALSE == m_bMenuLoaded) {
return FALSE;
}
return m_menu.ModifyMenu (nPosition, nFlags, nIDNewItem, pBmp);
}
BOOL CButtonSSL::RemoveSSLMenu (UINT nPosition, UINT nFlags) {
if (FALSE == m_bMenuLoaded) {
return FALSE;
}
return m_menu.RemoveMenu (nPosition, nFlags);
}
BOOL CButtonSSL::SetSSLMenuItemBitmaps (UINT nPosition, UINT nFlags,
const CBitmap* pBmpUnchecked,
const CBitmap* pBmpChecked) {
if (FALSE == m_bMenuLoaded) {
return FALSE;
}
return m_menu.SetMenuItemBitmaps (nPosition, nFlags, pBmpUnchecked,
pBmpChecked);
}
/////////////////////////////////////////////////////////////////////////////
// Miscellaneous Functions
BOOL CButtonSSL::SetSSLButtonCursor (UINT nResourceID) {
HINSTANCE hInstResource;
// Destroy any previous cursor
if (NULL != m_hCursor) {
::DestroyCursor (m_hCursor);
m_hCursor = NULL;
}
// If we want a cursor
if (nResourceID != NULL) {
hInstResource = AfxFindResourceHandle (MAKEINTRESOURCE (nResourceID), RT_GROUP_CURSOR);
// Load icon resource
m_hCursor = (HCURSOR)::LoadImage (hInstResource, MAKEINTRESOURCE (nResourceID),
IMAGE_CURSOR, 0, 0, 0);
// If something wrong then return FALSE
if (NULL == m_hCursor) {
return FALSE;
}
}
return TRUE;
}
void CButtonSSL::SetSSLButtonToolTip (LPCTSTR lpszTipText, BOOL bActivate) {
// Can't have a NULL text string
if (NULL == lpszTipText) {
return;
}
// Initialise the tooltip
InitToolTipCtrl ();
// Need to add a tooltip if none defined
if (0 == m_ToolTip.GetToolCount ()) {
CRect rectBtn;
GetClientRect (rectBtn);
m_ToolTip.AddTool (this, lpszTipText, rectBtn, 1);
}
// Set the text
m_ToolTip.UpdateTipText (lpszTipText, this, 1);
m_ToolTip.Activate (bActivate);
}
void CButtonSSL::SetSSLButtonToolTip (UINT nResourceID, BOOL bActivate) {
CString strTipText;
strTipText.LoadString (nResourceID);
if (FALSE == strTipText.IsEmpty ()) {
SetSSLButtonToolTip ((LPCTSTR)strTipText, bActivate);
}
}
void CButtonSSL::GetSSLButtonToolTip (CString& strTipText) {
m_ToolTip.GetText (strTipText, this, 1);
}
// The following appeared in Paul DiLascia's Jan 1998 MSJ articles.
// It loads a "hand" cursor from the winhlp32.exe module
void CButtonSSL::SetSSLButtonURL (LPCTSTR lpszURL) {
if (NULL != lpszURL) {
// Store the URL
::lstrcpyn(m_szURL, lpszURL, _MAX_PATH);
if (NULL == m_hCursor) {
// Try to load the 'standard' hand cursor
CString szWndDir;
GetWindowsDirectory (szWndDir.GetBuffer (MAX_PATH), MAX_PATH);
szWndDir.ReleaseBuffer ();
// Try cursor #106 in WinHlp32.exe
CString szHlp32 = szWndDir + _T("\\winhlp32.exe");
HMODULE hModule = LoadLibrary (szHlp32);
if (NULL != hModule) {
HCURSOR hHandCursor;
hHandCursor = ::LoadCursor (hModule, MAKEINTRESOURCE (106));
if (NULL != hHandCursor) {
m_hCursor = CopyCursor (hHandCursor);
}
}
}
}
else {
// Remove any existing URL
::ZeroMemory(&m_szURL, sizeof(m_szURL));
}
}
/////////////////////////////////////////////////////////////////////////////
// CButtonSSL helper functions
void CButtonSSL::DrawArrow (CDC* pDC, CPoint ptTip) {
CPoint ptDest;
pDC->SetPixel (ptTip, RGB (0, 0, 0));
ptTip -= CPoint (1, 1);
pDC->MoveTo (ptTip);
ptDest = ptTip;
ptDest += CPoint (3, 0);
pDC->LineTo (ptDest);
ptTip -= CPoint (1, 1);
pDC->MoveTo (ptTip);
ptDest = ptTip;
ptDest += CPoint (5, 0);
pDC->LineTo (ptDest);
ptTip -= CPoint (1, 1);
pDC->MoveTo (ptTip);
ptDest = ptTip;
ptDest += CPoint (7, 0);
pDC->LineTo (ptDest);
}
BOOL CButtonSSL::HitMenuButton (CPoint pt)
{
if (FALSE == m_bMenuLoaded)
return FALSE; // Don't allow menu button drop down if no menu items are loaded
ClientToScreen(&pt);
CRect rect;
GetWindowRect (rect);
rect.left = rect.right - DROP_BUTTON_WIDTH;
return rect.PtInRect (pt);
}
void CButtonSSL::InitToolTipCtrl () {
if (NULL == m_ToolTip.m_hWnd) {
m_ToolTip.Create (this);
m_ToolTip.Activate(FALSE); // Inactive initially
m_ToolTip.SendMessage(TTM_SETMAXTIPWIDTH, 0, 300); // Enable multiline tooltip
}
}
void CButtonSSL::AddBitmap (UINT nResourceID, COLORREF crMask) {
m_bmpImage.Detach ();
m_bmpImage.LoadBitmap (nResourceID);
m_imageList.Add (&m_bmpImage, crMask);
}
void CButtonSSL::AddIcon (UINT nResourceID) {
HINSTANCE hInstance = AfxFindResourceHandle (MAKEINTRESOURCE (nResourceID), RT_GROUP_ICON);
m_hIcon = (HICON)::LoadImage (hInstance, MAKEINTRESOURCE (nResourceID), IMAGE_ICON, 0, 0, 0);
if (NULL != m_hIcon) {
ICONINFO iconInfo;
ZeroMemory (&iconInfo, sizeof (ICONINFO));
::GetIconInfo (m_hIcon, &iconInfo);
::DeleteObject(iconInfo.hbmMask);
::DeleteObject(iconInfo.hbmColor);
m_imageList.Add (m_hIcon);
}
}
CPoint CButtonSSL::GetImagePoint (CRect btnRect) {
int nLeft = 3, nTop = 3; // Default position for SSL_IMAGE_LEFT / _TOP
// Determine the left coordinate
if (SSL_IMAGE_CENTER == (SSL_IMAGE_CENTER & m_nImageAlign)) {
if (SSL_BS_MENU_BTN == (SSL_BS_MENU_BTN & m_nStyle)) {
nLeft = (btnRect.Width () - m_nImageWidth - DROP_BUTTON_WIDTH) / 2;
}
else {
nLeft = (btnRect.Width () - m_nImageWidth) / 2;
}
}
else if (SSL_IMAGE_RIGHT == (SSL_IMAGE_RIGHT & m_nImageAlign)) {
nLeft = btnRect.right - m_nImageWidth - 3;
if (SSL_BS_MENU_BTN == (SSL_BS_MENU_BTN & m_nStyle)) {
nLeft -= DROP_BUTTON_WIDTH;
}
}
// Determine the top coordinate
if (SSL_IMAGE_VCENTER == (SSL_IMAGE_VCENTER & m_nImageAlign)) {
nTop = (btnRect.Height () - m_nImageHeight) / 2;
}
else if (SSL_IMAGE_BOTTOM == (SSL_IMAGE_BOTTOM & m_nImageAlign)) {
nTop = btnRect.bottom - m_nImageHeight - 3;
}
return CPoint (nLeft + m_bBtnPushed, nTop + m_bBtnPushed);
}
void CButtonSSL::SetSize () {
// Get the size of the button text
CDC* pDC = GetDC ();
SIZE size;
CString szText;
GetWindowText (szText);
// Need to select the font to ensure correct sizing for GetTextExtentPoint32
pDC->SelectObject (&m_font);
GetTextExtentPoint32 (pDC->m_hDC, szText, szText.GetLength (), &size);
// Get the current size of the button
CRect btnRect;
GetWindowRect (btnRect);
// Adjust the size according to the contents
btnRect.right = btnRect.left + max (m_nImageWidth, size.cx) + 6;
btnRect.bottom = btnRect.top + max (m_nImageHeight, size.cy) + 6;
// Take in to account the drop button if there is one
if (SSL_BS_MENU_BTN == (SSL_BS_MENU_BTN & m_nStyle)) {
btnRect.right += DROP_BUTTON_WIDTH + 3;
}
// Resize the button
SetWindowPos (NULL, 0, 0, btnRect.Width (), btnRect.Height (), SWP_NOMOVE | SWP_NOZORDER | SWP_SHOWWINDOW);
}
void CButtonSSL::TraceState (ButtonState state) {
CString strState = _T("Button State: ");
switch (state) {
case SSL_STATE_UP:
strState += _T("Up");
break;
case SSL_STATE_OVER:
strState += _T("Over");
break;
case SSL_STATE_DOWN:
strState += _T("Down");
break;
case SSL_STATE_DISABLED:
strState += _T("Disabled");
break;
default:
strState += _T("Invalid");
}
TRACE ("%s. m_bDisabled: %i. m_bMouseOnBtn: %i. m_bBtnPushed: %i. m_bMenuPushed: %i.\n",
strState, m_bDisabled, m_bMouseOnBtn, m_bBtnPushed, m_bMenuPushed);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -