📄 rxedit.cpp
字号:
// RxEdit.cpp : implementation file
//
#include "stdafx.h"
#include "qpglxt.h"
#include "RxEdit.h"
#include "RxGrid.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
# define EGRID 9999
/////////////////////////////////////////////////////////////////////////////
// RxEdit
RxEdit::RxEdit()
{
this->IsShowing=false;
this->Init=false;
EnterNumber=0;
PopHide=false;
}
RxEdit::~RxEdit()
{
m_Grid.DestroyWindow();
}
BEGIN_MESSAGE_MAP(RxEdit, CEdit)
//{{AFX_MSG_MAP(RxEdit)
ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// RxEdit message handlers
void RxEdit::ShowGrid()
{
this->AutoPosition();
m_Grid.ShowWindow(SW_SHOW);
this->IsShowing=true;
}
bool RxEdit::Initialize(CWnd *cParent)
{
Parent=cParent;
try{
m_Grid.Create(WS_BORDER,CRect(0,0,200,200),cParent,EGRID);
}
catch(...)
{
return false;
}
this->ModifyStyle(LVS_EDITLABELS,0L); //标题栏不可编辑
m_Grid.ModifyStyle(0L,LVS_REPORT);
m_Grid.ModifyStyle(0L,LVS_SHOWSELALWAYS); //高亮显示被选中项
m_Grid.SetExtendedStyle(LVS_EX_FULLROWSELECT| //允许整行选中
LVS_EX_HEADERDRAGDROP| //允许整列拖动
LVS_EX_GRIDLINES| //画出网格线
LVS_EX_ONECLICKACTIVATE| //单击选中项
LVS_EX_FLATSB); //扁平风格显示滚动条
m_Grid.SetBkColor(RGB(255,255,230));
m_Grid.SetTextBkColor(RGB(255,255,230));
return true;
}
void RxEdit::SetRecordset(RxRecordset prst)
{
int cols[255];
this->m_Grid.GetColumnOrderArray(&cols[0]);
for(int i=0;i<255;i++)
{
if(cols[i]==-858993460)
break;
m_Grid.DeleteColumn(i);
}
m_Grid.DeleteColumn(0);
rst=prst;
for(int m=0;m<prst.GetFieldCount();m++)
{
m_Fields[m]=prst.GetFieldName(m);
m_Grid.InsertColumn(m,m_Fields[m]);
}
this->AddItemValue(prst);
}
void RxEdit::AutoPosition()
{
CRect EdtRect,ParentRect,NewRect;
this->GetWindowRect(&EdtRect);
Parent->GetWindowRect(&ParentRect);
//取得 Edit 在 Parent 上的位置
NewRect.top=EdtRect.top-ParentRect.top-23+EdtRect.Height();
NewRect.left=EdtRect.left-ParentRect.left-4;
NewRect.right=NewRect.left+GridRect.Width();
NewRect.bottom=NewRect.top+120;
//处理横坐标
if(NewRect.left>ParentRect.Width()/2)
{
NewRect.right=EdtRect.right-ParentRect.left-3;
NewRect.left=NewRect.right-GridRect.Width();
if(NewRect.left<20)
NewRect.left=20;
}
else
{
NewRect.right=NewRect.left+GridRect.Width();
if(NewRect.right>=::GetSystemMetrics(SM_CXSCREEN)-100)
NewRect.right=::GetSystemMetrics(SM_CXSCREEN)-100;
}
Parent->ClientToScreen(&NewRect);
m_Grid.MoveWindow(&NewRect);
}
BOOL RxEdit::PreTranslateMessage(MSG* pMsg)
{
if(m_bOnly==true)
{
if(pMsg->message==WM_KEYDOWN&&((pMsg->wParam<48||pMsg->wParam>57)&&pMsg->wParam!=8&&pMsg->wParam!=8&&pMsg->wParam!=38&&pMsg->wParam!=40&&pMsg->wParam!=13&&pMsg->wParam!=VK_ESCAPE))
if((pMsg->wParam<VK_NUMPAD0||pMsg->wParam>VK_NUMPAD9))
{
pMsg->wParam=VK_CONTROL ;
return true;
}
}
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)
{
if(this->IsShowing==true)//截获ESC
{
this->HideGrid();
pMsg->wParam=VK_CONTROL;
}
}
//截获↓
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_DOWN)
{
if(this->PopHide==false)
{
if(this->IsShowing==false)
{
this->ShowGrid();
this->OnChange();
}
}
}
CString sText;
if(this->Init==false)
{
//设置字体、字号
LOGFONT logfont;
logfont.lfCharSet=134;
logfont.lfClipPrecision=0;
logfont.lfEscapement=0;
logfont.lfHeight=-12;
logfont.lfItalic=0;
logfont.lfOrientation=0;
logfont.lfOutPrecision=0;
logfont.lfPitchAndFamily=2;
logfont.lfQuality=0,
logfont.lfStrikeOut=0;
logfont.lfUnderline=0;
logfont.lfWeight=400;
logfont.lfWidth=0;
strcpy(logfont.lfFaceName,"宋体");
m_Font.DeleteObject();
m_Font.CreateFontIndirect(&logfont);
this->SetFont(&m_Font);
this->Init=true;
}
//如果作为表格的单元格
CString RunTimeClass="CListCtrl";
if(this->IsShowing==true)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==38)
{
m_Grid.SetFocus();
this->SetFocus();
pMsg->hwnd=m_Grid.GetSafeHwnd();
pMsg->message=WM_KEYDOWN;
pMsg->wParam=38;
}
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==40)
{
m_Grid.SetFocus();
this->SetFocus();
pMsg->hwnd=m_Grid.GetSafeHwnd();
pMsg->message=WM_KEYDOWN;
pMsg->wParam=40;
}
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==13)
{
if(m_Grid.GetSelectionMark()==-1)
// return true;
{
sText=m_Grid.GetItemText(0,m_FieldNameNumber);
this->SetWindowText(sText);
this->HideGrid();
return true;
}
sText=m_Grid.GetItemText(m_Grid.GetSelectionMark(),m_FieldNameNumber);
this->SetWindowText(sText);
this->HideGrid();
}
EnterNumber=0;
}
else
{
if( this->GetParent()->GetRuntimeClass()->m_lpszClassName==RunTimeClass)
{
RxGrid* rParent =(RxGrid*)GetParent();
if(pMsg->message==WM_KEYUP && pMsg->wParam==13)
pMsg->hwnd=Parent->GetParent()->GetSafeHwnd();
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==13)
{
EnterNumber=EnterNumber+1;
if(EnterNumber>1) //用户敲两次回车
goto end;
this->GetWindowText(sText);
if(sText.IsEmpty())
return false;
rParent->MoveNextItem();
pMsg->hwnd=Parent->GetParent()->GetSafeHwnd();
}
}
end: if(pMsg->message==WM_KEYDOWN && pMsg->wParam==13)
pMsg->wParam=9;
}
return CEdit::PreTranslateMessage(pMsg);
}
void RxEdit::HideGrid()
{
this->m_Grid.ShowWindow(SW_HIDE);
this->IsShowing=false;
}
void RxEdit::SetSelectField(CString sFieldName)
{
this->m_FieldName=sFieldName;
for(int m=0;m<255;m++)
{
if(sFieldName==this->m_Fields[m])
{
m_FieldNameNumber=m;
break;
}
}
}
void RxEdit::OnChange()
{
if(this->PopHide==true)
return ;
if(this->m_FieldName.IsEmpty())
return;
CString sSQL,sText,sRecordset;
RxRecordset OnCrst;
sRecordset=rst.GetSQL();
if(sRecordset.IsEmpty())
return;
BYTE chr;
this->GetWindowText(sText);
if(sText.IsEmpty()==false)
chr=sText.GetAt(0);
else
goto Next;
if(this->StartUpAssciation==true)//启动联系输入
{
if(chr>=97 &&chr<=122) //小写字母
sSQL.Format("SELECT * From %s WHERE 简称 LIKE'%s%%'",sRecordset,sText);
else
goto Next;
}
else
Next: sSQL.Format("SELECT * From %s WHERE %s LIKE'%s%%'",sRecordset,this->m_FieldName,sText);
OnCrst.Open(sSQL,adCmdText);
if (OnCrst.GetRecordCount()<=0)
return;
if(this->IsShowing==false)
this->ShowGrid();
this->AddItemValue(OnCrst);
// this->SetSel(sText.GetLength(),0);
m_Grid.SetParent(Parent->GetParent());
}
void RxEdit::AddItemValue(RxRecordset prst)
{
CString sValue;
int ColumnWidth=0;
m_Grid.DeleteAllItems();
for(int m=0;m<prst.GetRecordCount();m++)
{
m_Grid.InsertItem(m,"");
}
for( m=0;m<prst.GetRecordCount();m++)
{
prst.Move(m);
for(int n=0;n<prst.GetFieldCount();n++)
{
sValue=prst.GetFieldValue(prst.GetFieldName(n));
m_Grid.SetItemText(m,n,sValue);
}
}
for(m=0;m<prst.GetFieldCount();m++)
{
m_Grid.SetColumnWidth(m,LVSCW_AUTOSIZE);
}
for(m=0;m<prst.GetFieldCount();m++)
{
m_Grid.SetColumnWidth(m,m_Grid.GetColumnWidth(m)+20);
ColumnWidth=ColumnWidth+m_Grid.GetColumnWidth(m);
}
CRect rect;
m_Grid.GetClientRect(&rect);
rect.right=rect.left+ColumnWidth;
GridRect=rect;
}
void RxEdit::OnKillfocus()
{
CString RunTimeClass="CListCtrl";
if(this->GetParent()->GetRuntimeClass()->m_lpszClassName==RunTimeClass)
{
RxGrid* Parent =(RxGrid*)GetParent();
if(Parent)
Parent->EndEdit();
}
EnterNumber=0;
}
void RxEdit::ClearAll()
{
try{
m_Grid.DeleteAllItems();
}
catch(...)
{
return;
}
for(int m=0;m<rst.GetFieldCount();m++)
{
try{
m_Grid.DeleteColumn(0);
}
catch(...)
{
break;
}
}
}
void RxEdit::NumberOnly(bool bOnly)
{
m_bOnly=bOnly;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -