BOOL CScreensLinks::doDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: init(hwnd); return TRUE; case WM_SIZE: resizeErrorBoxes(); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: SetFocus(getItem(hwnd, IDOK)); if (save(hwnd)) { EndDialog(hwnd, 0); } return TRUE; case IDCANCEL: EndDialog(hwnd, 0); return TRUE; case IDC_SCREENS_SCREENS: switch (HIWORD(wParam)) { case LBN_DBLCLK: editScreen(hwnd); return TRUE; case LBN_SELCHANGE: updateScreensControls(hwnd); updateLinkView(hwnd); return TRUE; case LBN_SELCANCEL: updateScreensControls(hwnd); updateLinkView(hwnd); return TRUE; } break; case IDC_SCREENS_ADD_SCREEN: addScreen(hwnd); return TRUE; case IDC_SCREENS_REMOVE_SCREEN: removeScreen(hwnd); return TRUE; case IDC_SCREENS_EDIT_SCREEN: editScreen(hwnd); return TRUE; case IDC_SCREENS_LINKS: switch (HIWORD(wParam)) { case LBN_SELCHANGE: editLink(hwnd); return TRUE; case LBN_SELCANCEL: editLink(hwnd); return TRUE; } break; case IDC_SCREENS_ADD_LINK: addLink(hwnd); return TRUE; case IDC_SCREENS_REMOVE_LINK: removeLink(hwnd); return TRUE; case IDC_SCREENS_SRC_SIDE: switch (HIWORD(wParam)) { case CBN_SELCHANGE: changeSrcSide(hwnd); break; } break; case IDC_SCREENS_SRC_SCREEN: switch (HIWORD(wParam)) { case CBN_SELCHANGE: changeSrcScreen(hwnd); break; } break; case IDC_SCREENS_DST_SCREEN: switch (HIWORD(wParam)) { case CBN_SELCHANGE: changeDstScreen(hwnd); break; } break; case IDC_SCREENS_SRC_START: switch (HIWORD(wParam)) { case EN_KILLFOCUS: changeIntervalStart(hwnd, LOWORD(wParam), m_editedLink.m_srcInterval); break; } break; case IDC_SCREENS_SRC_END: switch (HIWORD(wParam)) { case EN_KILLFOCUS: changeIntervalEnd(hwnd, LOWORD(wParam), m_editedLink.m_srcInterval); break; } break; case IDC_SCREENS_DST_START: switch (HIWORD(wParam)) { case EN_KILLFOCUS: changeIntervalStart(hwnd, LOWORD(wParam), m_editedLink.m_dstInterval); break; } break; case IDC_SCREENS_DST_END: switch (HIWORD(wParam)) { case EN_KILLFOCUS: changeIntervalEnd(hwnd, LOWORD(wParam), m_editedLink.m_dstInterval); break; } break; } break; case WM_CTLCOLORSTATIC: switch (GetDlgCtrlID((HWND)lParam)) { case IDC_SCREENS_OVERLAP_ERROR: SetBkColor((HDC)wParam, GetSysColor(COLOR_3DFACE)); SetTextColor((HDC)wParam, RGB(255, 0, 0)); return (BOOL)GetSysColorBrush(COLOR_3DFACE); } break; // error outlines case WM_DRAWITEM: { DRAWITEMSTRUCT* di = (DRAWITEMSTRUCT*)lParam; if (di->CtlType == ODT_STATIC) { HGDIOBJ oldPen = SelectObject(di->hDC, m_redPen); HGDIOBJ oldBrush = SelectObject(di->hDC, GetStockObject(NULL_BRUSH)); Rectangle(di->hDC, di->rcItem.left, di->rcItem.top, di->rcItem.right, di->rcItem.bottom); SelectObject(di->hDC, oldPen); SelectObject(di->hDC, oldBrush); return TRUE; } break; } default: break; } return FALSE; }
static LRESULT CALLBACK mainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: // test for unsaved data if (ARG->m_config != ARG->m_oldConfig) { if (!askVerify(hwnd, getString(IDS_UNSAVED_DATA_REALLY_QUIT))) { return 0; } } // quit PostQuitMessage(0); return 0; case IDOK: case IDC_MAIN_TEST: { // note if testing const bool testing = (LOWORD(wParam) == IDC_MAIN_TEST); // save data if (ARG->m_config != ARG->m_oldConfig) { if (!saveConfig(ARG->m_config, false)) { showError(hwnd, CStringUtil::format( getString(IDS_SAVE_FAILED).c_str(), getErrorString(GetLastError()).c_str())); return 0; } ARG->m_oldConfig = ARG->m_config; enableSaveControls(hwnd); } // launch child app DWORD threadID; HANDLE thread = launchApp(hwnd, testing, &threadID); if (thread == NULL) { return 0; } // handle child program if (testing) { // wait for process to stop, allowing the user to kill it waitForChild(hwnd, thread, threadID); // clean up CloseHandle(thread); } else { // don't need thread handle CloseHandle(thread); // notify of success askOkay(hwnd, getString(IDS_STARTED_TITLE), getString(IDS_STARTED)); // quit PostQuitMessage(0); } return 0; } case IDC_MAIN_AUTOSTART: { // construct command line CString cmdLine = getCommandLine(hwnd, false); if (!cmdLine.empty()) { // run dialog CAutoStart autoStart(hwnd, isClientChecked(hwnd) ? NULL : &ARG->m_config, cmdLine); autoStart.doModal(); if (autoStart.wasUserConfigSaved()) { ARG->m_oldConfig = ARG->m_config; enableSaveControls(hwnd); } } return 0; } case IDC_MAIN_SAVE: if (!saveConfig(ARG->m_config, false)) { showError(hwnd, CStringUtil::format( getString(IDS_SAVE_FAILED).c_str(), getErrorString(GetLastError()).c_str())); } else { ARG->m_oldConfig = ARG->m_config; enableSaveControls(hwnd); } return 0; case IDC_MAIN_CLIENT_RADIO: case IDC_MAIN_SERVER_RADIO: enableMainWindowControls(hwnd); return 0; case IDC_MAIN_SERVER_ADD_BUTTON: addScreen(hwnd); return 0; case IDC_MAIN_SERVER_EDIT_BUTTON: editScreen(hwnd); return 0; case IDC_MAIN_SERVER_REMOVE_BUTTON: removeScreen(hwnd); return 0; case IDC_MAIN_SERVER_SCREENS_LIST: if (HIWORD(wParam) == LBN_SELCHANGE) { enableScreensControls(hwnd); updateNeighbors(hwnd); } else if (HIWORD(wParam) == LBN_DBLCLK) { editScreen(hwnd); return 0; } break; case IDC_MAIN_SERVER_LEFT_COMBO: if (HIWORD(wParam) == CBN_SELENDOK) { changeNeighbor(hwnd, (HWND)lParam, kLeft); return 0; } break; case IDC_MAIN_SERVER_RIGHT_COMBO: if (HIWORD(wParam) == CBN_SELENDOK) { changeNeighbor(hwnd, (HWND)lParam, kRight); return 0; } break; case IDC_MAIN_SERVER_TOP_COMBO: if (HIWORD(wParam) == CBN_SELENDOK) { changeNeighbor(hwnd, (HWND)lParam, kTop); return 0; } break; case IDC_MAIN_SERVER_BOTTOM_COMBO: if (HIWORD(wParam) == CBN_SELENDOK) { changeNeighbor(hwnd, (HWND)lParam, kBottom); return 0; } break; case IDC_MAIN_OPTIONS: s_globalOptions->doModal(); enableSaveControls(hwnd); break; case IDC_MAIN_ADVANCED: s_advancedOptions->doModal(isClientChecked(hwnd)); enableSaveControls(hwnd); break; } default: break; } return DefDlgProc(hwnd, message, wParam, lParam); }