Click here to Skip to main content
15,883,957 members
Articles / Desktop Programming / WTL

A fast and lightweight cell control

Rate me:
Please Sign up or sign in to vote.
4.42/5 (31 votes)
11 Mar 2008CPOL1 min read 90.9K   4.5K   81  
A fast and lightweight cell control for displaying tabular data. The cell is a custom control derived from ATL::CWindow.
// commycell.idl : commycell �� IDL Դ
//

// ���ļ����� MIDL ���ߴ�����
// �������Ϳ�(commycell.tlb)�ͷ��ʹ�����롣

import "oaidl.idl";
import "ocidl.idl";

//cpp_quote("STDAPI CreateGrid(REFIID riid,IGrid** ppIGrid);")
//cpp_quote("typedef UINT CellType;")
[
	uuid(6FBB7466-8465-496C-8EDE-89BB5F511B63),
	version(1.0),
	helpstring("MyCell 1.0 ���Ϳ�")
]
library MyCell
{
	importlib("stdole2.tlb");

	//typedef enum ENotifyCodes
	//{
	//	OCN_BASE								=(0U-  0U),//NM_FIRST,
	//	OCN_LBUTTONDBLCLK			=OCN_BASE+0x0203,//(OCN_BASE+WM_LBUTTONDBLCLK),
	//	OCN_RBUTTONDOWN			=(OCN_BASE+0x0204/*WM_RBUTTONDOWN*/),
	//	OCN_LBUTTONDOWN			=(OCN_BASE+0x0201/*WM_LBUTTONDOWN*/),
	//	OCN_MOUSEMOVE					=(OCN_BASE+0x0200/*WM_MOUSEMOVE*/),
	//	OCN_LBUTTONUP					=(OCN_BASE+0x0202/*WM_LBUTTONUP*/),
	//	OCN_RBUTTONUP					=(OCN_BASE+0x0205/*WM_RBUTTONUP*/),
	//	OCN_KEYDOWN						=(OCN_BASE+0x0100/*WM_KEYDOWN*/),
	//	OCN_CHAR								=(OCN_BASE+0x0102/*WM_CHAR*/),
	//	OCN_GETCELLTEXT				=(OCN_BASE+10),
	//	OCN_SETCELLTEXT				=(OCN_BASE+13),
	//	OCN_DRAWCELL						=(OCN_BASE+17),
	//	OCN_ROWSINSERTFRONT	=(OCN_BASE+19),
	//	OCN_DELETEROWS				=(OCN_BASE+20),
	//	OCN_COLSINSERTFRONT		=(OCN_BASE+21),
	//	OCN_DELETECOLS					=(OCN_BASE+22),
	//	OCN_SETROWS						=(OCN_BASE+23),
	//	OCN_SETCOLS						=(OCN_BASE+24),
	//	OCN_ROWSHEIGHTSCHANGE=(OCN_BASE+25),
	//	OCN_COLSWIDTHSCHANGE	=(OCN_BASE+26),
	//	OCN_ACTIVECELLCHANGE		=(OCN_BASE+27),
	//	OCN_SELECTION_DRAG_END=(OCN_BASE+28),
	//	OCN_ENDCELLEDIT				=(0U-100U-76),//(OCN_BASE-76),/*LVN_ENDLABELEDIT*/
	//	OCN_DRAWHEADCELL			=(OCN_BASE+29),
	//}ENotifyCodes;

	typedef enum EXlLineStyle
	{
		xlLineStyleNone= 1,
		xlContinuous ,
		xlDash ,
		xlDashDot ,
		xlDashDotDot ,
		xlDot ,
		xlDouble ,
		xlSlantDashDot ,
	}EXlLineStyle;
	typedef enum EXlHAlign
	{
		xlHAlignCenter = 0,				//����				
		xlHAlignCenterAcrossSelection,	//�����
		xlHAlignDistributed,			//���˶���
		xlHAlignFill,					//���
		xlHAlignGeneral,				//����
		xlHAlignJustify,				//��ɢ����
		xlHAlignLeft,					//����������
		xlHAlignRight					//���ң�������
	}EXlHAlign;
	typedef enum EXlVAlign
	{
		xlVAlignBottom = 0,	//����
		xlVAlignCenter,		//����
		xlVAlignDistributed,//���˶���
		xlVAlignJustify,	//��ɢ����
		xlVAlignTop		    //����
	}EXlVAlign;

	typedef enum EXlBordersIndex{
		xlInsideHorizontal = 1<<0,
		xlInsideVertical = 1<<1,
		xlDiagonalDown = 1<<2,
		xlDiagonalUp = 1<<3,
		xlEdgeBottom = 1<<4,
		xlEdgeLeft = 1<<5,
		xlEdgeRight = 1<<6,
		xlEdgeTop = 1<<7
	} EXlBordersIndex;

	typedef enum EFontSetMask{
		EFSM_FONT_NAME=1<<0,
		EFSM_FONT_SIZE=1<<1,
		EFSM_FONT_COLOR=1<<2,
		EFSM_FONT_ITALIC=1<<3,
		EFSM_FONT_BOLD=1<<4,
		EFSM_FONT_UNDERLINE=1<<5,
		EFSM_FONT_STRIKEOUT=1<<6,
		EFSM_FONT_ALL=0xFF,
	}EFontSetMask;
	
	typedef enum EAlignmentSetMask{
		EASM_WRAPTEXT=1<<0,
		EASM_HORIZONTAL=1<<1,
		EASM_VERTICAL=1<<2,
	}EAlignmentSetMask;


	typedef enum ECellStorePosition
	{
		ESP_STYLE_CELL_OWN=0,//���ڵ�Ԫ��ķ��
		ESP_STYLE_MERGE_OWN,//���ںϲ���Ԫ��ķ��
		ESP_STYLE_ROW_OWN,//�����еķ��
		ESP_STYLE_COL_OWN,//�����еķ��
		ESP_STYLE_TABLE_OWN,//����Worksheet�ķ��
		ESP_STYLE_DEFAULT,//����ȱʡ���
	}ECellStorePosition;

	typedef enum ESelectionMode
	{
		ESM_SINGLECELL,
		ESM_SINGLELINE,
		ESM_MULTILINE,
		ESM_SINGLESELECTION,
		ESM_MULTISELECTION,
	}ESelectionMode;

	typedef enum ECellType 
	{
		ECT_NONE	=0,
		ECT_TEXT,
		ECT_COMBOBOX,
		ECT_CHECKBOX,
		ECT_CALENDAR,//cellCalendar,
		ECT_BUTTON,//cellButton,
		ECT_HYPERLINK,//cellHyperLink,
		ECT_UINT,//cellUINTEdit,
		ECT_INT,//ECT_UINT,
		ECT_UDOUBLE,//ECT_UDOUBLE,
		ECT_DOUBLE,//ECT_DOUBLE,
		ECT_LOGICAL,
		ECT_DEGREE,//ECT_DEGREE,
		ECT_COLOR,//ECT_COLOR,
		ECT_ROWHEADER,
		ECT_COLHEADER,
		ECT_HEADERCORNER,
		ECT_USER=200,
		ECT_MAX=256
	} ECellType;

	typedef enum ESelectionState 
	{
		EST_NOT_IN_SELECTION=0,			//����ѡ����
		EST_IN_SELECTION,		//��ѡ����
		EST_IN_PROJECTION_OF_SELECTION,//��ѡ�񼯵�ͶӰ���У�Header Cell Used
		EST_ACTIVECELL,
	}ESelectionState;

	typedef enum EGetCellValDistination
	{
		EGCVD_NORMAL,
		EGCVD_RENDER,//���ڻ���
		EGCVD_EDIT,//���ڱ༭
		EGCVD_TOOLTIP,//����Toolitip
	}EGetCellValDistination;
	//typedef struct GetCellTextInfo
	//{
	//	LPTSTR lpText;
	//	bool bRender;//�Ƿ����ڻ��ƻ�tooltip
	//	//GetCellTextInfo(LPTSTR buf,bool bRen):lpText
	//}GetCellTextInfo;
	typedef struct Cell
	{
		int row;
		int col;
	}Cell;

	typedef struct CellRange
	{
		Cell leftTop;
		Cell rightBottom;
	}CellRange;

	typedef struct HLS
	{
		BYTE L;
		BYTE H;
		BYTE S;
	}HLS;

	typedef struct ColorEntry
	{
		COLORREF	color;
		LPCTSTR		lpszName;
		HLS				lhs;
	}ColorEntry;

	typedef struct GetCellTextInfo{
		VARIANT* lpText;
		EGetCellValDistination gcvDist;//�Ƿ����ڻ��ƻ�tooltip
	}GetCellTextInfo;
	typedef struct _NMHDR
	{
		/*OLE_HANDLE*/HWND      hwndFrom;
		UINT_PTR  idFrom;
		UINT      code;         // NM_ code
	}   _NMHDR;
	typedef struct NM_SHEETVIEW {
		_NMHDR hdr;
		int   row;
		int   col;
		LPARAM lParam;
		HRESULT hr;
		BOOL bHandled;
	} NM_SHEETVIEW;

	typedef struct DrawCellInfo{
		const CellRange* pMerge;
		RECT rcCell;
		//BYTE* pdata;
		//int nDataLen;
		const VARIANT* pdata;
		EXlHAlign hAlign;
		EXlVAlign vAlign;
		void* pLogFont;
		COLORREF clrFont;
		COLORREF clrBkgnd;
		ECellType cellType;
		ESelectionState nSelState;
		BYTE bWrapText;
		//BYTE bActive;
		//BYTE bSelected;
		BYTE bMouseHover;
	}DrawCellInfo;

	[
		object,
		uuid(1f649aa0-a3e8-494d-a604-201324012e9b),
		helpstring("ICellSymbol interface"),
		pointer_default(unique)
	] 
	interface ICellSymbol : IUnknown {
		[helpstring("")]HRESULT Draw([in]HDC hDC, [in]int row,[in]int col,[in]const DrawCellInfo* pDCI);//VARIANT_BOOL bMerge,[in] RECT *rcCell,[in]BYTE* data,[in]int nDataLen,[in]EXlHAlign hAlign,[in]EXlVAlign vAlign);
		//[helpstring("")]HRESULT SetMergeInfo([in]int leftCol,[in]int topRow,[in]int rightCol,[in]int bottomRow);
		[helpstring("")]HRESULT OnThemeChanged([in]HWND hWnd);
	};
	[
		object,
		uuid(d6b900af-7142-4503-a1b3-0ebaf5639b8c),
		helpstring("ICellEditor interface"),
		pointer_default(unique)
	] 
	interface ICellEditor : IUnknown {
		[helpstring("")]HRESULT OnLButtonDblClick([in]int ptX,[in]int ptY,[in]Cell cell,[in]const VARIANT* pCellVal,[in]UINT flags);
		[helpstring("")]HRESULT OnLButtonDown([in]int ptX,[in]int ptY,[in]Cell cell,[in]const VARIANT* pCellVal,[in]UINT flags,[in]VARIANT_BOOL* pbHandled);
		[helpstring("")]HRESULT OnChar([in]Cell cell,[in]const VARIANT* pCellVal,[in]WPARAM wParam,[in]LPARAM lParam,[in]VARIANT_BOOL* pbHandled);
		[helpstring("")]HRESULT OnImeComposition([in]Cell cell,[in]const VARIANT* pCellVal,[in]WPARAM wParam,[in]LPARAM lParam,[in]VARIANT_BOOL* pbHandled);
	};

	[
		object,
		uuid(3f9d2fae-c2dd-4159-a24a-912f720af677),
		helpstring("IWorkbook interface"),
		pointer_default(unique)
	] 
	interface IGrid : IUnknown {
		[helpstring("")]HRESULT Create([in]/*OLE_HANDLE*/HWND hWndParent, [in] RECT *rcPos, [in] BSTR szWindowName, [in] unsigned long dwStyle, [in] unsigned long dwExStyle, [in] unsigned long nID, [in] LPVOID lpCreateParam);
		[helpstring("")]HRESULT GetHWnd([out,retval]HWND* pval);
	};
};

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
China China
My name is Yanxueming,i live in Chengdu China.Graduated from UESTC in 1999.

Comments and Discussions