Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > CStatic


Автор: papam 29.6.2006, 17:52
Вот условие:
Щелкаем левой кнопкой мыши по форме и, не отпуская кнопку, ведем по ней мышку, а в момент отпускания кнопки по полученным координатам прямоугольника необходимо создать "статик", который содержит свой порядковый номер 
Вот программа:
Код

#include "afxwin.h" 
#include "afxext.h"
//#include "resource.h" 
  
#define IDC_MYBUTTON 100
#define IDC_MYEDIT 102    

class CMyStatic: public CStatic
{
public:
    afx_msg void OnLButtonDblClk(UINT, CPoint);
    //afx_msg void OnRButtonDblClk(UINT, CPoint);
//    afx_msg void OnMouseMove(UINT,CPoint);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    
private:
    DECLARE_MESSAGE_MAP();
};

void CMyStatic ::OnLButtonDblClk(UINT, CPoint)
{
    DestroyWindow();
}
void CMyStatic::OnLButtonDown(UINT nFlags, CPoint point) 
{
    
    CString S;
    S.Format("x=%d ,y=%d",point.x,point.y);
    SetWindowText(S);
    CStatic::OnLButtonDown(nFlags, point);
}




BEGIN_MESSAGE_MAP(CMyStatic, CStatic) 
    ON_WM_LBUTTONDBLCLK()
    ON_WM_RBUTTONDBLCLK()
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONDOWN()
    
END_MESSAGE_MAP()




class CMainWnd : public CFrameWnd
{
public:
    CMainWnd();
    afx_msg void OnLButtonDblClk(UINT, CPoint);    
    afx_msg void OnRButtonDblClk(UINT, CPoint);    
    afx_msg void OnKeyDown(UINT, UINT, UINT);
    afx_msg void OnLButtonUp( UINT, CPoint );

    int OnCreate(LPCREATESTRUCT lpCreateStruct);
    
private:
    
    CMyStatic* MyStatic;
    CEdit* MyEdit;
    CStatusBar m_wndStatusBar;
    CRect m_rect;
    int i_arreysize;
    CMyStatic m_st;
    CMenu m_wndMenu;

    DECLARE_MESSAGE_MAP(); 

};

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
    ON_WM_LBUTTONDBLCLK()        
    ON_WM_RBUTTONDBLCLK()
    ON_WM_LBUTTONUP( )
    ON_WM_KEYDOWN()    
    ON_WM_CREATE()
    END_MESSAGE_MAP()
    
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    m_wndStatusBar.Create(this);
        return 0;
    }
    
void CMainWnd::OnKeyDown(UINT, UINT, UINT)
{
    AfxMessageBox(" Key Button Down ");
}
void CMainWnd::OnRButtonDblClk(UINT, CPoint)

{
    AfxMessageBox(" Rigth Button Click ");
}

void CMainWnd::OnLButtonDblClk(UINT, CPoint)
{
    AfxMessageBox(" Left Button Click ");
}


CMainWnd::CMainWnd()
{
    Create(NULL,"ЗАДАНИЕ 2 ЗАДАЧА 1",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);
    MyStatic = new CMyStatic();
    int a,b;
    a=15;
    b=10;
    
    if(a<10)
        
    {
        AfxMessageBox("В статике 1 не соответствует размер!!!\n Исправте ошибку и появится статик!!!");
    }
    



//    if(b<10)
//    {
    //    AfxMessageBox("В статике 1 не соответствует размер!!!\n Исправьте ошибку и появится статик!!!");
//    }
    else
        if (MyStatic!=NULL)  MyStatic->Create("MyStatic 1",WS_CHILD|WS_VISIBLE|SS_CENTER|SS_NOTIFY,CRect(a,b,100,50),this);


    MyStatic = new CMyStatic();
    
    a=10;
    b=70;
    
    if(a<10)
    {
        AfxMessageBox("В статике 2 не соответствует размер!!!\n Исправьте ошибку и появится статик!!!");
    }
//    if(b<10)
//    {
    //    AfxMessageBox("В статике 2 не соответствует размер!!!\n Исправьте ошибку и появится статик!!!");
//    }

    else
        if (MyStatic!=NULL)  MyStatic->Create("MyStatic 2",WS_CHILD|WS_VISIBLE|SS_CENTER|SS_NOTIFY,CRect(a,b,300,100),this);
    
}

void CMainWnd::OnLButtonUp(UINT nFlags, CPoint point) 
{ 
   // TODO: Add your message handler code here and/or call default 
   m_rect.bottom = point.y; 
   m_rect.right = point.x; 
   m_rect.NormalizeRect(); 
   CString s; 
   s.Format("%i", i_arreysize+1); 
   UINT nID = 10000; 
   if (!i_arreysize) 
   { 
      m_st = new CStatic; 
      i_arreysize++; 
      m_st->Create(s, WS_VISIBLE|WS_CHILD|WS_BORDER, m_rect, this, nID+i_arreysize); 
   } 
   else 
   { 
      CStatic* temp = new CStatic [i_arreysize]; 
      CopyMemory(temp, m_st, sizeof(CStatic)); 
      if(i_arreysize<=1)   delete m_st; 
      else delete [] m_st; 
      i_arreysize++; 
      m_st = new CStatic [i_arreysize]; 
      CopyMemory(m_st, temp, sizeof(CStatic)); 
      m_st[i_arreysize-1].Create(s, WS_VISIBLE|WS_CHILD|WS_BORDER, m_rect, this, nID+i_arreysize); 
      delete [] temp; 
   } 
       
    
   CMainWnd::OnLButtonUp(nFlags, point); 
}

class CMyApp : public CWinApp
{
public:
    CMyApp();            
    virtual BOOL InitInstance();
};

CMyApp::CMyApp() 
{}

BOOL CMyApp::InitInstance() 
{
    m_pMainWnd=new CMainWnd();
    ASSERT(m_pMainWnd);    
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();    
    return TRUE;        
};

CMyApp theApp;    


Скажите почему выдет ошибки компелятор и как их исправить?
Вот ошибки:

 error C2582: 'CMyStatic' : 'operator =' function is unavailable
error C2819: type 'CMyStatic' does not have an overloaded member 'operator ->'
   see declaration of 'CMyStatic'
 error C2227: left of '->Create' must point to class/struct/union
 error C2582: 'CMyStatic' : 'operator =' function is unavailable
error C2039: 'Create' : is not a member of 'HWND__'
 see declaration of 'HWND__'

Спасибо 

 

Автор: Earnest 30.6.2006, 08:05
Ты бы хоть указал, в какой строке ошибки.
m_st объявлена как CMyStatic. А ты что делаешь? Присваиваешь ей указатель... Компилятор тебе прямо говорит: "Нет у CStatic оператора =", а среда показывает на строку с ошибкой. Что тебе еще нужно? Не научишься читать ошибки компилятора - не научишься программировать. 

Автор: papam 30.6.2006, 21:26
Спасибо  Earnest 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)