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

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