|
|
/* @doc INTERNAL
* * @module _CBHOST.H Combobox Host for Window's Rich Edit Control | * * * Original Author: <nl> * Jerry Kim * * History: <nl> * 01/30/98 v-jerrki created */ #ifndef _CBHOST_H
#define _CBHOST_H
#ifndef NOWINDOWHOSTS
#include "_host.h"
#define CB_LISTBOXID 1000
#define CB_EDITBOXID 1001
enum ITEMMSG { ITEM_MSG_DRAWLIST = 1, ITEM_MSG_DRAWCOMBO, ITEM_MSG_DELETE, ITEM_MSG_MEASUREITEM, };
extern "C" LRESULT CALLBACK RichComboBoxWndProc(HWND, UINT, WPARAM, LPARAM); class CCmbBxWinHost : public CTxtWinHost { friend LRESULT CALLBACK RichComboBoxWndProc(HWND, UINT, WPARAM, LPARAM);
public: typedef enum { // enumeration determining type of combo box
kSimple = 1, kDropDown = 2, kDropDownList = 3 } Combotype;
#ifndef NOACCESSIBILITY
//////////////////////// Combobox IAccessible Methods //////////////////////////////
// COMBOBOXES
#define INDEX_COMBOBOX 0
#define INDEX_COMBOBOX_ITEM 1
#define INDEX_COMBOBOX_BUTTON 2
#define INDEX_COMBOBOX_LIST 3
#define CCHILDREN_COMBOBOX 3
public: // -----------------------------
// IUnknown interface
// -----------------------------
virtual HRESULT WINAPI QueryInterface(REFIID riid, void **ppvObject); #endif
public: DWORD _fRightAlign:1; // Determines if the combo box should be right aligned
DWORD _fListVisible:1; // Determines if list is visible
DWORD _fOwnerDraw:1; // owner draw combo box
DWORD _fOwnerDrawVar:1; // owner draw combo box with varibale height
DWORD _fFocus:1; // do we have the focus?
DWORD _fMousedown:1; // if the left button was down
DWORD _fVisible:1; // window is visible
DWORD _fEnabled:1; // window is enabled
DWORD _fNoIntegralHeight:1; // no integral height
DWORD _fCapture:1; // determines if the combo box has mouse cursor captured or not
DWORD _fResizing:1; // flag to indicate we are resizing the window
DWORD _fExtendedUI:1; // flag indicating if extended ui is used
DWORD _fLBCBMessage:1; // flag indicating the message is LBCB_TRACKING
DWORD _fIgnoreChange:1; // flag indicating there was an internal change of text in
// the edit control
DWORD _fIgnoreUpdate:1; // flag indicating if we should ignore the update flag, we need
// this flag because there will be cases where updateWindow is
// needed but we don't want to fire the notification
DWORD _fButtonDown:1; // true when button is pressed
DWORD _fDontWinNotify:1; // true when we don't want to call WinNotify for changes
DWORD _fSendEditChange:1; // true when we need to send CBN_EDITCHANGE after painting the change
// editbox
DWORD _fShutDown:1; // true when we are shutting down
HWND _hwndList; // window handle of listbox
HCURSOR _hcurOld; // handle to the mouse cursor
protected: RECT _rcWindow; // rect of window which the combo box was created with
RECT _rcButton; // rect of button
RECT _rcList; // rect of listbox
// we have to have a minimum inset for either the right or left
// to account for the button for the combo box
int _dxRInset; // minimum right inset
int _dxLInset; // minimum left inset
int _dxROffset; // indents for right and left these values should be used
int _dxLOffset; // with _dxRInset/_dxLInset to properly calculate the indents
int _dyFont; // Height of the current font, may not necessarily be the system font
int _dyEdit; // height of items
int _cyCombo; // Height of the combo box
int _cxCombo; // Width of the combo box
int _cyList; // Height of the listbox
int _cxList; // Width of the listbox set via CB_SETDROPWIDTH
long _nCursor; // last selected cursor -2 by default
BOOL _bSelOk; // used to help in determining what kind of notification to give
UINT _idCtrl; // ID of control
Combotype _cbType; // current combo box style
CLstBxWinHost* _plbHost; // pointer to listbox host
protected:
// Draws the combo button
void DrawButton(HDC hdc, BOOL bDown);
// Sets the edit controls text to item of the list box
void AutoUpdateEdit(int i);
// Hilite the edit control
void HiliteEdit(BOOL bSelect);
// resizes the list box
void SetDropSize(RECT* prc);
// set the edit size
void SetSizeEdit(int nLeft, int nTop, int nRight, int nBottom);
// get the rect for the listbox
void GetListBoxRect(RECT &rcList);
public: // Constructor / Destructor
CCmbBxWinHost(); virtual ~CCmbBxWinHost();
// initialization function
virtual BOOL Init(HWND, const CREATESTRUCT *);
// Window creation/destruction
static LRESULT OnNCCreate(HWND hwnd, const CREATESTRUCT *pcs); static void OnNCDestroy(CCmbBxWinHost *ped); virtual LRESULT OnCreate(const CREATESTRUCT *pcs);
// Edit control Text helper functions
LRESULT GetEditText(LPTSTR szStr, int nSize); LRESULT GetTextLength();
// Draws the focus rect for the edit control
void DrawEditFocus(HDC);
// Sets the text in the edit control to the text of the current item in the
// list box
void UpdateEditBox();
// selects the item which has the same text string as the edit control
int UpdateListBox(BOOL);
// hides the listbox
BOOL HideListBox(BOOL, BOOL);
// shows the list box
void ShowListBox(BOOL);
// Used as a way for the listbox to communicate to the combo box about a selection
void SetSelectionInfo(BOOL bOk, int nIdx);
// Update the window but don't send the notification
void UpdateCbWindow() { _fIgnoreUpdate = 1; TxViewChange(TRUE); _fIgnoreUpdate = 0; } BOOL DrawCustomFrame(WPARAM wParam, HDC hDCIn);
/////////////////////////////// message handlers /////////////////////////////////
// Richedit message
LRESULT OnSetTextEx(WPARAM wparam, LPARAM lparam); // Keyboard messages
virtual LRESULT OnKeyDown(WORD vKey, DWORD dwFlags); virtual LRESULT OnChar(WORD vKey, DWORD dwFlags); virtual LRESULT OnSyskeyDown(WORD vKey, DWORD dwFlags);
// mouse messages
LRESULT OnLButtonUp(WPARAM wparam, LPARAM lparam); LRESULT OnMouseMove(WPARAM wparam, LPARAM lparam); LRESULT OnMouseWheel(WPARAM wparam, LPARAM lparam); LRESULT OnSetCursor(WPARAM wparam, LPARAM lparam); LRESULT OnLButtonDown(WPARAM wparam, LPARAM lparam); LRESULT OnMouseLeave(WPARAM wparam, LPARAM lparam);
// focus messages
LRESULT OnSetFocus(WPARAM wparam, LPARAM lparam); LRESULT OnKillFocus(WPARAM wparam, LPARAM lparam); LRESULT OnCaptureChanged(WPARAM wparam, LPARAM lparam);
// window messages
LRESULT OnPaint(WPARAM, LPARAM); HRESULT OnCommand(WPARAM wparam, LPARAM lparam); LRESULT OnSize(WPARAM wparam, LPARAM lparam); LRESULT OnGetDlgCode(WPARAM wparam, LPARAM lparam); LRESULT OnEnable(WPARAM wparam, LPARAM lparam);
// rich edit private message
LRESULT OnSetEditStyle(WPARAM wparam, LPARAM lparam);
//@cmember Notify host of events
virtual HRESULT TxNotify(DWORD iNotify, void *pv);
//@cmember Scroll the content of the specified window's client area
virtual void TxScrollWindowEx (INT dx, INT dy, LPCRECT lprcScroll, LPCRECT lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate, UINT fuScroll);
//@cmember Changes the mouse cursor
virtual HCURSOR TxSetCursor2(HCURSOR hcur, BOOL bText) { return (hcur) ? ::SetCursor(hcur) : ::GetCursor();}
//@cmember InvalidateRect
virtual void TxInvalidateRect(LPCRECT prc, BOOL fMode);
//@cmember Retrieves the coordinates of a window's client area
virtual HRESULT TxGetClientRect(LPRECT prc);
///////////////////////// combo box message handlers ////////////////////////////
// Calculates the rect's and height's of all the controls
BOOL CbCalcControlRects(RECT* prc, BOOL bCalcChange);
// Retrieves the drop width of the list box
LRESULT CbGetDropWidth();
// sets the drop width of the list box
void CbSetDropWidth(WPARAM wparam);
// Retrieves the item height for either the edit or list box
LRESULT CbGetItemHeight(WPARAM wparam, LPARAM lparam);
// sets the item height for either the edit or list box
LRESULT CbSetItemHeight(WPARAM wparam, LPARAM lparam);
// sets extendedUI mode
LRESULT CbSetExtendedUI(BOOL bExtendedUI);
// retrieves the current extendedUI mode
LRESULT CbGetExtendedUI() const {return _fExtendedUI;}
// forwards the WM_DRAWITEM, WM_DELETEITEM messages to the parent window
LRESULT CbMessageItemHandler(HDC, int, WPARAM, LPARAM);
#ifndef NOACCESSIBILITY
////////////////////////// IAccessible Methods /////////////////////////////////
HRESULT InitTypeInfo(); STDMETHOD(get_accParent)(IDispatch **ppdispParent); STDMETHOD(get_accChildCount)(long *pcountChildren); STDMETHOD(get_accChild)(VARIANT varChild, IDispatch **ppdispChild); STDMETHOD(get_accName)(VARIANT varChild, BSTR *pszName); STDMETHOD(get_accValue)(VARIANT varChild, BSTR *pszValue); STDMETHOD(get_accRole)(VARIANT varChild, VARIANT *pvarRole); STDMETHOD(get_accState)(VARIANT varChild, VARIANT *pvarState); STDMETHOD(get_accKeyboardShortcut)(VARIANT varChild, BSTR *pszKeyboardShortcut); STDMETHOD(get_accFocus)(VARIANT *pvarChild); STDMETHOD(get_accSelection)(VARIANT *pvarChildren); STDMETHOD(get_accDefaultAction)(VARIANT varChild, BSTR *pszDefaultAction); STDMETHOD(accSelect)(long flagsSelect, VARIANT varChild); STDMETHOD(accLocation)(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varChild); STDMETHOD(accNavigate)(long navDir, VARIANT varStart, VARIANT *pvarEndUpAt); STDMETHOD(accHitTest)(long xLeft, long yTop, VARIANT *pvarChild); STDMETHOD(accDoDefaultAction)(VARIANT varChild); #endif // NOACCESSIBILITY
};
#endif // NOWINDOWHOSTS
#endif // _CBHOST_H
|