|
|
(не показана одна промежуточная версия этого же участника) |
Строка 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]]
| + | |