FAQ:WinAPI, VCPP Part 2 — различия между версиями

Материал из Весельчак У
Перейти к: навигация, поиск
(Удалены 5 статей: разделение.)
(Удаление 5 статей: разделение.)
Строка 1: Строка 1:
===Как убрать главное меню из окна CMainFrame?===
 
 
Это можно сделать в виртуальной функции PreCreateWindow:
 
 
<syntaxhighlight lang="cpp">
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
 
{
 
// обнуляем хендл меню до вызова CFrameWnd::PreCreateWindow
 
cs.hMenu=0;
 
 
if(!CFrameWnd::PreCreateWindow(cs))
 
{
 
return FALSE;
 
}
 
 
...
 
}
 
</syntaxhighlight>
 
 
===Как работающая программа может определить, что пользователь завершает работу Windows?===
 
 
Когда пользователь завершает работу Windows, всем процессам посылается сообщение WM_QUERYENDSESSION. Его нужно отловить в обработчике OnQueryEndSession(). Если вернуть из обработчика значение 0, то Windows продолжит работу.
 
 
===Как сделать всплывающую подсказку для класса CWnd и классов, от него производных?===
 
 
Допустим, имеется диалог класса CMyDlg. Делаем подсказки для элементов управления (для элементов управления CStatic  не забудьте поставить свойство Notify):
 
 
<syntaxhighlight lang="cpp">
 
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);
 
}
 
</syntaxhighlight>
 
 
===Как в отладчике Visual С++ просмотреть содержимое std::vector<string>?===
 
 
Это можно сделать так: к примеру, имеется:
 
 
<syntaxhighlight lang="cpp">
 
std::vector<string> V;
 
</syntaxhighlight>
 
 
В режиме отладки открываем окно "Watch" (ALT+3) и вставляем выражения:
 
* "V._Myfirst" - будет показан первый элемент V
 
* "V._Myfirst+1" - второй элемент V
 
* и так далее
 
 
===Как при выводе текста на контекст устройства определить ширину и высоту выведенных символов текста в пикселах?===
 
 
Для этого нужно использовать процедуру API:
 
 
<syntaxhighlight lang="cpp">
 
BOOL GetTextExtentPoint32(
 
HDC hdc, // хендл контекста
 
LPCTSTR lpString, // выводимая строка
 
int cbString, // длина строки в символах
 
LPSIZE lpSize // указатель на структуру SIZE, куда будут помещены размеры
 
);
 
</syntaxhighlight>
 
 
Функция вычисляет ширину строки символов, оканчивающейся нулём. Поэтому, чтобы вычислить габариты многострочного текста, текст, в начале, необходимо разбить на строки, разделённые символами '\r' и '\n', и определить ширину и высоту каждой отдельно взятой строки.
 
 
 
[[Category:FAQ]]
 
[[Category:FAQ]]

Версия 20:35, 2 ноября 2008