Мы поможем в написании ваших работ!
ЗНАЕТЕ ЛИ ВЫ?
|
Solver* pSolver; //Solver to use
Содержание книги
- GetClientRect(hWnd, &rt);. DrawText(hdc,lpszHello,strlen(lpszHello),&rt,DT_LEFT);. EndPaint(hWnd, &ps);. case WM_DESTROY: PostQuitMessage(0); break;. return DefWindowProc(hWnd,wMessage,wParam,lParam);. return 0;
- Общие сведения о сообщениях Win32
- Аппаратные (входные данные от мыши, клавиатуры и таймера);
- Список (list Box) –элемент отображения списка элементов, позволяющий пользователю выбрать один или несколько из них.
- пиктограммы (icons) – битовые массивы, использующиеся для визуального представления различных объектов в системе.
- CCmdTarget - базовый класс для всех объектов, которые могут получать и отправлять сообщения.
- Шаг2. Выбираем «An empty project»
- Макросы-компоненты карты сообщений
- afx_msg void OnLButtonUP(UINT nFlags, CPoint point);
- Nmhdr *pnotifystruct, //указатель на структуру с данными
- Посылает сообщение в объект класса cwnd или его потомка, непосредственно вызывая оконную процедуру, и не выходит из нее, пока та не обработает сообщение;
- strMessageText.Format("Error number %d", nError);
- Архитектура «Документ-представление» и MDI-приложения
- HMENU CMDIChildWnd::m_hMenuShared
- дескриптор меню, ассоциированного с окном “MDI child”.
- CDocument* CView:: GetDocument()
- Динамическое создание с помощью конструктора
- virtual POSITION CDocument::GetFirstViewPosition()
- Класс шаблона cdoctemplate в приложении отвечает за взаимодействие документов, их представлений и фреймов. В MDI приложении используется его потомок cmultidoctemplate.
- CMultiDocTemplate* pDocTemplate;
- CFrameWnd* pFrame,CDocument* pDoc, BOOL bMakeVisible=TRUE);
- POSITION CWinApp::GetFirstDocTemplatePosition()
- Документ, связанный с активным представлением
- AFX_THREADPROC pfnThreadProc, // Глобальная функция потока
- UINT Msg, // идентификатор сообщения
- Solver* pSolver; //Solver to use
- virtual CDocument* CFrameWnd::GetActiveDocument()
- SendMessage(WM_COMMAND,ID_FILE_SAVE,0);
- while (::GetMessage(&msg, NULL,0,0))
- Объекты, объявленные как volatile, не подвержены оптимизации и временному хранению в регистрах, но читаются и записываются каждый раз напрямую в память.
- if (!m_thisThreadParams.pResults) return 1;
- if (m_thisThreadParams.pResults)
- ID_SEPARATOR, // status line indicator
- m_wndStatusBar.SetPaneText(1,"");
- TODO: Add your message handler code here
- Нажимаем на элементе “решить” мышку и переносим его на место между пунктами ”window” и ”help” (для порядка).
- Separator – элемент представляет собой горизонтальную разделительную линию
- Object IDs:-> IDM_SOLVE_CONV.
- Шаблон диалога, хранящийся в файле ресурсов, описывает форму, размер и расположение на экране блока диалога и каждого из его внутренних элементов управления.
- CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/)
- правой кнопкой)->Ok->Properties->ID:"IDC_START"
- В правом верхнем углу ставим Static Text "&Начальная точка:".
- Имя этого класса должно обязательно (. ) соответствовать вашему методу решения задачи выпуклой оптимизации. Иначе задача на практике приниматься не будет.
- class CMyDialog : public CDialog
- BOOL cwnd::updatedata( BOOL bsaveandvalidate = TRUE )
- void CMyDialog::DoDataExchange(CDataExchange* pDX)
- Vs2005: правой кнопкой на элементе -> Add variable)
- View->ClassWizard->Message Maps->ClassName:"CDFPDialog"->
- int CListBox::AddString( LPCTSTR lpszItem )
- int CListBox::DeleteString( UINT nIndex )
Solver* pSolver; //Solver to use
Results* pResults; //Ponter to results to be optained
HWND hWnd; //Handler of the associated MDI-child window
};
Исходный код функции потока в “Optimizer.cpp” можно написать примерно следующий:
UINT SolveFunction( LPVOID pParam )
{
ThreadParams* pIn = (ThreadParams*)pParam;
try
{
pIn->pSolver->Solve(pIn->pProblem, pIn->pResult);
::PostMessage(pIn->hWnd, WM_THREADFINISHED,0,0);
}
catch (Error&er)
{
er.ErrorMessage();
::PostMessage((HWND) pIn->hWnd, WM_THREADERROR,0,0);
}
return 0;
}
Запуск рабочего потока командным сообщением
Для начала научимся передавать требование запустить решатель для задачи, загруженной в текущее MDI-child окно, с помощью пользовательской клавиши-акселератора <Ctrl> + <T>.
Для создания новой клавиши-акселератора зайдем в соответствующий раздел ресурсов: ResourceView->Optimizer resources->Accelerator->IDR_MAINFRAME (double click) и выберем двойным щелчком последнюю (пустую) строку в таблице клавиш-акселераторов. В окошке Accel Properties в поле Key: выберем нужную нам клавишу “T” и введем в поле ID: имя ее идентификатора, например, “ID_SOLVE_THIS”. Галочка в группе Modifiers должна стоять только при Ctrl. Жмем <Enter>- и новая клавиша-акселератор добавлена в список. Теперь каждый раз при нажатии <Ctrl> + <T> текущий фрейм (имеющий тип CChildFrame) будет получать сообщение WM_COMMAND с идентификатором объекта-отправителя ID_SOLVE_THIS.
Чтобы написать обработчик нового сообщения WM_COMMAND, воспользуемся “услугами” мастера ClassWizard: View->ClassWizard. Открываем вкладку->Message Maps, которая предназначена для просмотра сообщений, связанных с каждым объектом Windows и для создания соответствующих обработчиков.Выбираем имя нужного класса: Class name->”CChildFrame" и новую клавишу-акселератор в поле объектов Windows: Object IDs:-> ID_SOLVE_THIS.После этого мастер в списке Messages покажет все сообщения, связанные с этим объектом. Выбираем наше сообщение и добавляем обработчик для него: Messages:->”COMMAND”->Add Function и соглашаемся с предложенным именем функции “OnSolveThis”.
Итак, у нас есть обработчик, который ответственен за запуск рабочего потока. Как организовать ввод задачи, т.е. передачу данных из документа в класс CProblem. Здесь можно предложить 2 способа.
1 способ (неправильный, но более простой): сохранение данных документа в текстовом файле. Данный способ удобен, если алгоритм уже реализован в консольном приложении, которое читает исходные данные из файла. К его недостаткам можно отнести то, что пользователь обязан сохранить исходные данные в файле перед тем, как начать расчет.
Для того, чтобы сохранить изменения, которые могли быть сделаны в текущем дочернем фрейме, мы пошлем командное сообщение в главный фрейм, снабдив его идентификатором ID_FILE_SAVE: вызываем уже известную нам функцию SendMessage и файл будет сохранен, если в окне имеются изменения. В случае если это вновь созданный документ, нам будет предложено стандартное окно "Сохранить как" для выбора имени файла.
Чтобы получить имя файла, в котором мы сохранились (оттуда мы прочитаем входные данные задачи) сначала получим указатель на документ функцией:
|