📄 gridctrldemodlg.cpp
字号:
// GridCtrlDemoDlg.cpp : implementation file
//
#include "stdafx.h"
#include "GridCtrlDemo.h"
#include "GridCtrlDemoDlg.h"
// Added by Kah Hoe (To recognize WM_IDLEUPDATECMDUI)
#include <AfxPriv.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg() : CDialog(IDD_ABOUTBOX) {}
};
/////////////////////////////////////////////////////////////////////////////
// CGridCtrlDemoDlg dialog
CGridCtrlDemoDlg::CGridCtrlDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGridCtrlDemoDlg::IDD, pParent)
{
m_OldSize = CSize(-1,-1);
//{{AFX_DATA_INIT(CGridCtrlDemoDlg)
m_nFixCols = 1;
m_nFixRows = 1;
m_nCols = 10;
m_nRows = 50;
m_bEditable = TRUE;
m_bHorzLines = TRUE;
m_bListMode = FALSE;
m_bVertLines = TRUE;
m_bSelectable = TRUE;
m_bAllowColumnResize = TRUE;
m_bAllowRowResize = TRUE;
m_bHeaderSort = TRUE;
m_bReadOnly = TRUE;
m_bItalics = TRUE;
m_btitleTips = TRUE;
m_bSingleSelMode = FALSE;
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CGridCtrlDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGridCtrlDemoDlg)
DDX_Control(pDX, IDC_SPIN_ROW, m_RowSpin);
DDX_Control(pDX, IDC_SPIN_FIXROW, m_FixRowSpin);
DDX_Control(pDX, IDC_SPIN_FIXCOL, m_FixColSpin);
DDX_Control(pDX, IDC_SPIN_COL, m_ColSpin);
DDX_Text(pDX, IDC_EDIT_FIXCOLS, m_nFixCols);
DDX_Text(pDX, IDC_EDIT_FIXROWS, m_nFixRows);
DDX_Text(pDX, IDC_EDIT_COLS, m_nCols);
DDX_Text(pDX, IDC_EDIT_ROWS, m_nRows);
DDX_Check(pDX, IDC_EDITABLE, m_bEditable);
DDX_Check(pDX, IDC_HORZ_LINES, m_bHorzLines);
DDX_Check(pDX, IDC_LISTMODE, m_bListMode);
DDX_Check(pDX, IDC_VERT_LINES, m_bVertLines);
DDX_Check(pDX, IDC_ALLOW_SELECTION, m_bSelectable);
DDX_Check(pDX, IDC_COL_RESIZE, m_bAllowColumnResize);
DDX_Check(pDX, IDC_ROW_RESIZE, m_bAllowRowResize);
DDX_Check(pDX, IDC_HEADERSORT, m_bHeaderSort);
DDX_Check(pDX, IDC_READ_ONLY, m_bReadOnly);
DDX_Check(pDX, IDC_ITALICS, m_bItalics);
DDX_Check(pDX, IDC_TITLETIPS, m_btitleTips);
DDX_Check(pDX, IDC_SINGLESELMODE, m_bSingleSelMode);
//}}AFX_DATA_MAP
// There is a problem with registering the grid as an OLE Drop target
// in the CGridCtrl::PreSubclassWindow function that only shows itself
// under win95. To ensure that the grid can accept drag and drop items,
// we use the DDX_GridControl routine which ensures that CGridCtrl::SubclassWindow
// is called, and hence the grid will be registered as a drop target.
//
// If ANYONE knows a neater way, please let me know. I'm new to this stuff!
DDX_GridControl(pDX, IDC_GRID, m_Grid);
}
BEGIN_MESSAGE_MAP(CGridCtrlDemoDlg, CDialog)
//{{AFX_MSG_MAP(CGridCtrlDemoDlg)
ON_WM_SYSCOMMAND()
ON_WM_QUERYDRAGICON()
ON_EN_UPDATE(IDC_EDIT_COLS, OnUpdateEditCols)
ON_EN_UPDATE(IDC_EDIT_FIXCOLS, OnUpdateEditFixcols)
ON_EN_UPDATE(IDC_EDIT_FIXROWS, OnUpdateEditFixrows)
ON_EN_UPDATE(IDC_EDIT_ROWS, OnUpdateEditRows)
ON_BN_CLICKED(IDC_HORZ_LINES, OnGridLines)
ON_BN_CLICKED(IDC_LISTMODE, OnListmode)
ON_BN_CLICKED(IDC_EDITABLE, OnEditable)
ON_BN_CLICKED(IDC_PRINT_BUTTON, OnPrintButton)
ON_BN_CLICKED(IDC_ALLOW_SELECTION, OnAllowSelection)
ON_BN_CLICKED(IDC_ROW_RESIZE, OnRowResize)
ON_BN_CLICKED(IDC_COL_RESIZE, OnColResize)
ON_BN_CLICKED(IDC_FONT_BUTTON, OnFontButton)
ON_WM_SIZE()
ON_BN_CLICKED(IDC_HEADERSORT, OnHeaderSort)
ON_COMMAND(ID_EDIT_SELECTALL, OnEditSelectall)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_BN_CLICKED(IDC_READ_ONLY, OnReadOnly)
ON_BN_CLICKED(IDC_ITALICS, OnItalics)
ON_BN_CLICKED(IDC_TITLETIPS, OnTitletips)
ON_BN_CLICKED(IDC_INSERT_ROW, OnInsertRow)
ON_BN_CLICKED(IDC_DELETE_ROW, OnDeleteRow)
ON_BN_CLICKED(IDC_SINGLESELMODE, OnSingleselmode)
ON_BN_CLICKED(IDC_VERT_LINES, OnGridLines)
ON_COMMAND(ID_FILE_PRINT, OnPrintButton)
ON_BN_CLICKED(IDC_PRINTPREVIEW_BUTTON, OnPrintpreviewButton)
//}}AFX_MSG_MAP
#ifndef GRIDCONTROL_NO_CLIPBOARD
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopyOrCut)
ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCopyOrCut)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
#endif
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGridCtrlDemoDlg message handlers
BOOL CGridCtrlDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
#ifndef _WIN32_WCE
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
#else
CSize ScreenSize();
::SetWindowPos(m_hWnd, HWND_TOP,0,0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN) - 32, // 32 = kludge value
SWP_SHOWWINDOW);
#endif
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CRect rect;
GetClientRect(rect);
m_OldSize = CSize(rect.Width(), rect.Height());
// init spin controls
m_RowSpin.SetRange(0,999);
m_FixRowSpin.SetRange(0,999);
m_FixColSpin.SetRange(0,999);
m_ColSpin.SetRange(0,999);
OnListmode();
/////////////////////////////////////////////////////////////////////////
// initialise grid properties
/////////////////////////////////////////////////////////////////////////
m_ImageList.Create(MAKEINTRESOURCE(IDB_IMAGES), 16, 1, RGB(255,255,255));
m_Grid.SetImageList(&m_ImageList);
m_Grid.SetEditable(m_bEditable);
m_Grid.SetListMode(m_bListMode);
m_Grid.EnableDragAndDrop(TRUE);
m_Grid.SetTextBkColor(RGB(0xFF, 0xFF, 0xE0));
TRY {
m_Grid.SetRowCount(m_nRows);
m_Grid.SetColumnCount(m_nCols);
m_Grid.SetFixedRowCount(m_nFixRows);
m_Grid.SetFixedColumnCount(m_nFixCols);
}
CATCH (CMemoryException, e)
{
e->ReportError();
e->Delete();
return FALSE;
}
END_CATCH
DWORD dwTextStyle = DT_RIGHT|DT_VCENTER|DT_SINGLELINE;
#ifndef _WIN32_WCE
dwTextStyle |= DT_END_ELLIPSIS;
#endif
// fill rows/cols with text
for (int row = 0; row < m_Grid.GetRowCount(); row++)
for (int col = 0; col < m_Grid.GetColumnCount(); col++)
{
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
if (row < m_nFixRows)
{
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.szText.Format(_T("Column %d"),col);
}
else if (col < m_nFixCols)
{
Item.nFormat = dwTextStyle;
Item.szText.Format(_T("Row %d"),row);
}
else
{
Item.nFormat = dwTextStyle;
Item.szText.Format(_T("%d"),row*col);
}
m_Grid.SetItem(&Item);
if (col == (m_Grid.GetFixedColumnCount()-1) )//&& row >= m_Grid.GetFixedRowCount())
m_Grid.SetItemImage(row, col, rand()%m_ImageList.GetImageCount());
//else if (rand() % 10 == 1)
// m_Grid.SetItemImage(row, col, 0);
if (rand() % 10 == 1)
{
COLORREF clr = RGB(rand() % 128+128, rand() % 128+128, rand() % 128+128);
m_Grid.SetItemBkColour(row, col, clr);
m_Grid.SetItemFgColour(row, col, RGB(255,0,0));
}
}
// Make cell 1,1 read-only
m_Grid.SetItemState(1,1, m_Grid.GetItemState(1,1) | GVIS_READONLY);
OnItalics();
OnTitletips();
m_Grid.AutoSize();
m_Grid.SetRowHeight(0, 3*m_Grid.GetRowHeight(0)/2);
return TRUE; // return TRUE unless you set the focus to a control
}
void CGridCtrlDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
HCURSOR CGridCtrlDemoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CGridCtrlDemoDlg::OnUpdateEditCols()
{
if (!::IsWindow(m_Grid.m_hWnd)) return;
UpdateData();
int nOldNumCols = m_Grid.GetColumnCount();
TRY {
m_Grid.SetColumnCount(m_nCols);
}
CATCH (CMemoryException, e)
{
e->ReportError();
e->Delete();
return;
}
END_CATCH
m_nCols = m_Grid.GetColumnCount();
m_nFixCols = m_Grid.GetFixedColumnCount();
UpdateData(FALSE);
CString str;
for (int i = nOldNumCols; i < m_nCols; i++)
{
str.Format(_T("Column %d"), i);
m_Grid.SetItemText(0,i,str);
}
}
void CGridCtrlDemoDlg::OnUpdateEditFixcols()
{
if (!::IsWindow(m_Grid.m_hWnd)) return;
UpdateData();
TRY {
m_Grid.SetFixedColumnCount(m_nFixCols);
}
CATCH (CMemoryException, e)
{
e->ReportError();
e->Delete();
return;
}
END_CATCH
m_nCols = m_Grid.GetColumnCount();
m_nFixCols = m_Grid.GetFixedColumnCount();
UpdateData(FALSE);
}
void CGridCtrlDemoDlg::OnUpdateEditFixrows()
{
if (!::IsWindow(m_Grid.m_hWnd)) return;
UpdateData();
TRY {
m_Grid.SetFixedRowCount(m_nFixRows);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -