为属性页中的对话框添加工具栏,及添加工具栏tool tip & Update command ui

来源:互联网 发布:淘宝促销管理怎么没有 编辑:程序博客网 时间:2024/06/04 20:04

1. 为对话框添加工具栏。

 

   为 CPropertyPage 或者CDialog 的 派生类添加一个成员 CToolBar m_ToolBar. CImageList m_imageList;CBitmap    m_toolBarBitmap;

 

   OnInitDialog()中加入:

 

m_ToolBar.CreateEx(this, TBSTYLE_FLAT,  WS_CHILD   |   WS_VISIBLE   |   CBRS_ALIGN_TOP |  CBRS_TOOLTIPS, CRect(0,0,0,0));

 

// 使用 24位的图片代替工具栏的图片。 将白色作为工具栏底色。

m_ToolBar.LoadToolBar(IDR_TOOLBAR_SCANDATA_IMPORT_DELETE);  

//m_ToolBar.SetBitmap((HBITMAP)m_toolBarBitmap);

m_ToolBar.SetSizes(CSize(24 + 7, 24 + 6), CSize(24, 24));

m_toolBarBitmap.LoadBitmap(IDB_TOOLBAR_SCANDATA_IMPORT_DELETE);

m_imageList.Create(24, 24, ILC_COLOR24|ILC_MASK, 5, 1);

m_imageList.Add(&m_toolBarBitmap, RGB(255, 255, 255));

m_ToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)m_imageList.m_hImageList);

// 更新其他控件的位置。

CRect   rcClientStart;   

CRect   rcClientNow;   

GetClientRect(rcClientStart);   

 

//   To   reposition   and   resize   the   control   bar   

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,   AFX_IDW_CONTROLBAR_LAST,0,   reposQuery,   rcClientNow);   

CPoint   ptOffset(rcClientNow.left   -   rcClientStart.left,rcClientNow.top-rcClientStart.top);   

 

CRect   rcChild;   

CWnd*   pwndChild   =   GetWindow(GW_CHILD);   

 

while   (pwndChild)   

{   

pwndChild->GetWindowRect(rcChild);   

ScreenToClient(rcChild);   

rcChild.OffsetRect(ptOffset);   

pwndChild->MoveWindow(rcChild,   FALSE);   

pwndChild   =   pwndChild->GetNextWindow();   

}   

 

CRect   rcWindow;   

GetWindowRect(rcWindow);   

rcWindow.right   +=   rcClientStart.Width()   -   rcClientNow.Width();   

rcWindow.bottom   +=   rcClientStart.Height()   -   rcClientNow.Height();   

MoveWindow(rcWindow,   FALSE);         

 

//   And   position   the   control   bars   

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,   AFX_IDW_CONTROLBAR_LAST,   0); 

 

// 设置自己的按钮属性。任意设置

m_ToolBar.SetButtonStyle(0, TBBS_CHECKGROUP);

m_ToolBar.SetButtonStyle(1, TBBS_CHECKGROUP);

m_ToolBar.SetButtonStyle(2, TBBS_CHECKGROUP);

m_ToolBar.SetButtonStyle(3, TBBS_SEPARATOR);

m_ToolBar.SetButtonStyle(4, TBBS_CHECKGROUP);

m_ToolBar.SetButtonStyle(5, TBBS_CHECKGROUP);

 

 

2. 添加tool tip

 

添加消息:

 

afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult);

 

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)

 

BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)

{

ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);

 

// allow top level routing frame to handle the message

if (GetRoutingFrame() != NULL)

return FALSE;

 

// need to handle both ANSI and UNICODE versions of the message

TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;

TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;

TCHAR szFullText[256];

CString cstTipText;

CString cstStatusText;

 

UINT nID = pNMHDR->idFrom;

if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||

pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))

{

// idFrom is actually the HWND of the tool

nID = ((UINT)(WORD)::GetDlgCtrlID((HWND)nID));

}

 

if (nID != 0) // will be zero on a separator

{

AfxLoadString(nID, szFullText);

// this is the command id, not the button index

AfxExtractSubString(cstTipText, szFullText, 1, '/n');

AfxExtractSubString(cstStatusText, szFullText, 0, '/n');

}

 

// Non-UNICODE Strings only are shown in the tooltip window...

if (pNMHDR->code == TTN_NEEDTEXTA)

lstrcpyn((TCHAR*)(pTTTA->szText), cstTipText,

(sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0])));

else

{

char szStr[256] = {0};

wcstombs(szStr, cstTipText, cstTipText.GetLength());

const char * p = szStr;

_mbstowcsz(pTTTW->szText, p,

(sizeof(pTTTW->szText)/sizeof(pTTTW->szText[0])));

}

*pResult = 0;

 

// bring the tooltip window above other popup windows

::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,

SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE);

 

 

return TRUE;    // message was handled

}

 

在工具栏的资源文件中加入tool tip信息即可。

 

3 加入 update command ui.

 

对于普通的CDialog 应用,创建一个CToolBar的派生类, 添加消息

 

LRESULT OnIdleUpdateCmdUI(WPARAM wParam, LPARAM); 

 

BEGIN_MESSAGE_MAP(CInSpecDlgToolBar, CToolBar)

ON_MESSAGE(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI)

END_MESSAGE_MAP()

 

 

// CInSpecDlgToolBar message handlers

 

LRESULT CInSpecDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM) 

{

if (IsWindowVisible()) 

{

CFrameWnd *pParent = (CFrameWnd *)GetParent();

if (pParent)

OnUpdateCmdUI(pParent, (BOOL)wParam);

}

return 0L;

}

为对话框(或Property page)重载虚函数
BOOL ContinueModal()
{
m_ToolBar.SendMessage( WM_IDLEUPDATECMDUI, WPARAM(TRUE), 0);
return CDialog::ContinueModal();
}
对于普通的dialog即可添加 ON_UPDATE_COMMAND_UI 消息进行处理。
对于属性页得应用, property page 作为 CPropertySheet 的子窗口, 不会直接调用 property page 的 ContinueModal 函数,
因此, 我们需要重载 CPropertySheet  的 ContinueModal , 在其里面调用对应  property page 的 ContinueModal 函数, 即可完成工具栏的更新。
BOOL CScanDataSettingSheet::ContinueModal()
{
// For property sheet, the ContinueModal method for each page will not be called.
CPropertyPage* pPage = GetActivePage();
if (pPage && pPage->GetSafeHwnd() != NULL)
{
pPage->ContinueModal();
}
return CPropertySheet::ContinueModal();
}

原创粉丝点击