FAQ:WinAPI, VCPP Part 2

Материал из Весельчак У
Версия от 20:28, 2 ноября 2008; RXL (обсуждение | вклад) (Удалены 5 статей: разделение.)

Перейти к: навигация, поиск

Как убрать главное меню из окна CMainFrame?

Это можно сделать в виртуальной функции PreCreateWindow:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	// обнуляем хендл меню до вызова CFrameWnd::PreCreateWindow
	cs.hMenu=0;
 
	if(!CFrameWnd::PreCreateWindow(cs))
	{
		return FALSE;
	}
 
	...
}

Как работающая программа может определить, что пользователь завершает работу Windows?

Когда пользователь завершает работу Windows, всем процессам посылается сообщение WM_QUERYENDSESSION. Его нужно отловить в обработчике OnQueryEndSession(). Если вернуть из обработчика значение 0, то Windows продолжит работу.

Как сделать всплывающую подсказку для класса CWnd и классов, от него производных?

Допустим, имеется диалог класса CMyDlg. Делаем подсказки для элементов управления (для элементов управления CStatic не забудьте поставить свойство Notify):

class CMyDlg:puplic CDialog
{
	CToolTipCtrl m_ToolTip; // мембер класса CMyDlg
};
 
// массив, в котором перечислены идентификаторы элементов управления
// и тексты подсказок к ним
struct
{
	int ID;
	const char* pch;
};
 
m_a_Tips[]=
{
	{IDC_BUTTON1, "Кнопка"},
	{IDC_STATIC1, "Текст"},
	{0, 0} // признак конца массива
};
 
// в инициализации диалога (хотя, в принципе,
// можно и не тут) создаём и привязываем подсказки
BOOL CMyDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
 
	// создаём элемент TOOLTIP
	m_ToolTip.Create(this);
 
	// Привязка подсказок
	for(int i=0; m_a_Tips[i].ID; i++)
	{
		m_ToolTip.AddTool(
			GetDlgItem(m_a_Tips[i].ID),
			m_a_Tips[i].pch
		);
	}
 
	// включаем показ подсказок
	m_ToolTip.Activate(1);
 
	...
}
 
// для того, чтобы подсказки отображались как реакция на движение
// курсора мыши, транслируем получаемые окнами сообщения в
// виртуальной PreTranslateMessage()
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
	// транслируем
	if(m_ToolTip.m_hWnd)
	{
		m_ToolTip.RelayEvent(pMsg);
	}
 
	return CDialog::PreTranslateMessage(pMsg);
}

Как в отладчике Visual С++ просмотреть содержимое std::vector<string>?

Это можно сделать так: к примеру, имеется:

std::vector<string> V;

В режиме отладки открываем окно "Watch" (ALT+3) и вставляем выражения:

  • "V._Myfirst" - будет показан первый элемент V
  • "V._Myfirst+1" - второй элемент V
  • и так далее

Как при выводе текста на контекст устройства определить ширину и высоту выведенных символов текста в пикселах?

Для этого нужно использовать процедуру API:

BOOL GetTextExtentPoint32(
	HDC hdc, // хендл контекста
	LPCTSTR lpString, // выводимая строка
	int cbString, // длина строки в символах
	LPSIZE lpSize // указатель на структуру SIZE, куда будут помещены размеры
);

Функция вычисляет ширину строки символов, оканчивающейся нулём. Поэтому, чтобы вычислить габариты многострочного текста, текст, в начале, необходимо разбить на строки, разделённые символами '\r' и '\n', и определить ширину и высоту каждой отдельно взятой строки.