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