📄 listboxex.cpp
字号:
// FUNCTION NAME: CListBoxEx::SetItem
//
// DESCRIPTION: Set item text and data
//
// PARAMETER(S):
// iItem:
// TYPE: int
// MODE: In
// MECHANISM: By value
// DESCRIPTION: Zero-based index of the item.
//
// szItemText:
// TYPE: char
// MODE: In
// MECHANISM: By address
// DESCRIPTION: Addres of the new item text.
//
// dwItemData:
// TYPE: DWORD
// MODE: In
// MECHANISM: By value
// DESCRIPTION: Custom item data.
//
// RETURN: None.
//
// NOTES: None.
//+*/
void CListBoxEx::SetItem( int iItem,
LPCTSTR szItemText,
DWORD dwItemData )
{
ASSERT( iItem < GetCount() );
SendMessage( WM_SETREDRAW, FALSE, 0 );
DeleteString( iItem );
InsertString( iItem, szItemText );
SetItemData( iItem, dwItemData );
SendMessage( WM_SETREDRAW, TRUE, 0 );
} // CListBoxEx::SetItem
///*-
// FUNCTION NAME: CListBoxEx::SetItemText
//
// DESCRIPTION: Set item text
//
// PARAMETER(S):
// iItem:
// TYPE: int
// MODE: In
// MECHANISM: By value
// DESCRIPTION: Zero-based index of the item.
//
// szItemText:
// TYPE: char
// MODE: In
// MECHANISM: By const address
// DESCRIPTION: Addres of the new item text.
//
// RETURN: None.
//
// NOTES: None.
//+*/
void CListBoxEx::SetItemText( int iItem,
LPCTSTR szItemText )
{
ASSERT( iItem < GetCount() );
DWORD dwItemData;
dwItemData = GetItemData( iItem );
SetItem( iItem, szItemText, dwItemData );
} // CListBoxEx::SetItemText
///*-
// FUNCTION NAME: CListBoxEx::SwapItems
//
// DESCRIPTION: Called to swap the two items
//
// PARAMETER(S):
// iFirstItem:
// TYPE: int.
// MODE: In
// MECHANISM: By value
// DESCRIPTION: Zero-based index of the first item to be swapped.
//
// iSecondItem:
// TYPE: int.
// MODE: In
// MECHANISM: By value
// DESCRIPTION: Zero-based index of the second item to be swapped.
//
// RETURN: The new index of the item.
//
// NOTES: None.
//+*/
void CListBoxEx::SwapItems( int iFirstItem,
int iSecondItem )
{
ASSERT( iFirstItem < GetCount() );
ASSERT( iSecondItem < GetCount() );
if ( iFirstItem != iSecondItem )
{
// Cache the first item data
CString strFirstItem;
DWORD dwFirstItemData;
GetText( iFirstItem, strFirstItem );
dwFirstItemData = GetItemData( iFirstItem );
// Cache the second item data
CString strSecondItem;
DWORD dwSecondItemData;
GetText( iSecondItem, strSecondItem );
dwSecondItemData = GetItemData( iSecondItem );
// Insert the items in reverse order
if ( iFirstItem < iSecondItem )
{
SetItem( iFirstItem, strSecondItem, dwSecondItemData );
SetItem( iSecondItem, strFirstItem, dwFirstItemData );
}
else
{
SetItem( iSecondItem, strFirstItem, dwFirstItemData );
SetItem( iFirstItem, strSecondItem, dwSecondItemData );
}
}
} // CListBoxEx::SwapItems
///*-
// FUNCTION NAME: CListBoxEx::MoveItemUp
//
// DESCRIPTION: Called to move the item up.
//
// PARAMETER(S):
// iItem:
// TYPE: int.
// MODE: In
// MECHANISM: By value
// DESCRIPTION: Zero-based index of the item to be moved.
//
// RETURN: The new index of the item.
//
// NOTES: None.
//+*/
int CListBoxEx::MoveItemUp( int iItem )
{
//ASSERT( iItem > 0 ); // commented out by tom
ASSERT( iItem >= 0 ); // added by tom
if (!(iItem > 0)) return iItem; // added by tom
if ( iItem > 0 )
{
SwapItems( iItem, iItem-1 );
SetCurSel( iItem - 1 );
}
return iItem;
} // CListBoxEx::MoveItemUp()
///*-
// FUNCTION NAME: CListBoxEx::MoveItemDown
//
// DESCRIPTION: Called to move the item down.
//
// PARAMETER(S):
// iItem:
// TYPE: int.
// MODE: In
// MECHANISM: By value
// DESCRIPTION: Zero-based index of the item to be moved.
//
// RETURN: The new index of the item.
//
// NOTES: None.
//+*/
int CListBoxEx::MoveItemDown( int iItem )
{
ASSERT( iItem >= 0 );
if ( iItem != GetCount()-1 )
{
SwapItems( iItem, iItem+1 );
SetCurSel( iItem + 1 );
}
return iItem;
} // CListBoxEx::MoveItemDown
///*-
// FUNCTION NAME: CListBoxEx::OnEndEditMessage
//
// DESCRIPTION: Ends the editing of an item.
//
// PARAMETER(S):
// wParam:
// TYPE: WPARAM
// MODE: In
// MECHANISM: By value
// DESCRIPTION: Unused.
//
// lParam:
// TYPE: LPARAM
// MODE: In
// MECHANISM: By value
// DESCRIPTION: Pointer to a IPEENDEDITINFO structure.
//
// RETURN: TRUE to end editing process, FALSE to continue anyway.
//
// NOTES: This message handler calls OnEndEditing callback, if necessary.
//+*/
LRESULT CListBoxEx::OnEndEditMessage( WPARAM wParam,
LPARAM lParam )
{
UNUSED_ALWAYS( wParam );
BOOL bEndEdit;
LPIPCENDEDITINFO lpEndEditInfo = (LPIPCENDEDITINFO)lParam;
switch ( lpEndEditInfo->uKind )
{
case IPEK_KEY:
if ( lpEndEditInfo->nVirtKey == VK_ESCAPE )
{
bEndEdit = TRUE;
OnEndEditing( m_iEdited, TRUE );
EndEditing( TRUE );
}
else
{
bEndEdit = TRUE;
EndEditing( !OnEndEditing( m_iEdited, FALSE ) );
}
break;
case IPEK_ACTION:
bEndEdit = FALSE; // Superfluous
OnBrowseButton( m_iEdited );
break;
case IPEK_FOCUS:
if ( (lpEndEditInfo->hNewWnd == m_pEdit->m_hWnd) ||
(lpEndEditInfo->hNewWnd == m_pBrowseButton->m_hWnd) )
{
bEndEdit = FALSE;
}
else
{
bEndEdit = TRUE;
EndEditing( !OnEndEditing( m_iEdited, FALSE ) );
}
break;
default:
bEndEdit = TRUE;
}
return bEndEdit;
} // CListBoxEx::OnEndEditMessage
//////////////////////////////////////////////////////////////////////////////
// //
// CListBoxExBuddy class //
// //
//////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////
// Message map //
///////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CListBoxExBuddy, CWnd)
//{{AFX_MSG_MAP(CListBoxExBuddy)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_SIZE()
ON_WM_NCMOUSEMOVE()
ON_WM_CREATE()
//}}AFX_MSG_MAP
//ON_NOTIFY( TTN_NEEDTEXT, LBB_TTIP_ID, OnTooltipNeedText )
END_MESSAGE_MAP()
///////////////////////////////////////////////
// Constructor/Destructor //
///////////////////////////////////////////////
///*-
// FUNCTION NAME: CListBoxExBuddy::CListBoxExBuddy()
//
// DESCRIPTION: CListBoxExBuddy class constructor
//
// PARAMETER(S): None.
//
// RETURN: None
//
// NOTES: None
//+*/
CListBoxExBuddy::CListBoxExBuddy()
{
// Load the bitmap by using a temp file
TCHAR *szFileName = tmpnam( NULL );
FILE *pfBmpFile = fopen( szFileName, "wb" );
fwrite( lbbuddy_data, sizeof(unsigned char), __bmp_size, pfBmpFile );
fclose( pfBmpFile );
m_ButtonBitmap.Attach( (HBITMAP)LoadImage( NULL,
szFileName,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE | LR_LOADMAP3DCOLORS ) );
unlink( szFileName );
// Init other data
m_bButtonPressed = FALSE;
m_iButton = __BMP_NUMBTN;
m_pListBoxEx = NULL;
m_arcButtons = new CRect[ __BMP_NUMBTN ];
#ifdef _DEBUG
// Verify the dimensions
BITMAP BmpInfo;
m_ButtonBitmap.GetObject( sizeof(BITMAP), &BmpInfo );
ASSERT( BmpInfo.bmWidth == __BMP_WIDTH );
ASSERT( BmpInfo.bmHeight == __BMP_HEIGHT );
#endif
} // CListBoxEx::CListBoxEx
///*-
// FUNCTION NAME: CListBoxExBuddy::~CListBoxExBuddy()
//
// DESCRIPTION: CListBoxExBuddy class destructor
//
// PARAMETER(S): None.
//
// RETURN: None
//
// NOTES: None
//+*/
CListBoxExBuddy::~CListBoxExBuddy()
{
delete[] m_arcButtons;
} // CListBoxExBuddy::~CListBoxExBuddy
///////////////////////////////////////////////
// Initialization //
///////////////////////////////////////////////
///*-
// FUNCTION NAME: CListBoxExBuddy::OnCreate
//
// DESCRIPTION: Called when the window handle is created
//
// PARAMETER(S):
// lpCreateStruct:
// TYPE: CREATESTRUCT structure
// MODE: In
// MECHANISM: By reference
// DESCRIPTION: Allows to change window features
//
// RETURN: Inherited value.
//
// NOTES: None
//+*/
int CListBoxExBuddy::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
if ( CWnd::OnCreate(lpCreateStruct) == -1 )
{
return -1;
}
// Enable Tooltips
CreateTooltips();
return 0;
} // CListBoxExBuddy::OnCreate()
///*-
// FUNCTION NAME: CListBoxEx::PreSubclassWindow
//
// DESCRIPTION: Called before the window handle is attached to a dialog item.
//
// PARAMETER(S): None.
//
// RETURN: Inherited value.
//
// NOTES: None
//+*/
void CListBoxExBuddy::PreSubclassWindow()
{
// Enable Tooltips
CreateTooltips();
// Send a WM_SIZE message, as WM_CREATE would do
CRect rcClient;
GetClientRect( &rcClient );
OnSize( 0, rcClient.Width(), rcClient.Height() );
// Call default
CWnd::PreSubclassWindow();
} // CListBoxExBuddy::PreSubclassWindow()
///////////////////////////////////////////////
// Paint //
///////////////////////////////////////////////
///*-
// FUNCTION NAME: DrawBitmap
//
// DESCRIPTION: Draw bitmaps helper
//
// PARAMETER(S):
// dc
// TYPE: CDC
// MODE: In
// MECHANISM: By reference
// DESCRIPTION: Target dc
// bmp
// TYPE: CBitmap
// MODE: In
// MECHANISM: By reference
// DESCRIPTION: bitmap object
// x
// TYPE: int
// MODE: In
// MECHANISM: By value
// DESCRIPTION: x-pos
// y
// TYPE: int
// MODE: In
// MECHANISM: By value
// DESCRIPTION: y-pos
//
// cx
// TYPE: int
// MODE: In
// MECHANISM: By value
// DESCRIPTION: width
// cy
// TYPE: int
// MODE: In
// MECHANISM: By value
// DESCRIPTION: height
//
// RETURN: None.
//
// NOTES: None.
//+*/
static
void DrawBitmap( CDC & dc,
CBitmap & bmp,
int x,
int y,
int cx,
int cy )
{
CDC memDC;
memDC.CreateCompatibleDC( &dc );
CBitmap *poldbmp = memDC.SelectObject( &bmp );
dc.BitBlt( x, y, cx, cy, &memDC, 0, 0, SRCCOPY );
memDC.SelectObject( poldbmp );
memDC.DeleteDC();
} // DrawBitmap()
///*-
// FUNCTION NAME: CListBoxExBuddy::OnPaint
//
// DESCRIPTION: Called in response to a WM_PAINT message.
//
// PARAMETER(S): None.
//
// RETURN: None.
//
// NOTES: None.
//+*/
void CListBoxExBuddy::OnPaint()
{
CPaintDC dc( this ); // device context for painting
// Create a compatible memory DC
CDC memDC;
memDC.CreateCompatibleDC( &dc );
// Get aware of the size of the client area
CRect rcClient;
GetClientRect( &rcClient );
// This is used to center the button bitmap
int nBmpTopY = (rcClient.Height() - __BMP_HEIGHT) / 2;
// To store old selected objects
CBitmap *pOldBmp;
CFont *pOldFont;
// Select the font
CFont font;
font.Attach( (HFONT)GetStockObject( DEFAULT_GUI_FONT ) );
pOldFont = memDC.SelectObject( &font );
// Select the out-of-screen bitmap
CBitmap memBmp;
memBmp.CreateCompatibleBitmap( &dc,
rcClient.Width(),
rcClient.Height() );
pOldBmp = memDC.SelectObject( &memBmp );
// Erase the background
CBrush brush;
brush.CreateSolidBrush( ::GetSysColor(COLOR_3DFACE) );
memDC.FillRect( &rcClient, &brush );
brush.DeleteObject();
//
// Window Text
//
// Prepare to draw the text transparently
memDC.SetBkMode( TRANSPARENT );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -