Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > 15 MESSAGE_MAP????


Автор: Coocky 23.2.2004, 22:58
Привет,профи!!!Вот продолжаю двигаться по дебрям MFC...Благодоря вам нашел ответы та многие вопросы,которых нет и в MSDN.Спасибо wink.gif
Буду и дальше задавать в том же духе biggrin.gif
Решил написать игру "Пятнашки" hehe.gif И столкнулся с проблемой-неужели нужно создавать 15 MESSAGE_MAP,для каждой кнопкиconfused.gif?Или есть другие пути?(Я создаю проги с помощью AppWizard,хотя какая разница...)Нельзя ли как-то создать одну функцию,а потом вызывать ее для каждой кнопки?А как же тогда прописать afx..,ведь для каждой кнопки сообщение со своим ID_???
Короче я расстерян rolleyes.gif
Желающие и не гордые-подскажите biggrin.gif

Автор: mr.DUDA 24.2.2004, 16:53
Вот тебе готовый пример, как динамически сделать 15 кнопок и обрабатывать нажатие на них всего одним обработчиком. Предположим, ты используешь окно диалога (у меня оно называется CFifteensDlg). Тогда добавь в хедер и .CPP-файл следующее (добавляемые строки выделены жирным шрифтом):
Цитата
FifteensDlg.h

class CFifteensDlg : public CDialog
{
    // массив из 15-ти кнопок
    CButton m_Buttons[15];
    // единый обработчик нажатия на любую кнопку
    void OnMyButtons(UINT id);

    //   ....
 
};


FifteensDlg.cpp

// определяем диапазон ID-ов кнопок
#define ID_FIRST_15BUTTON      WM_USER
#define ID_LAST_15BUTTON       ID_FIRST_15BUTTON+14

BEGIN_MESSAGE_MAP(CFifteensDlg, CDialog)
    //{{AFX_MSG_MAP(CFifteensDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    // навешиваем свой обработчик в MESSAGE_MAP
    ON_COMMAND_RANGE(ID_FIRST_15BUTTON, ID_LAST_15BUTTON, OnMyButtons)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


// это наш обработчик, принимает ID нажатой кнопки
void CFifteensDlg::OnMyButtons(UINT id)
{
    int iButton = id - ID_FIRST_15BUTTON;
    CString str; str.Format("%d", iButton+1);
    MessageBox(str, "Pressed Button:", MB_OK|MB_ICONINFORMATION);
}



// при создании окна диалога, создаём 15 кнопок с ID из выбранного диапазона
BOOL CFifteensDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    CRect rect; GetClientRect(&rect);
    int W = rect.Width()/4, H = rect.Height()/4;
    int iButton=0;
    for(int y=0; y<4; y++)
    {
        for(int x=0; x<4; x++)
        {
            if(x==2 && y==2) continue;
            CString csCaption; csCaption.Format("%d", iButton+1);
            CRect rectBut(x*W, y*H, (x+1)*(W-5), (y+1)*(H-5));
            m_Buttons[iButton].Create(csCaption, WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, rectBut, this, ID_FIRST_15BUTTON+iButton);
            iButton++;
        }
    }


    // ....
}

Автор: Coocky 24.2.2004, 22:49
Спасибо,mr.DUDA(Есть на кого равнятся biggrin.gif )Код еще не разбирал,но дома гляну.Как хоть рейтинг тебе повыситьconfused.gif

Автор: Coocky 24.2.2004, 23:29
Да,вот код мельком глянул(конкретно не вникал еще),но уже понял,что не знаю WM_USER(What it this??),не знал про ON_COMMAND_RANGE,буду искать и разбираться.Кстати ,не посоветуешь какую-нибудь литературу по MFC и вообще прог.под Винду(я хоть и на Украине живу,но постараюсь достать)

Автор: chipset 25.2.2004, 05:09
"Программирование на Microsoft Visual C++ 6.0" пятое издание.Дэвид Круглински,Скот Уингоу и
Джордж Шефферд

Автор: mr.DUDA 25.2.2004, 21:08
WinAPI: Джеффри Рихтер, всё что найдёшь - всё рулез.
MFC: Мешков, Тихомиров - классные ребята, ничего не скажешь. Уже много раз переиздавались, изд-во "Питер", серия "Visual C++ и MFC".

Цитата
Спасибо,mr.DUDA(Есть на кого равнятся  )Код еще не разбирал,но дома гляну.Как хоть рейтинг тебе повысить

Код рабочий, я быстро слабал пример (даже хотел полностью пятнашки сделать, но что-то совесть замучала smile.gif, думаю чел сам и так всё сделает как надо...). Не надо рейтинг повышать adv/king.gif...

Автор: mr.DUDA 25.2.2004, 21:23
З.Ы. справедливости ради отмечу, что WM_USER применяется для построения Win-сообщений, определяемых пользователем (т.е. MFC не использует идентификаторы Win-сообщений, выше чем WM_USER). Это совсем не относится к "командам" (т.е. сообщению WM_COMMAND), другими словами - можно было задать ID_FIRST_15BUTTON равным любому значению, например 555 smile.gif ... Просто сказалась привычка что WM_USER - "безопасное значение", не более того.

Автор: Coocky 25.2.2004, 23:12
Моя проблема в том,что я не знаю WinAPI.Сразу кинулся в MFC,увидел AppWizard и подумал:халява,нарисовал кнопку и готова прога.Только надо MFC немного выучить и все...Ан-нет...
Не прошло...Делаю шаг назад к WinAPI(если я не ошибаюсь,MFC - надстройка над WinAPI ).
А пока всем спасибо biggrin.gif

Автор: mr.DUDA 3.3.2004, 21:39
Проверь вот этот архив, в нём - исходники и демо-EXE диалога с "пятнашками".

З.Ы. извиняюсь за неправильный аттачмент, промахнулся и не попал по нужному файлу smile.gif

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