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);
}
SendMessage(), MFC
SendMessage(WM_KEYDOWN,VK_UP);
Но она не обрабатывается в PreTranslateMessage(MSG* pMsg)
Почему функция не вызывается? BreakPoint не срабатывает.
Что не так?
Код:
Подробнее опиши что должно происходить , что ты хочешь сделать ?
а в функции move() я и передвигаю соответствующие кнопки.
Цитата: 2504
мне нужно сымитировать "ход" в игре "пятнашки" для перемешивания, то есть, послать сообщения от клавиши до запуска игры для пользователя. Но почему я не попадаю в PreTranslateMessage(MSG* pMsg), я не могу понять. Я подозреваю, что не те сообщения посылаю в OnInitDialog() с помощью функции SendMessage(WM_KEYDOWN,VK_UP);
а в функции move() я и передвигаю соответствующие кнопки.
а в функции move() я и передвигаю соответствующие кнопки.
Не знаю,как именно ты делаешь,но в этой игре тебе не нужна SendMessage для того чтобы перемешивать пятнашки.У тебя одна пятнашка - это что ? Static ? Button ? По идее у тебя должен быть массив пятнашек.Я б сделал класс,к примеру,MyButton - наследник от CButton и определил бы в нем ф-ию OnLButtonDown,т.е. если нажимаешь на пятнашку происходит ход.В этой ф-ии должна использоваться MoveWindow...А для перемешивания массива пятнашек массив и перемешивай,при чем тут SendMessage ?
Я хочу узнать! КАКОЕ сообщение послать, чтобы система отреагировала на него, как на нажатие кнопки.
В первом своем посте я вроде все написал. Я хочу знать, ПОЧЕМУ SendMessage(WM_KEYDOWN,VK_UP); не имитирует нажатия кнопки вверх? Я так понимаю, что проблемма тут. Но какое надо послать, я не знаю. И спрашиваю Вас, что мне послать с помощью SendMessage чтобы PreTranslateMessage обработала это сообщение, как нажатие клавиши!?
может есть другой способ послать сообщение в PreTranslateMessage? Я с радостью его выслушаю.
все намного проще. Я не двигаю кнопками. Я переписываю текст в кнопках. Зачем мне перерисовывать кнопки? А для перемешки просто хочу чтобы программа сама походила н-ое количество раз. Это даст гарантию, что я не попаду в комбынацию, при которой невозможно сложить пятнашки. вот и не знаю как? походить?
Я не покушаюсь на твой код:D Это твоя собственность,можешь ничего не показывать и не рассказывать,вырывай куски кода и спрашивай. Ответы будут соответствующие,если будут. Эти пятнашки умещаются в 15 строк кода,зачем там SendMessage ?
Если вы так хотите ковырять недописаный код. Специально для вас.
Но вопрос все тот же. КАК имитировать нажатие кнопки?????????
Код:
// 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;
}
}
//
#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;
}
}