Взаимодействие классов
// Мы не надеемся на упорядоченность идентификаторов // элементов и поэтому заводим массив отображений UINT IDs[] = { IDC_XPOS, IDC_YPOS, IDC_ZPOS, IDC_AMBIENT, IDC_DIFFUSE, IDC_SPECULAR, IDC_AMBMAT, IDC_DIFFMAT, IDC_SPECMAT, IDC_SHINE, IDC_EMISSION }; //=== Пробег по всем регуляторам и их установка for (int i=0; Ksizeof (IDs)/sizeof (IDs [0]); i++) { //====== Получаем описатель окна hwnd = GetDlgItem(IDs[i]); UINT nID; //====== Узнаем идентификатор элемента int num = GetSliderNum(hwnd, nID); //====== Выставляем позицию ~ SendMessage(hwnd,TBM_SETPOS,TRUE,(LPARAM)m_Pos[i] //=== Приводим в соответствие текстовый ярлык char s [ 8 ]; sprintf (s,"%d",m_Pos[i]); SetDlgltemText(nID, s); } // Выясняем состояние режима изображения полигонов if FAILED (p › GetQuad(&m_bQuad)) { ShowError (); return 0; } //====== Устанавливаем текст SetDlgltemText (IDC_QUADS,m_bQuad? '"Quads": "Strips"); return 1; }
В процессе обработки сообщения нам понадобились вспомогательные функции GetSliderNum и ShowError. Первая функция уже участвовала в проекте на основе MFC, поэтому мы лишь напомним, что она позволяет по известному Windows-описателю окна элемента управления получить его порядковый номер в массиве позиций регуляторов. Кроме этого, функция позволяет получить идентификатор элемента управления nio, который нужен для управления им, например: при вызове SetDlgltemText (nID, s);.
int CPropDlg:: GetSliderNum (HWND hwnd, UINT& nID) { // Получаем ID по известному описателю окна switch (::GetDlgCTRLI)(hwnd)) { case IDC_XPOS: nID = IDC_XPOS_TEXT; return 0; case IDC_YPOS: nID = IDC_YPOS_TEXT; return 1; case IDC_ZPOS: nID = IDC_ZPOS_TEXT; return 2; case IDC_AMBIENT: nID = IDC_AMB_TEXT; return 3; case IDC_DIFFUSE: nID = IDC_DIFFUSE_TEXT; return 4; case IDC_SPECULAR: nID = 1DC_SPECULAR_TEXT; return 5; case IDC_AMBMAT: nID = IDC_AMBMAT_TEXT; return 6; case IDC_DIFFMAT: nID = IDC_DIFFMAT_TEXT; return 7; case IDC_SPECMAT: nID = IDC_SPECMAT_TEXT; return 8; case IDC_SHINE: nID = IDC_SHINE_TEXT; return 9; case IDC_EMISSION: nID = IDC_EMISSION_TEXT; return 10; } return 0; }