Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

SendMessage(), MFC

14K
11 декабря 2007 года
2504
33 / / 27.03.2007
В OnInitDialog() я посылаю
SendMessage(WM_KEYDOWN,VK_UP);
Но она не обрабатывается в PreTranslateMessage(MSG* pMsg)
Почему функция не вызывается? BreakPoint не срабатывает.

Что не так?

Код:
BOOL CFifteensDlg::PreTranslateMessage(MSG* pMsg)
{
   
   
    if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
    {
        if (pMsg->message == WM_KEYDOWN)
        {
!!!тут BreakPoint!!! MoveBtn(pMsg);
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}
320
12 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Подробнее опиши что должно происходить , что ты хочешь сделать ?
14K
17 декабря 2007 года
2504
33 / / 27.03.2007
мне нужно сымитировать "ход" в игре "пятнашки" для перемешивания, то есть, послать сообщения от клавиши до запуска игры для пользователя. Но почему я не попадаю в PreTranslateMessage(MSG* pMsg), я не могу понять. Я подозреваю, что не те сообщения посылаю в OnInitDialog() с помощью функции SendMessage(WM_KEYDOWN,VK_UP);
а в функции move() я и передвигаю соответствующие кнопки.
320
17 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: 2504
мне нужно сымитировать "ход" в игре "пятнашки" для перемешивания, то есть, послать сообщения от клавиши до запуска игры для пользователя. Но почему я не попадаю в PreTranslateMessage(MSG* pMsg), я не могу понять. Я подозреваю, что не те сообщения посылаю в OnInitDialog() с помощью функции SendMessage(WM_KEYDOWN,VK_UP);
а в функции move() я и передвигаю соответствующие кнопки.


Не знаю,как именно ты делаешь,но в этой игре тебе не нужна SendMessage для того чтобы перемешивать пятнашки.У тебя одна пятнашка - это что ? Static ? Button ? По идее у тебя должен быть массив пятнашек.Я б сделал класс,к примеру,MyButton - наследник от CButton и определил бы в нем ф-ию OnLButtonDown,т.е. если нажимаешь на пятнашку происходит ход.В этой ф-ии должна использоваться MoveWindow...А для перемешивания массива пятнашек массив и перемешивай,при чем тут SendMessage ?

14K
17 декабря 2007 года
2504
33 / / 27.03.2007
да зачем вам ввесь код моих пятнашек? У меня есть и массив. И все бегает. И игра идет.

Я хочу узнать! КАКОЕ сообщение послать, чтобы система отреагировала на него, как на нажатие кнопки.

В первом своем посте я вроде все написал. Я хочу знать, ПОЧЕМУ SendMessage(WM_KEYDOWN,VK_UP); не имитирует нажатия кнопки вверх? Я так понимаю, что проблемма тут. Но какое надо послать, я не знаю. И спрашиваю Вас, что мне послать с помощью SendMessage чтобы PreTranslateMessage обработала это сообщение, как нажатие клавиши!?
14K
17 декабря 2007 года
2504
33 / / 27.03.2007
может есть другой способ послать сообщение в PreTranslateMessage? Я с радостью его выслушаю.
14K
17 декабря 2007 года
2504
33 / / 27.03.2007
все намного проще. Я не двигаю кнопками. Я переписываю текст в кнопках. Зачем мне перерисовывать кнопки? А для перемешки просто хочу чтобы программа сама походила н-ое количество раз. Это даст гарантию, что я не попаду в комбынацию, при которой невозможно сложить пятнашки. вот и не знаю как? походить?
320
18 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Я не покушаюсь на твой код:D Это твоя собственность,можешь ничего не показывать и не рассказывать,вырывай куски кода и спрашивай. Ответы будут соответствующие,если будут. Эти пятнашки умещаются в 15 строк кода,зачем там SendMessage ?
14K
18 декабря 2007 года
2504
33 / / 27.03.2007
Та я не за код переживаю :-). Но я не могу понять!! КАК МНЕ ИМИТИРОВАТЬ нажатие клавиши и чтобы обработалось сообщение от этоц клавиши!!!! Пятнашки, это частний случай. А те, что вы прикрепили, я смотрел в первую очередь. но они мне не понравились. Там куча проверок при ходе. Я сделал все проще.

Если вы так хотите ковырять недописаный код. Специально для вас.
Но вопрос все тот же. КАК имитировать нажатие кнопки?????????
Код:
// FifteensDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Fifteens.h"
#include "FifteensDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CFifteensDlg dialog


CFifteensDlg::CFifteensDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CFifteensDlg::IDD, pParent)
    , i(0)
    , j(0)
    , strTemp(_T(""))
    , strTemp2(_T(""))

{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
   
}

void CFifteensDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_BUTTON16, m_b16);
    DDX_Control(pDX, IDC_BUTTON15, m_b15);
    DDX_Control(pDX, IDC_BUTTON14, m_b14);
    DDX_Control(pDX, IDC_BUTTON13, m_b13);
    DDX_Control(pDX, IDC_BUTTON12, m_b12);
    DDX_Control(pDX, IDC_BUTTON11, m_b11);
    DDX_Control(pDX, IDC_BUTTON10, m_b10);
    DDX_Control(pDX, IDC_BUTTON9, m_b9);
    DDX_Control(pDX, IDC_BUTTON8, m_b8);
    DDX_Control(pDX, IDC_BUTTON7, m_b7);
    DDX_Control(pDX, IDC_BUTTON6, m_b6);
    DDX_Control(pDX, IDC_BUTTON5, m_b5);
    DDX_Control(pDX, IDC_BUTTON4, m_b4);
    DDX_Control(pDX, IDC_BUTTON3, m_b3);
    DDX_Control(pDX, IDC_BUTTON2, m_b2);
    DDX_Control(pDX, IDC_BUTTON1, m_b1);
    DDX_Control(pDX, IDC_BUTTON_START, m_cBtnStart);
}

BEGIN_MESSAGE_MAP(CFifteensDlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BUTTON_START, &CFifteensDlg::OnBnClickedButtonStart)

END_MESSAGE_MAP()


BOOL CFifteensDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

//UINT nTmp = 1;

    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
   
    UpdateData(TRUE);
   
    btnArray[0][0] = &m_b1; btnArray[0][1] = &m_b2; btnArray[0][2] = &m_b3; btnArray[0][3] = &m_b4;
    btnArray[1][0] = &m_b5; btnArray[1][1] = &m_b6; btnArray[1][2] = &m_b7; btnArray[1][3] = &m_b8;
    btnArray[2][0] = &m_b9; btnArray[2][1] = &m_b10;btnArray[2][2] = &m_b11;btnArray[2][3] = &m_b12;
    btnArray[3][0] = &m_b13;btnArray[3][1] = &m_b14;btnArray[3][2] = &m_b15;btnArray[3][3] = &m_b16;

   
//fill the buttons
    int t = 0;
    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            stArray[j].Format(_T("%d"), t);
            btnArray[j]->SetWindowText(stArray[j]);
            t++;
        }
    }
    // mix the buttons
   

/*
    keybd_event( VK_UP,
        0x26,
        KEYEVENTF_EXTENDEDKEY | 0,
        0 );
*/
    SendMessage(WM_KEYDOWN,VK_UP);

/****************************************************************************
    ВОТ ТУТ я должен походить. Но это сообщ. не обрабатывается в претранслейте. ЧТО мне
       послать, чтобы система получила нажатие кнопки!?
****************************************************************************/


    // finding an empty button
    for( i = 0; i < 3; i++)
    {
        for( j = 0; j < 3; j++)
        {
            if (_T("0") == stArray[j])
                break;
        }
        if (_T("0") == stArray[j])
            break;
    }


    /*
    CString str;
    str.Format(_T("%d,%d,"), i, j);
    SetWindowText(str);
    */
    btnArray[j]->SetWindowText(_T(" "));


       
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CFifteensDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CFifteensDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}


void CFifteensDlg::OnBnClickedButtonStart()
{
    Beep(1000, 50);

    //перемешать и запустить таймер
}



BOOL CFifteensDlg::PreTranslateMessage(MSG* pMsg)
{
   
   
    if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
    {
        if (pMsg->message == WM_KEYDOWN)
        {
            MoveBtn(pMsg);
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}





void CFifteensDlg::MoveBtn(MSG * pMsg)
{
    switch (pMsg->wParam)
    {
    case VK_UP:
        if ( i < 3 )
        {
            btnArray[i+1][j]->GetWindowText(strTemp);
            btnArray[j]->GetWindowText(strTemp2);


            btnArray[i+1][j]->SetWindowText(strTemp2);
            stArray[i+1][j] = strTemp2;
            btnArray[j]->SetWindowText(strTemp);
            stArray[j] = strTemp;
            i++;
            SetWindowText(_T("No"));
        }
        break;

    case VK_LEFT:
        if ( j < 3 )
        {
            btnArray[j+1]->GetWindowText(strTemp);
            btnArray[j]->GetWindowText(strTemp2);

            btnArray[j+1]->SetWindowText(strTemp2);
            stArray[j+1] = strTemp2;
            btnArray[j]->SetWindowText(strTemp);
            stArray[j] = strTemp;
            j++;

        }
        break;

    case VK_RIGHT:
        if ( j > 0 )
        {
            btnArray[j-1]->GetWindowText(strTemp);
            btnArray[j]->GetWindowText(strTemp2);

            btnArray[j-1]->SetWindowText(strTemp2);
            stArray[j-1] = strTemp2;
            btnArray[j]->SetWindowText(strTemp);
            stArray[j] = strTemp;
            j--;
        }
        break;

    case VK_DOWN:
        if ( i > 0 )
        {
            btnArray[i-1][j]->GetWindowText(strTemp);
            btnArray[j]->GetWindowText(strTemp2);

            btnArray[i-1][j]->SetWindowText(strTemp2);
            stArray[i-1][j] = strTemp2;
            btnArray[j]->SetWindowText(strTemp);
            stArray[j] = strTemp;
            i--;
        }
        break;
    }
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог