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

Материал из Весельчак У
Перейти к: навигация, поиск
(Удалены 5 статей: разделение.)
(Создан редирект на FAQ:WinAPI_VCPP. Оптимизация для поисковых систем.)
 
(не показана одна промежуточная версия этого же участника)
Строка 1: Строка 1:
===Как убрать главное меню из окна CMainFrame?===
+
#REDIRECT [[FAQ:WinAPI_VCPP]]
 
+
Это можно сделать в виртуальной функции 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]]
+

Текущая версия на 02:30, 9 ноября 2008

Перенаправление на: