|
|
Строка 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]] |