⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listboxex.cpp

📁 3D游戏场景编辑器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// 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 + -