1. 程式人生 > >MFC 實現richedit右鍵選單的複製貼上功能

MFC 實現richedit右鍵選單的複製貼上功能

//滑鼠右鍵響應函式
void CMSR009BTDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
{
// TODO: Add your message handler code here
CMenu popMenu;
CRect rect1,rect2,rect3;//定義矩形區域
int k=0;


if(MyDevFound)
{
TrackSelect1 = NoSelect;//編輯框右鍵選擇
TrackSelect2 = NoSelect;//編輯框右鍵選擇
TrackSelect3 = NoSelect;//編輯框右鍵選擇


GetDlgItem(IDC_EDIT_Track1)->GetWindowRect(&rect1);//獲取控制元件區域的矩形
GetDlgItem(IDC_EDIT_Track2)->GetWindowRect(&rect2);//獲取控制元件區域的矩形
GetDlgItem(IDC_EDIT_Track3)->GetWindowRect(&rect3);//獲取控制元件區域的矩形


if(rect1.PtInRect(point))
{
TrackSelect1 = EditSelect;
}
else if(rect2.PtInRect(point))
{
TrackSelect2 = EditSelect;
}
else if(rect3.PtInRect(point))
{
TrackSelect3 = EditSelect;
}


if((TrackSelect1 == EditSelect)||(TrackSelect2 == EditSelect)||(TrackSelect3 == EditSelect))
{
CMenu *pPopup;
popMenu.LoadMenu(IDR_MENU1); //載入選單

pPopup=popMenu.GetSubMenu(0); //獲得子選單指標


pPopup->EnableMenuItem(ID_Copy,MF_BYCOMMAND|MF_ENABLED); //允許選單項使用
pPopup->EnableMenuItem(ID_Paste,MF_BYCOMMAND|MF_ENABLED); //允許選單項使用
pPopup->EnableMenuItem(ID_Select,MF_BYCOMMAND|MF_ENABLED); //允許選單項使用
pPopup->EnableMenuItem(ID_Deselect,MF_BYCOMMAND|MF_ENABLED); //允許選單項使用
//pPopup->EnableMenuItem(ID_3,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); //不允許選單項使用


//ClientToScreen(&point); //將客戶區座標轉換成螢幕座標
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); //顯示彈出選單,引數依次為(滑鼠在選單左邊|跟蹤右鍵,x,y,this)
pPopup->Detach();
popMenu.DestroyMenu();
}
}
}


//複製編輯框資料
void CMSR009BTDlg::OnCopyData()
{       
char cData[255] = {0};
intMaxsize = 255;
int track1len,track2len,track3len;


if(TrackSelect1 == EditSelect)
{
//滑鼠拖選
((CEdit *)GetDlgItem(IDC_EDIT_Track1))->GetSel(WrtieTrack1.Start, WrtieTrack1.End);
memset(cData,0,sizeof(cData));
track1len = m_ctrlTrack1.GetWindowText((char*)cData,Maxsize);

if(WrtieTrack1.End > track1len)
{
WrtieTrack1.End = track1len;
}
GetDlgItem(IDC_EDIT_Track1)->GetWindowText(WrtieTrack1.Allstring);
WrtieTrack1.Editdtring = WrtieTrack1.Allstring.Left(WrtieTrack1.End).Right(WrtieTrack1.End - WrtieTrack1.Start);
}
else if(TrackSelect2 == EditSelect)
{
//滑鼠拖選
((CEdit *)GetDlgItem(IDC_EDIT_Track2))->GetSel(WrtieTrack2.Start, WrtieTrack2.End);
memset(cData,0,sizeof(cData));
track2len = m_ctrlTrack2.GetWindowText((char*)cData,Maxsize);

if(WrtieTrack2.End > track2len)
{
WrtieTrack2.End = track2len;
}
GetDlgItem(IDC_EDIT_Track2)->GetWindowText(WrtieTrack2.Allstring);
WrtieTrack2.Editdtring = WrtieTrack2.Allstring.Left(WrtieTrack2.End).Right(WrtieTrack2.End - WrtieTrack2.Start);
}
else if(TrackSelect3 == EditSelect)
{
//滑鼠拖選
((CEdit *)GetDlgItem(IDC_EDIT_Track3))->GetSel(WrtieTrack3.Start, WrtieTrack3.End);
memset(cData,0,sizeof(cData));
track3len = m_ctrlTrack3.GetWindowText((char*)cData,Maxsize);

if(WrtieTrack3.End > track3len)
{
WrtieTrack3.End = track3len;
}
GetDlgItem(IDC_EDIT_Track3)->GetWindowText(WrtieTrack3.Allstring);
WrtieTrack3.Editdtring = WrtieTrack3.Allstring.Left(WrtieTrack3.End).Right(WrtieTrack3.End - WrtieTrack3.Start);
}


//文字內容儲存在source變數中,複製到貼上板中
if(OpenClipboard())
{
HGLOBAL clipbuffer;
char * buffer;


EmptyClipboard();


if(TrackSelect1 == EditSelect)
{
clipbuffer = GlobalAlloc(GMEM_DDESHARE, WrtieTrack1.Editdtring.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(WrtieTrack1.Editdtring));
}
else if(TrackSelect2 == EditSelect)
{
clipbuffer = GlobalAlloc(GMEM_DDESHARE, WrtieTrack2.Editdtring.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(WrtieTrack2.Editdtring));
}
else if(TrackSelect3 == EditSelect)
{
clipbuffer = GlobalAlloc(GMEM_DDESHARE, WrtieTrack3.Editdtring.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(WrtieTrack3.Editdtring));
}


GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
}


//貼上資料到編輯框
void CMSR009BTDlg::OnPasteData()
{    
int track1len,track2len,track3len;
char cData[255] = {0};
intMaxsize = 255;
char * buffer = NULL;
//開啟剪貼簿
CString fromClipboard;


if(OpenClipboard())
{
HANDLE hData = GetClipboardData(CF_TEXT);
char * buffer = (char*)GlobalLock(hData);
fromClipboard = buffer;
GlobalUnlock(hData);
CloseClipboard();
}


CHARFORMAT cf; 
ZeroMemory(&cf, sizeof(CHARFORMAT)); 
cf.cbSize = sizeof(CHARFORMAT); 
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE; 
cf.dwEffects = 0; 


if(TrackSelect1 == EditSelect)
{
m_ctrlTrack1.Paste();

if(m_brush1 != NULL)
{
m_brush1 = NULL;
track1len = m_ctrlTrack1.GetWindowText((char*)cData,Maxsize);
m_ctrlTrack1.SetSel(0, track1len); //設定處理區域
m_ctrlTrack1.SetSelectionCharFormat(cf);
m_ctrlTrack1.SetSel(track1len,track1len); //設定處理區域
}
}
else if(TrackSelect2 == EditSelect)
{
m_ctrlTrack2.Paste();

if(m_brush2 != NULL)
{
m_brush2 = NULL;
track2len = m_ctrlTrack2.GetWindowText((char*)cData,Maxsize);
m_ctrlTrack2.SetSel(0, track2len); //設定處理區域
m_ctrlTrack2.SetSelectionCharFormat(cf);
m_ctrlTrack2.SetSel(track2len,track2len); //設定處理區域
}
}
else if(TrackSelect3 == EditSelect)
{
m_ctrlTrack3.Paste();

if(m_brush3 != NULL)
{
m_brush3 = NULL;
track3len = m_ctrlTrack3.GetWindowText((char*)cData,Maxsize);
m_ctrlTrack3.SetSel(0, track3len); //設定處理區域
m_ctrlTrack3.SetSelectionCharFormat(cf);
m_ctrlTrack3.SetSel(track3len,track3len); //設定處理區域
}
}
}


//選擇資料
void CMSR009BTDlg::OnSelectData()
{   
    char cData[255] = {0};
intMaxsize = 255;
int track1len,track2len,track3len;
int i,j;


if(TrackSelect1 == EditSelect)
{
((CEdit *)GetDlgItem(IDC_EDIT_Track1))->GetSel(WrtieTrack1.Start, WrtieTrack1.End);
memset(cData,0,sizeof(cData));
track1len = m_ctrlTrack1.GetWindowText((char*)cData,Maxsize);

if(WrtieTrack1.End > track1len)
{
WrtieTrack1.End = track1len;
}
GetDlgItem(IDC_EDIT_Track1)->GetWindowText(WrtieTrack1.Allstring);
WrtieTrack1.Editdtring = WrtieTrack1.Allstring.Left(WrtieTrack1.End).Right(WrtieTrack1.End - WrtieTrack1.Start);


//----------------------------------//
if(WrtieTrack1.Start !=  WrtieTrack1.End)
{
j = WrtieTrack1.End - WrtieTrack1.Start;
if(j > 9)
{
SetDlgItemText(IDC_MessageTxet,WrtieTrack1.Editdtring);
MessageBox("(Message) The selected  number of track1 can not be more than 9 digits","Notion",MB_OK);
m_brush1 = NULL;
m_brush2 = NULL;
m_brush3 = NULL;


((CEdit *)GetDlgItem(IDC_EDIT_Track1))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track2))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track3))->SetSel(-1, 0);
Invalidate();


return;
}
for(i=0;i<j;i++)
{
if((WrtieTrack1.Editdtring[i] < '0') || (WrtieTrack1.Editdtring[i] > '9'))
{
m_brush1 = NULL;
m_brush2 = NULL;
m_brush3 = NULL;


((CEdit *)GetDlgItem(IDC_EDIT_Track1))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track2))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track3))->SetSel(-1, 0);
Invalidate();
SetDlgItemText(IDC_MessageTxet,WrtieTrack1.Editdtring);
MessageBox("(Message) The selected data of track1 can only choose digits!","Notion",MB_OK);
return;
}
}
if (m_brush1)
DeleteObject(m_brush1); 
m_brush1 = CreateSolidBrush(RGB(200, 200, 255)); // 根據需要設定


GetDlgItem(IDC_EDIT_Track1)->SetWindowText(WrtieTrack1.Allstring);
((CEdit *)GetDlgItem(IDC_EDIT_Track1))->SetSel(WrtieTrack1.Start, WrtieTrack1.End);
m_ctrlTrack1.SetFocus();
Invalidate();

CHARFORMAT cf; 
ZeroMemory(&cf, sizeof(CHARFORMAT)); 
cf.cbSize = sizeof(CHARFORMAT); 
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE; 
cf.dwEffects = 0; 
cf.crTextColor = RGB(255, 0, 0); //文字顏色
m_ctrlTrack1.SetSel(WrtieTrack1.Start, WrtieTrack1.End); //設定處理區域
m_ctrlTrack1.SetSelectionCharFormat(cf);
m_ctrlTrack1.EnableWindow(false);
}
}
else if(TrackSelect2 == EditSelect)
{
((CEdit *)GetDlgItem(IDC_EDIT_Track2))->GetSel(WrtieTrack2.Start, WrtieTrack2.End);
memset(cData,0,sizeof(cData));
track2len = m_ctrlTrack2.GetWindowText((char*)cData,Maxsize);

if(WrtieTrack2.End > track2len)
{
WrtieTrack2.End = track2len;
}
GetDlgItem(IDC_EDIT_Track2)->GetWindowText(WrtieTrack2.Allstring);
WrtieTrack2.Editdtring = WrtieTrack2.Allstring.Left(WrtieTrack2.End).Right(WrtieTrack2.End - WrtieTrack2.Start);


//--------------------------//
if(WrtieTrack2.Start !=  WrtieTrack2.End)
{
j = WrtieTrack2.End - WrtieTrack2.Start;
if(j > 9)
{
m_brush1 = NULL;
m_brush2 = NULL;
m_brush3 = NULL;


((CEdit *)GetDlgItem(IDC_EDIT_Track1))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track2))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track3))->SetSel(-1, 0);
Invalidate();
SetDlgItemText(IDC_MessageTxet,WrtieTrack2.Editdtring);
MessageBox("(Message) The selected  number of track2 can not be more than 9 digits","Notion",MB_OK);
return;
}
for(i=0;i<j;i++)
{
if((WrtieTrack2.Editdtring[i] < '0') || (WrtieTrack2.Editdtring[i] > '9'))
{
m_brush1 = NULL;
m_brush2 = NULL;
m_brush3 = NULL;


((CEdit *)GetDlgItem(IDC_EDIT_Track1))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track2))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track3))->SetSel(-1, 0);
Invalidate();
SetDlgItemText(IDC_MessageTxet,WrtieTrack2.Editdtring);
MessageBox("(Message) The selected data of track2 can only choose digits!","Notion",MB_OK);
return;
}
}


if (m_brush2)
DeleteObject(m_brush2); 
m_brush2 = CreateSolidBrush(RGB(200, 200, 255)); // 根據需要設定


GetDlgItem(IDC_EDIT_Track2)->SetWindowText(WrtieTrack2.Allstring);
((CEdit *)GetDlgItem(IDC_EDIT_Track2))->SetSel(WrtieTrack2.Start, WrtieTrack2.End);
m_ctrlTrack2.SetFocus();
Invalidate();

CHARFORMAT cf; 
ZeroMemory(&cf, sizeof(CHARFORMAT)); 
cf.cbSize = sizeof(CHARFORMAT); 
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE; 
cf.dwEffects = 0; 
cf.crTextColor = RGB(255, 0, 0); //文字顏色
m_ctrlTrack2.SetSel(WrtieTrack2.Start, WrtieTrack2.End); //設定處理區域
m_ctrlTrack2.SetSelectionCharFormat(cf);
m_ctrlTrack2.EnableWindow(false);
}
}
else if(TrackSelect3 == EditSelect)
{
((CEdit *)GetDlgItem(IDC_EDIT_Track3))->GetSel(WrtieTrack3.Start, WrtieTrack3.End);
memset(cData,0,sizeof(cData));
track3len = m_ctrlTrack3.GetWindowText((char*)cData,Maxsize);

if(WrtieTrack3.End > track3len)
{
WrtieTrack3.End = track3len;
}
GetDlgItem(IDC_EDIT_Track3)->GetWindowText(WrtieTrack3.Allstring);
WrtieTrack3.Editdtring = WrtieTrack3.Allstring.Left(WrtieTrack3.End).Right(WrtieTrack3.End - WrtieTrack3.Start);


//----------------------//
if(WrtieTrack3.Start !=  WrtieTrack3.End)
{
j = WrtieTrack3.End - WrtieTrack3.Start;
if(j > 9)
{
m_brush1 = NULL;
m_brush2 = NULL;
m_brush3 = NULL;


((CEdit *)GetDlgItem(IDC_EDIT_Track1))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track2))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track3))->SetSel(-1, 0);
Invalidate();
SetDlgItemText(IDC_MessageTxet,WrtieTrack3.Editdtring);
MessageBox("(Message) The selected  number of track3 can not be more than 9 digits","Notion",MB_OK);
return;
}
for(i=0;i<j;i++)
{
if((WrtieTrack3.Editdtring[i] < '0') || (WrtieTrack3.Editdtring[i] > '9'))
{
m_brush1 = NULL;
m_brush2 = NULL;
m_brush3 = NULL;


((CEdit *)GetDlgItem(IDC_EDIT_Track1))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track2))->SetSel(-1, 0);
((CEdit *)GetDlgItem(IDC_EDIT_Track3))->SetSel(-1, 0);
Invalidate();
SetDlgItemText(IDC_MessageTxet,WrtieTrack3.Editdtring);
MessageBox("(Message) The selected data of track3 can only choose digits!","Notion",MB_OK);
return;
}
}


if (m_brush3)
DeleteObject(m_brush3); 
m_brush3 = CreateSolidBrush(RGB(200, 200, 255)); // 根據需要設定


GetDlgItem(IDC_EDIT_Track3)->SetWindowText(WrtieTrack3.Allstring);
((CEdit *)GetDlgItem(IDC_EDIT_Track3))->SetSel(WrtieTrack3.Start, WrtieTrack3.End);
m_ctrlTrack3.SetFocus();
Invalidate();

CHARFORMAT cf; 
ZeroMemory(&cf, sizeof(CHARFORMAT)); 
cf.cbSize = sizeof(CHARFORMAT); 
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE; 
cf.dwEffects = 0; 
cf.crTextColor = RGB(255, 0, 0); //文字顏色
m_ctrlTrack3.SetSel(WrtieTrack3.Start, WrtieTrack3.End); //設定處理區域
m_ctrlTrack3.SetSelectionCharFormat(cf);
m_ctrlTrack3.EnableWindow(false);
}
}


if((WrtieTrack1.Start ==  WrtieTrack1.End) && (WrtieTrack2.Start ==  WrtieTrack2.End) && (WrtieTrack3.Start ==  WrtieTrack3.End))
{
MessageBox("Did not select any data!","Notion",MB_OK);
}
}


void CMSR009BTDlg::OnDeselectData()
{  
CHARFORMAT cf; 
ZeroMemory(&cf, sizeof(CHARFORMAT)); 
cf.cbSize = sizeof(CHARFORMAT); 
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE; 
cf.dwEffects = 0; 


if(TrackSelect1 == EditSelect)
{
m_ctrlTrack1.EnableWindow(true);
WrtieTrack1.Start = 0;
WrtieTrack1.End = 0;
WrtieTrack1.Editdtring = "";
WrtieTrack1.Allstring = "";


m_brush1 = NULL;
m_ctrlTrack1.SetSel(0, 200); //設定處理區域
m_ctrlTrack1.SetSelectionCharFormat(cf);
m_ctrlTrack1.SetSel(0,0); //設定處理區域
}
else if(TrackSelect2 == EditSelect)
{
m_ctrlTrack2.EnableWindow(true);
WrtieTrack2.Start = 0;
WrtieTrack2.End = 0;
WrtieTrack2.Editdtring = "";
WrtieTrack2.Allstring = "";


m_brush2 = NULL;
m_ctrlTrack2.SetSel(0, 200); //設定處理區域
m_ctrlTrack2.SetSelectionCharFormat(cf);
m_ctrlTrack2.SetSel(0,0); //設定處理區域
}
else if(TrackSelect3 == EditSelect)
{
m_ctrlTrack3.EnableWindow(true);
WrtieTrack3.Start = 0;
WrtieTrack3.End = 0;
WrtieTrack3.Editdtring = "";
WrtieTrack3.Allstring = "";


m_brush3 = NULL;
m_ctrlTrack3.SetSel(0, 200); //設定處理區域
m_ctrlTrack3.SetSelectionCharFormat(cf);
m_ctrlTrack3.SetSel(0,0); //設定處理區域
}
}