Шаг 118 - Как вести лог файл сообщений

Данная задача возникает часто при отладке. Хочется видеть список сообщений, которые поступают скажем в диалоговое окно. При том посмотреть их в виде лог файла. Или еще чего. Есть ряд средств, например, SPY, которые позволяют это сделать. Только зачем, если у нас есть исходный код.

Создавайте проект MFC AppWizard на основе диалогового окна по максимуму отключив все кнопки. Теперь давайте создадим функцию PreTranslateMessage, на ней просто надо щелкнуть два раза и она появится в исходном коде.

118.gif (5405 b)

Мы хотим вести лог файл только при отладке. Поэтому все, что относится к логу мы заключим в следующие операторы

#ifdef _DEBUG
// это включится только в режиме отладки.
#endif
Включаем библиотеку файловых потоков
#include "TestEnterDlg.h"
#ifdef _DEBUG
#include "fstream.h"
#endif
В конструкторе создаем поток.
CTestEnterDlg::CTestEnterDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestEnterDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestEnterDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

#ifdef _DEBUG
	ofs.open("log.txt");
#endif

	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
Во время закрытия окна закрываем. Для этого необходимо создать функцию DestroyWindow. Её тоже можно создать в ClassWizard.
BOOL CTestEnterDlg::DestroyWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
        
#ifdef _DEBUG
	ofs.close();
#endif
	
	return CDialog::DestroyWindow();
}
Ну и теперь то, что нас интересует.
BOOL CTestEnterDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class

#ifdef _DEBUG
    ofs << pMsg->message <<  endl;
#endif

	return CDialog::PreTranslateMessage(pMsg);
}
Теперь если запустить именно отладочную версию Debug, а не реализ, то при работе программы будет создан лог файл. Что в нем ???? Вот что
....
160  
160  
512  
512  
512  
512  
512  
...
Что это за сообщения ? Это сообщения в десятичном формате. Их надо перевести в шестнадцатеричный. Для этого можно воспользоваться обычным калькулятором. Поставьте научный вид. Переключитесь на DEC, введите десятичное число, а потом на Hex и увидите число в шестнадцатеричном виде.

Для интерпретации осталось немного. Первое, открыть файл WinUser.h. Там есть сообщения, они начинаются в WM_. Так давайте посмотрим, что это за 512.

512->200
#define WM_MOUSEFIRST                   0x0200
#define WM_MOUSEMOVE                    0x0200

Это двигалась мышка !!!


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 22.02.2000