⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 addremovedialog.cpp

📁 eCos1.31版
💻 CPP
字号:
//####COPYRIGHTBEGIN####//                                                                          // ----------------------------------------------------------------------------// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.//// This program is part of the eCos host tools.//// This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 2 of the License, or (at your option) // any later version.// // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for // more details.// // You should have received a copy of the GNU General Public License along with// this program; if not, write to the Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.//// ----------------------------------------------------------------------------//                                                                          //####COPYRIGHTEND####// AddRemoveDialog.cpp : implementation file//#include "stdafx.h"#include "AddRemoveDialog.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAddRemoveDialog dialogvoid CAddRemoveDialog::AfxDataInit(){	//{{AFX_DATA_INIT(CAddRemoveDialog)		// NOTE: the ClassWizard will add member initialization here	//}}AFX_DATA_INIT}CAddRemoveDialog::CAddRemoveDialog(CWnd* pParent /*=NULL*/)	: CeCosDialog(IDD, pParent),    m_bSort(false),    m_arbSel(NULL),    m_bHaveDescs(false),    m_nHorizontalResizingLimit(0){	AfxDataInit ();}CAddRemoveDialog::CAddRemoveDialog(UINT nIDTemplate, CWnd* pParent /*=NULL*/)	: CeCosDialog(nIDTemplate, pParent),    m_bSort(false),    m_arbSel(NULL),    m_nHorizontalResizingLimit(0){	AfxDataInit ();}void CAddRemoveDialog::DoDataExchange(CDataExchange* pDX){	CeCosDialog::DoDataExchange(pDX);	//{{AFX_DATA_MAP(CAddRemoveDialog)	DDX_Control(pDX, IDC_PACKAGE_DESC, m_wndDesc);	DDX_Control(pDX, IDC_ADDREMOVE_LIST2, m_List2);	DDX_Control(pDX, IDC_ADDREMOVE_LIST1, m_List1);	DDX_Control(pDX, IDC_ADDREMOVE_ADD,   m_Add);	DDX_Control(pDX, IDC_ADDREMOVE_REMOVE,m_Remove);	//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAddRemoveDialog, CeCosDialog)	//{{AFX_MSG_MAP(CAddRemoveDialog)	ON_BN_CLICKED(IDC_ADDREMOVE_ADD, OnAdd)	ON_BN_CLICKED(IDC_ADDREMOVE_REMOVE, OnRemove)	ON_LBN_DBLCLK(IDC_ADDREMOVE_LIST1, OnDblclkList1)	ON_LBN_DBLCLK(IDC_ADDREMOVE_LIST2, OnDblclkList2)	ON_LBN_SELCHANGE(IDC_ADDREMOVE_LIST1, OnSelchangeList1)	ON_LBN_SELCHANGE(IDC_ADDREMOVE_LIST2, OnSelchangeList2)	ON_WM_DESTROY()	//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CAddRemoveDialog message handlersvoid CAddRemoveDialog::OnAdd() {    Add(m_List1,m_List2);    m_Add.EnableWindow(FALSE);    m_Remove.EnableWindow(TRUE);}void CAddRemoveDialog::OnRemove() {    Add(m_List2,m_List1);    m_Add.EnableWindow(TRUE);    m_Remove.EnableWindow(FALSE);}void CAddRemoveDialog::Insert(LPCTSTR pszItem, bool bAdded, LPCTSTR pszDesc/*=NULL*/){    m_bHaveDescs|=(NULL!=pszDesc);    m_arnItems.  Add(bAdded);    m_arstrItems.Add(pszItem);    m_arstrDescs.Add(pszDesc?pszDesc:_T(""));}BOOL CAddRemoveDialog::OnInitDialog() {	CeCosDialog::OnInitDialog();    m_arbSel=new int[GetCount()];        SetWindowText(m_strCaption);    SetSortMode(m_List1);    SetSortMode(m_List2);	int cxExtent=0;    CDC *pDC=m_List1.GetDC();	CFont *pOldFont=pDC->SelectObject(m_List1.GetFont());    for(int i=GetCount()-1;i>=0;--i) {        const CString &str=m_arstrItems[i];		cxExtent=max(cxExtent,pDC->GetTextExtent(str).cx);        CListBox &lb=m_arnItems[i]?m_List2:m_List1;        lb.SetItemData(lb.AddString(str),(DWORD)i);    }    pDC->SelectObject(pOldFont);    SetDlgItemText(IDC_ADDREMOVE_TEXT1,m_strMessage1);    SetDlgItemText(IDC_ADDREMOVE_TEXT2,m_strMessage2);	CRect rcLb1;	m_List1.GetWindowRect(rcLb1);    CRect rcDialog;    GetWindowRect(rcDialog);	int nExpand=cxExtent-(rcLb1.Width()-GetSystemMetrics(SM_CXVSCROLL)-2*GetSystemMetrics(SM_CXBORDER)-5);    nExpand=min(nExpand,m_nHorizontalResizingLimit);	if(nExpand>0){		MoveChild(IDOK,2*nExpand,Move);		MoveChild(IDCANCEL,2*nExpand,Move);		MoveChild(IDC_ADDREMOVE_ADD,nExpand,Move);		MoveChild(IDC_ADDREMOVE_REMOVE,nExpand,Move);		MoveChild(IDC_ADDREMOVE_LIST1,nExpand,Stretch);		MoveChild(IDC_ADDREMOVE_TEXT2,nExpand,Move);		MoveChild(IDC_ADDREMOVE_LIST2,nExpand,Move);		MoveChild(IDC_ADDREMOVE_LIST2,nExpand,Stretch);		MoveChild(IDC_PACKAGE_DESC,2*nExpand,Stretch);	    rcDialog.right+=2*nExpand; // MoveWindow call is below	}    // enable horizontal scrolling if necessary, assuming the	// listboxes have identical widths and accommodating a	// 2 pixel border at each side of each listbox	m_List1.SetHorizontalExtent (cxExtent + 4);	m_List2.SetHorizontalExtent (cxExtent + 4);    m_Add.EnableWindow(m_List1.GetCount()>0);    m_Remove.EnableWindow(m_List2.GetCount()>0);	    if(!m_bHaveDescs){        // Remove the description pane if not used:        CRect rcDesc;        m_wndDesc.GetWindowRect(rcDesc);        m_wndDesc.ShowWindow(SW_HIDE);	    int delta=(rcDesc.Height()+(rcDesc.top-rcLb1.bottom));        MoveChild(IDOK,delta,Up);        MoveChild(IDCANCEL,delta,Up);        rcDialog.bottom-=delta;    }    // Finally, adjust dialog size according to calculations:    MoveWindow(rcDialog);	return TRUE;  // return TRUE unless you set the focus to a control	              // EXCEPTION: OCX Property Pages should return FALSE}void CAddRemoveDialog::OnDblclkList1() {    OnDblclk(m_List1,m_List2);    m_Add.EnableWindow(FALSE);    m_Remove.EnableWindow(TRUE);}void CAddRemoveDialog::OnDblclkList2() {    OnDblclk(m_List2,m_List1);    m_Add.EnableWindow(TRUE);    m_Remove.EnableWindow(FALSE);}int CAddRemoveDialog::Add(CListBox &lb1,CListBox &lb2){    int nSelCount=lb1.GetSelItems(lb1.GetCount(),m_arbSel);    for(int i=nSelCount-1;i>=0;--i){        Xfer(lb1,lb2,m_arbSel[i]);    }    ClearSel(lb1);    lb2.SetFocus();    return nSelCount;}void CAddRemoveDialog::OnDblclk(CListBox &lb1,CListBox &lb2){    BOOL bOutside;    DWORD dwPos=GetMessagePos();    POINTS pts=MAKEPOINTS(dwPos);    CRect rc(pts.x,pts.y,0,0);    lb1.ScreenToClient(rc);    CPoint pt(rc.left,rc.top);    int nItem=lb1.ItemFromPoint(pt,bOutside);    if(!bOutside){        Xfer(lb1,lb2,nItem);    }    ClearSel(lb1);    lb2.SetFocus();}void CAddRemoveDialog::ClearSel(CListBox &lb){    for(int i=lb.GetCount()-1;i>=0;--i){        lb.SetSel(i,FALSE);    }}void CAddRemoveDialog::OnSelchangeList1(){    ClearSel(m_List2);    m_Add.EnableWindow(m_List1.GetSelCount()>0);    UpdateDescription(m_List1);    m_Remove.EnableWindow(FALSE);}void CAddRemoveDialog::OnSelchangeList2(){    ClearSel(m_List1);    m_Remove.EnableWindow(m_List2.GetSelCount()>0);    UpdateDescription(m_List2);    m_Add.EnableWindow(FALSE);}void CAddRemoveDialog::Xfer(CListBox &lb1, CListBox &lb2, int nItem){    CString strItem;    lb1.GetText(nItem,strItem);    int nNewItem=lb2.AddString(strItem);    lb2.SetSel(nNewItem,TRUE);    DWORD nIndex=lb1.GetItemData(nItem);    lb2.SetItemData(nNewItem,nIndex);    m_arnItems[(int)nIndex]^=1;    lb1.DeleteString(nItem);}bool CAddRemoveDialog::IsAdded(LPCTSTR pszItem) const{    for(int i=GetCount()-1;i>=0;--i){        if(m_arstrItems[i]==pszItem){            return 0!=m_arnItems[i];        }    }    ASSERT(false);    return false;}void CAddRemoveDialog::SetCaption(LPCTSTR pszCaption){    m_strCaption=pszCaption;}void CAddRemoveDialog::SetMessage(LPCTSTR pszText1,LPCTSTR pszText2){    m_strMessage1=pszText1;    m_strMessage2=pszText2;}void CAddRemoveDialog::OnDestroy() {	CeCosDialog::OnDestroy();    deleteZA(m_arbSel);}// Add the "sort" property to the listboxes.  Unfortunately this entails// recreating them.void CAddRemoveDialog::SetSortMode(CListBox &lb){    DWORD dwStyle=lb.GetStyle();    if(m_bSort!=(0!=(dwStyle&LBS_SORT))){        if(m_bSort){            dwStyle|=LBS_SORT;        } else {            dwStyle&=~LBS_SORT;        }        dwStyle|=WS_HSCROLL; // For some reason this doesn't come through GetStyle()        CRect rect;        lb.GetWindowRect(rect);        ScreenToClient(rect);        DWORD dwStyleEx=lb.GetExStyle();        CFont *pFont=lb.GetFont();        DWORD id=lb.GetDlgCtrlID();        lb.DestroyWindow();        lb.Detach();        // CreateEx not Create to get ourselves a 3D border        lb.CreateEx(dwStyleEx,_T("LISTBOX"),NULL,dwStyle,rect,this,id);        lb.SetFont(pFont);    }}// Implement ctrl/A on listboxesBOOL CAddRemoveDialog::PreTranslateMessage(MSG* pMsg) {    if(WM_CHAR==pMsg->message && 1==pMsg->wParam){        if(pMsg->hwnd==m_List1.m_hWnd){            m_List1.SelItemRange(TRUE,0,m_List1.GetCount()-1);            ClearSel(m_List2);            m_Add.EnableWindow(m_List1.GetCount()>0);            m_Remove.EnableWindow(FALSE);            return TRUE;        } else if(pMsg->hwnd==m_List2.m_hWnd){            m_List2.SelItemRange(TRUE,0,m_List2.GetCount()-1);            ClearSel(m_List1);            m_Remove.EnableWindow(m_List2.GetCount()>0);            m_Add.EnableWindow(FALSE);            return TRUE;        }    }		return CeCosDialog::PreTranslateMessage(pMsg);}void CAddRemoveDialog::MoveChild(UINT id,int delta,MoveType how){    CWnd *pWnd=GetDlgItem(id);    CRect rect;	pWnd->GetWindowRect(rect);	ScreenToClient(rect);    switch(how){        case Move:	        rect.left+=delta;	        rect.right+=delta;            break;        case Stretch:	        rect.right+=delta;            break;        case Up:            rect.top-=delta;            rect.bottom-=delta;            break;    }    pWnd->MoveWindow(rect);}void CAddRemoveDialog::UpdateDescription(CListBox &lb){    CString strDesc;    // Set the description if the listbox has exactly one item selected    if(1==lb.GetSelCount()){	    int nIndex;	    lb.GetSelItems(1,&nIndex);        strDesc=m_arstrDescs[lb.GetItemData(nIndex)];    }    m_wndDesc.SetWindowText(strDesc);}void CAddRemoveDialog::SetHorizontalResizingLimit(int nPercent){    m_nHorizontalResizingLimit=nPercent;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -