//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 调整状态栏大小及位置 VOID CChildWnd::AdjustStatusBar(WPARAM wParam, LPARAM lParam) { INT i; INT j; RECT rtRect; INT iParts[] = {-1, 50, 35, 40, 35, 35, 50, 50}; for (i = 0; i < _NumOf(iParts); i++) { iParts[i] = LOWORD(lParam); _ExIf(wParam != SIZE_MAXIMIZED, iParts[i] -= 16); for (j = i + 1; j < _NumOf(iParts); j++) { iParts[i] -= iParts[j]; } } _ExIf(wParam == SIZE_MAXIMIZED, iParts[_NumOf(iParts) - 1] -= -1); SendMessage(m_hStatusBar, SB_SETPARTS, _NumOf(iParts), (LPARAM) iParts); SendMessage(m_hStatusBar, WM_SIZE, wParam, lParam); SendMessage(m_hStatusBar, SB_GETRECT, m_uEditBox, (LPARAM) &rtRect); InflateRect(&rtRect, -2, -2); MoveWindow(m_hEditBox, rtRect.left, rtRect.top, _RectWidth(rtRect), _RectHeight(rtRect), TRUE); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 构造函数 HWND CChildWnd::Create() { // 转到开始 Restart(); // 获取窗口状态 BOOL bMaximized = CClientWnd::GetChildCount() ? ((GetWindowLong(CClientWnd::m_hWnd, GWL_EXSTYLE) & WS_EX_CLIENTEDGE) == FALSE) : CIni::GetInt(INI_MaxOnOpen); // 创建窗口 m_hWnd = CreateMDIWindow(STR_AppName TEXT("ChildWnd"), m_tzFileName, 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CClientWnd::m_hWnd, g_hInst, (LPARAM) this); if (m_hWnd) { // 调整播放窗口大小 SetVideoSize(m_uWidth, m_uHeight); _ExIf(bMaximized, ShowWindow(m_hWnd, SW_MAXIMIZE)); // 播放设置 SetPlayWnd(m_hPlayWnd); _ExIf(CIni::GetInt(INI_DirectDraw, TRUE), EnableDDraw()); _ExIf(CIni::GetInt(INI_PlayOnOpen), Play()); } return m_hWnd; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 弹出菜单初始化 VOID CMainWnd::OnMenuPopup(WPARAM wParam, LPARAM lParam) { HWND hWnd; DWORD dwSize; TCHAR tzTemp[512]; TCHAR tzPath[512]; switch (GetMenuItemID((HMENU) wParam, 0)) { case IDM_Help_Desktop: // 判断快捷方式是否存在 CheckCommand(IDM_Help_Desktop, CShortcut::Exist(CSIDL_DESKTOP)); CheckCommand(IDM_Help_StartMenu, CShortcut::Exist(CSIDL_STARTMENU)); CheckCommand(IDM_Help_ProgramMenu, CShortcut::Exist(CSIDL_PROGRAMS)); CheckCommand(IDM_Help_QuickLaunch, CShortcut::Exist(CSIDL_APPDATA)); CheckCommand(IDM_Help_VisualStudio, CVSTool::Exist()); break; case IDM_Play_Play: hWnd = CClientWnd::GetActive(); _ExIf(hWnd, SendMessage(hWnd, WM_INITMENUPOPUP, wParam, lParam)); break; case IDM_View_Toolbar: GetModuleFileName(NULL, tzTemp, MAX_PATH); wsprintf(tzPath, TEXT("\"%s\" \"%%1\""), tzTemp); dwSize = _NumOf(tzTemp); SHGetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\shell\\open\\command"), NULL, NULL, tzTemp, &dwSize); CheckCommand(IDM_View_AssociateFile, lstrcmpi(tzTemp, tzPath) == 0); break; } }
VOID CClientWnd::OnChildOpenClose(BOOL bOpen) { _ExIf(m_bScrabble, OnPlayScrabble()); if (bOpen) { m_uChildNum++; if (m_uChildNum == 1) { EnableCommand(); CMainWnd::EnableCommand(IDM_Play_Synchronize, FALSE); CMainWnd::EnableCommand(IDM_Play_Scrabble, FALSE); } else if (m_uChildNum == 2) { CMainWnd::EnableCommand(IDM_Play_Synchronize, TRUE); CMainWnd::EnableCommand(IDM_Play_Scrabble, TRUE); } } else { m_uChildNum--; if (m_uChildNum <= 1) { if (m_uChildNum == 0) { // 保存子窗口最大化状态 BOOL bMaximized = (HasEdge() == FALSE); CIni::SetInt(INI_MaxOnOpen, bMaximized); _ExIf(bMaximized, SetEdge()); EnableCommand(FALSE); } CMainWnd::EnableCommand(IDM_Play_Synchronize, FALSE); CMainWnd::EnableCommand(IDM_Play_Scrabble, FALSE); } } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 类型改变 VOID COpenDlg::OnTypeChange(LPOPENFILENAME pOfn) { UINT i; PTSTR p; UINT uMax; TCHAR tzExt[16]; // 获取选择类型 p = (PTSTR) pOfn->lpstrFilter; i = pOfn->nFilterIndex; _ExIf(i > 0, i--); m_riFormat.m_csColorSpace = (COLORSPACE) i; // 设置默认扩展名 uMax = m_riFormat.m_csColorSpace * 2 + 1; for (i = 0; i < uMax; i++, p += lstrlen(p) + 1); lstrcpyn(tzExt, p + 2, _NumOf(tzExt)); p = _StrChr(tzExt, ';'); _ExIf(p, *p = 0); SendMessage(m_hParent, CDM_SETDEFEXT, 0, (LPARAM) ((tzExt[0] != '*') ? tzExt : NULL)); m_bFilterChange = TRUE; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 大小改变 VOID CMainWnd::OnSize(WPARAM wParam, LPARAM lParam) { if (wParam == SIZE_MINIMIZED) { if (IsMenuChecked(IDM_View_MinToTray)) { // 添加系统托盘图标,隐藏主窗口 OnTrayIcon(); } } else { MoveWindow(CClientWnd::m_hWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); _ExIf(CClientWnd::IsScrabble(), CClientWnd::Scrabble()); } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 枚举版本并操作 BOOL CVSTool::Operate(BOOL bDotNet, INT iCommand) { DWORD i; HKEY hKey; BOOL bResult; LONG lResult; DWORD dwSize; HKEY hToolKey; FILETIME ftTime; TCHAR tzName[MAX_PATH]; TCHAR tzToolKey[MAX_PATH]; // 打开键值 lResult = RegOpenKeyEx(HKEY_CURRENT_USER, bDotNet ? TEXT("Software\\Microsoft\\VisualStudio") : TEXT("Software\\Microsoft\\Devstudio"), 0, KEY_ALL_ACCESS, &hKey); if (lResult != ERROR_SUCCESS) { return FALSE; } // 枚举版本循环 for (i = 0, bResult = FALSE; (bResult == FALSE) || (iCommand != 0); i++) { // 枚举版本 dwSize = MAX_PATH; lResult = RegEnumKeyEx(hKey, i, tzName, &dwSize, NULL, NULL, NULL, &ftTime); if (lResult != ERROR_SUCCESS) { break; } // 打开工具菜单键值 wsprintf(tzToolKey, TEXT("%s\\%s"), tzName, bDotNet ? TEXT("External Tools") : TEXT("Tools")); lResult = RegOpenKeyEx(hKey, tzToolKey, 0, KEY_ALL_ACCESS, &hToolKey); if (lResult == ERROR_SUCCESS) { _ExIf(Operate(hToolKey, bDotNet, iCommand), bResult = TRUE); RegCloseKey(hToolKey); } } RegCloseKey(hKey); return bResult; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 缩放 VOID CChildWnd::OnPlayZoom(UINT uCmd, BOOL bCascade) { DWORD dwWidth; DWORD dwHeight; _ExIf(bCascade && (CClientWnd::HasEdge() == FALSE), SendMessage(CClientWnd::m_hWnd, WM_MDICASCADE, 0, 0)); dwWidth = m_uWidth; dwHeight = m_uHeight; if (uCmd == IDM_Play_ZoomHalf) { dwWidth /= 2; dwHeight /= 2; } else if (uCmd == IDM_Play_ZoomDouble) { dwWidth *= 2; dwHeight *= 2; } SetVideoSize(dwWidth, dwHeight); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 命令处理 VOID COpenDlg::OnCommand(WPARAM wParam, LPARAM lParam) { INT i; RECT rtRect; BOOL bPreview; PUINT puValue; const UINT c_uFormats[][2] = { {352, 288}, {176, 144}, {128, 96}, {320, 240}, {160, 120}, {640, 480}, {320, 240}, {160, 120}, {352, 240}, {352, 288}, {720, 480}, {720, 576}, }; _ExIf((HWND) lParam == m_hToolbar, SetFocus(m_hToolbar)); switch (LOWORD(wParam)) { case IDC_Open_MulSignText: if (m_hFormatMenu == NULL) { m_hFormatMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_Menu_Format)); } GetWindowRect(GetDlgItem(m_hWnd, IDC_Open_MulSignText), &rtRect); TrackPopupMenu(GetSubMenu(m_hFormatMenu, 0), TPM_TOPALIGN, rtRect.left, rtRect.top, 0, m_hWnd, NULL); break; case IDM_Format_CIF: case IDM_Format_QCIF: case IDM_Format_SUBQCIF: case IDM_Format_SIF: case IDM_Format_QSIF: case IDM_Format_VGA: case IDM_Format_QVGA: case IDM_Format_QQVGA: case IDM_Format_VCDNTSC: case IDM_Format_VCDPAL: case IDM_Format_DVDNTSC: case IDM_Format_DVDPAL: i = LOWORD(wParam) - IDM_Format_CIF; SetDlgItemInt(m_hWnd, IDC_Open_Width, c_uFormats[i][0], FALSE); SetDlgItemInt(m_hWnd, IDC_Open_Height, c_uFormats[i][1], TRUE); OnCommand(MAKELONG(IDC_Open_Width, EN_KILLFOCUS)); OnCommand(MAKELONG(IDC_Open_Height, EN_KILLFOCUS)); break; case IDC_Open_Preview: // 切换预览 if (HIWORD(wParam) == BN_CLICKED) { IsPreviewChecked() ? InvalidateRect(m_hWnd, &m_rtPreview, TRUE) : m_pWnd->Stop(); OnCommand(IDC_RawVideo_Seek); } break; case IDC_Open_Width: case IDC_Open_Height: case IDC_Open_FrameRate: case IDC_Open_FrameStep: if (HIWORD(wParam) == EN_KILLFOCUS) { switch (LOWORD(wParam)) { case IDC_Open_Width: puValue = &m_riFormat.m_uWidth; break; case IDC_Open_Height: puValue = (PUINT) &m_riFormat.m_iHeight; break; case IDC_Open_FrameRate: puValue = &m_riFormat.m_uFrameRate; break; case IDC_Open_FrameStep: puValue = (PUINT) &m_riFormat.m_iFrameStep; break; } // 限制尺寸范围 *puValue = GetDlgItemInt(m_hWnd, LOWORD(wParam), NULL, TRUE); m_pWnd->Open(m_pWnd->m_tzFileName, &m_riFormat); SetDlgItemInt(m_hWnd, LOWORD(wParam), *puValue, TRUE); } break; case IDM_Play_Play: m_pWnd->TogglePlay(); break; case IDM_Play_GotoStart: m_pWnd->Stop(); m_pWnd->Seek(0); break; case IDM_Play_GotoEnd: m_pWnd->Stop(); m_pWnd->Seek(MAX_Frame); break; case IDM_Play_StepBackward: m_pWnd->Stop(); m_pWnd->Step(-1); break; case IDM_Play_StepForward: m_pWnd->Stop(); m_pWnd->Step(1); break; case IDC_RawVideo_Play: SendMessage(m_hToolbar, TB_CHECKBUTTON, IDM_Play_Play, lParam); break; case IDC_RawVideo_Change: bPreview = CanPreview(); for (i = IDM_Play_Play; i <= IDM_Play_GotoEnd; i++) { SendMessage(m_hToolbar, TB_ENABLEBUTTON, i, MAKELONG(bPreview, 0)); } i = m_pWnd->m_uTotalFrame ? (m_pWnd->m_uTotalFrame - 1) : 0; SendDlgItemMessage(m_hWnd, IDC_Open_FrameStepSpin, UDM_SETRANGE, 0, MAKELONG(i, -i)); InvalidateRect(GetDlgItem(m_hWnd, IDC_Open_FrameStepSpin), NULL, FALSE); // 计算位置和尺寸 CopyRect(&rtRect, &m_rtPreview); InflateRect(&rtRect, -5, -5); i = MulDiv(m_pWnd->m_uWidth, _RectHeight(m_rtPreview), m_pWnd->m_iHeight); if (i > _RectWidth(rtRect)) { i = MulDiv(m_pWnd->m_iHeight, _RectWidth(rtRect), m_pWnd->m_uWidth); if (_RectHeight(rtRect) > i) { rtRect.top += (_RectHeight(rtRect) - i) / 2; rtRect.bottom = rtRect.top + i; } } else { rtRect.left += (_RectWidth(rtRect) - i) / 2; rtRect.right = rtRect.left + i; } m_pWnd->SetDrawRect(&rtRect); SetDlgItemInt(m_hWnd, IDC_Open_TotalFrame, m_pWnd->m_uTotalFrame, FALSE); InvalidateRect(m_hWnd, &m_rtPreview, TRUE); break; case IDC_RawVideo_Seek: if (CanPreview()) { SetDlgItemInt(m_hWnd, IDC_Open_StatusText, m_pWnd->m_uCurFrame + 1, FALSE); } else { SetDlgItemText(m_hWnd, IDC_Open_StatusText, NULL); } break; } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 设置格式 BOOL CChildWnd::OnChangeFormat() { TCHAR tzText[16]; INT i = GetDlgItemInt(m_hStatusBar, IDC_EditBox, NULL, TRUE); CRawImage riFormat = *this; switch (m_uEditBox) { case SBI_ColorSpace: GetWindowText(m_hEditBox, tzText, _NumOf(tzText)); riFormat.m_csColorSpace = CS_ALL; for (i = 0; i < _NumOf(c_tzColorSpace); i++) { if (lstrcmpi(tzText, c_tzColorSpace[i]) == 0) { riFormat.m_csColorSpace = (COLORSPACE) (i % CS_ALL); break; } } if (riFormat.m_csColorSpace == CS_ALL) { return FALSE; } else if (riFormat.m_csColorSpace == m_csColorSpace) { return TRUE; } break; case SBI_Width: i = (i + 1) & ~1; _ReturnValIf(riFormat.m_uWidth == (UINT) i, TRUE); riFormat.m_uWidth = i; break; case SBI_Height: i = (i + 1) & ~1; _ReturnValIf(riFormat.m_iHeight == i, TRUE); riFormat.m_iHeight = i; break; case SBI_FrameRate: _ReturnValIf(riFormat.m_uFrameRate == (UINT) i, TRUE); riFormat.m_uFrameRate = i; break; case SBI_FrameStep: riFormat.m_iFrameStep = GetDlgItemInt(m_hStatusBar, IDC_EditBox, NULL, TRUE); _ReturnValIf(riFormat.m_iFrameStep == m_iFrameStep, TRUE); break; case SBI_CurFrame: if ((i > 0) && (i <= (INT) m_uTotalFrame)) { Stop(); Seek(i - 1); return TRUE; } default: return FALSE; } _ExIf(CClientWnd::IsScrabble(), CClientWnd::OnPlayScrabble()); Open(m_tzFileName, &riFormat); EnableDDraw(); Draw(); // 记录历史格式 CIni::SetStruct(INI_HistroyFormat, m_tzFileName, &riFormat, sizeof(RAWIMAGE)); return TRUE; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 子窗口回调函数 LRESULT CALLBACK CChildWnd::ClildWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CChildWnd *pThis; LPMDICREATESTRUCT pmcsCreate; switch (uMsg) { case WM_CREATE: // 获取 this 指针 _Assert(lParam); pmcsCreate = (LPMDICREATESTRUCT) ((LPCREATESTRUCT) lParam)->lpCreateParams; _Assert(pmcsCreate); pThis = (CChildWnd *) pmcsCreate->lParam; _Assert(pThis); pThis->m_hWnd = hWnd; pThis->OnCreate(); break; case WM_WINDOWPOSCHANGED: // 位置改变 GetWnd(hWnd)->SetDrawRect(); break; case WM_SIZE: // 尺寸改变 if (wParam != SIZE_MINIMIZED) { _Assert(GetWnd(hWnd)); GetWnd(hWnd)->OnSize(wParam, lParam); } break; case WM_INITMENUPOPUP: if (GetMenuItemID((HMENU) wParam, 0) == IDM_Play_Play) { GetWnd(hWnd)->OnMenuPopup(); } break; case WM_NOTIFY: case WM_MENUSELECT: case WM_EXITMENULOOP: // 设置工具栏和状态栏提示信息 OnNotify(hWnd, uMsg, wParam, lParam); break; case WM_COMMAND: // 命令消息 GetWnd(hWnd)->OnCommand(wParam, lParam); break; case WM_KILLFOCUS: // 取消 _ExIf(GetWnd(hWnd)->m_bExporting, SetFocus(hWnd)); break; case WM_KEYDOWN: // 取消 _ExIf(wParam == VK_ESCAPE, GetWnd(hWnd)->m_bCancel = TRUE); break; case WM_NCDESTROY: // 窗口销毁 CClientWnd::OnChildOpenClose(); _Assert(GetWnd(hWnd)); delete GetWnd(hWnd); break; } return DefMDIChildProc(hWnd, uMsg, wParam, lParam); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 命令处理 VOID CMainWnd::OnCommand(WPARAM wParam, LPARAM lParam) { PTSTR p; DWORD dwSize; CChildWnd *pWnd; TCHAR tzTemp[512]; TCHAR tzPath[512]; if ((LOWORD(wParam) >= IDM_View_Default) && (LOWORD(wParam) < IDM_View_Default + 50)) { // 改变语言 if (IsMenuChecked(LOWORD(wParam)) == FALSE) { OnViewLanguage(LOWORD(wParam)); } return; } else if ((LOWORD(wParam) >= IDM_File_Recent) && (LOWORD(wParam) < IDM_File_Recent + 10)) { // 打开新近文件 GetMenuString(m_hMenu, LOWORD(wParam), tzTemp, _NumOf(tzTemp), MF_BYCOMMAND); OnFileOpen(tzTemp + 4); return; } switch (LOWORD(wParam)) { case IDM_File_Open: OnFileOpen((PTSTR) lParam); break; case IDM_File_Exit: PostMessage(m_hWnd, WM_CLOSE, 0, 0); break; case IDM_View_Toolbar: case IDM_View_StatusBar: case IDM_View_AlwaysOnTop: case IDM_View_MinToTray: case IDM_View_ShowSplash: case IDM_View_ShowOpen: case IDM_View_PlayOnOpen: // 查看选项 OnViewMenu(LOWORD(wParam), FALSE); break; case IDM_View_AssociateFile: GetModuleFileName(NULL, tzPath, MAX_PATH); wsprintf(tzTemp, TEXT("\"%s\" \"%%1\""), tzPath); dwSize = _NumOf(tzPath); SHGetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\shell\\open\\command"), NULL, NULL, tzPath, &dwSize); if (lstrcmpi(tzTemp, tzPath) == 0) { SHDeleteKey(HKEY_CLASSES_ROOT, STR_AppName); for (p = STR_ExtList; *p; p += lstrlen(p) + 1) { SHDeleteKey(HKEY_CLASSES_ROOT, p); } } else { SHSetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\shell\\open\\command"), NULL, REG_SZ, tzTemp, _StrSize(tzTemp)); GetModuleFileName(NULL, tzPath, MAX_PATH); wsprintf(tzTemp, TEXT("\"%s\",1"), tzPath); SHSetValue(HKEY_CLASSES_ROOT, STR_AppName TEXT("\\DefaultIcon"), NULL, REG_SZ, tzTemp, _StrSize(tzTemp)); for (p = STR_ExtList; *p; p += lstrlen(p) + 1) { SHSetValue(HKEY_CLASSES_ROOT, p, NULL, REG_SZ, STR_AppName, sizeof(STR_AppName)); } } break; case IDM_Window_Cascade: SendMessage(CClientWnd::m_hWnd, WM_MDICASCADE, 0, 0); return; case IDM_Window_TitleHorz: SendMessage(CClientWnd::m_hWnd, WM_MDITILE, MDITILE_HORIZONTAL, 0); break; case IDM_Window_TitleVert: SendMessage(CClientWnd::m_hWnd, WM_MDITILE, MDITILE_VERTICAL, 0); break; case IDM_Window_ArrangeIcons: SendMessage(CClientWnd::m_hWnd, WM_MDIICONARRANGE, 0, 0); break; case IDM_Window_CloseAll: CClientWnd::CloseAll(); break; case IDM_Help_Content: // 查看帮助内容 GetModuleFileName(NULL, tzTemp, MAX_PATH); lstrcpy(_StrEnd(tzTemp) - _LenOf(EXT_Chm), EXT_Chm); if (ShellExecute(NULL, NULL, tzTemp, NULL, NULL, SW_SHOW) <= (HINSTANCE) 32) { ErrorBox(ERR_HelpErr); } break; case IDM_Help_Desktop: case IDM_Help_StartMenu: case IDM_Help_ProgramMenu: case IDM_Help_QuickLaunch: case IDM_Help_VisualStudio: // 创建或删除快捷方式 OnHelpShortcut(LOWORD(wParam)); break; case IDM_Help_About: // 显示关于对话框 CAboutDlg::Show(m_hWnd); break; case IDC_TrayIcon: // 系统托盘消息 if ((lParam == WM_LBUTTONUP) || (lParam == WM_RBUTTONUP)) { OnTrayIcon(FALSE); } break; default: pWnd = CClientWnd::GetChildWnd(); _ExIf(pWnd, pWnd->OnCommand(wParam, lParam)); } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 获取窗口状态 BOOL CXPGetState(PCLASSXP pCxp) { PCLASSXP p; UINT uCheck; // 设置禁用和焦点状态 pCxp->lState = _CXPGetStyle(WS_DISABLED) ? CXPS_DISABLED : 0; _ExIf(pCxp->hWnd == GetFocus(), _CXPSetState(CXPS_FOCUS)); switch (pCxp->uClass) { case CXPC_BUTTON: switch (_CXPGetStyle(BS_TYPEMASK)) { case BS_DEFPUSHBUTTON: // 默认按钮 _CXPSetState(CXPS_DEFAULT); case BS_PUSHBUTTON: // 普通按钮 break; case BS_CHECKBOX: // 复选框 case BS_AUTOCHECKBOX: // 自动复选框 case BS_3STATE: // 三状态复选框 case BS_AUTO3STATE: // 自动三状态复选框 case BS_RADIOBUTTON: // 单选框 case BS_AUTORADIOBUTTON: // 自动单选框 if (!_CXPGetStyle(BS_PUSHLIKE)) { pCxp->pDraw = CXPDrawCheckBox; } break; default: // 自绘按钮、组合框和其它未知类型 return FALSE; } uCheck = (LONG) SendMessage(pCxp->hWnd, BM_GETCHECK, 0, 0); if (uCheck == BST_CHECKED) { _CXPSetState(CXPS_CHECKED); } else if (uCheck == BST_INDETERMINATE) { _CXPSetState(CXPS_INDETERMINATE); } break; case CXPC_EDITBOX: if (!_CXPGetStyle(WS_BORDER) && !(GetWindowLong(pCxp->hWnd, GWL_EXSTYLE) & (WS_EX_CLIENTEDGE | WS_EX_STATICEDGE))) { return FALSE; } _ExIf(_CXPGetStyle(ES_READONLY), _CXPSetState(CXPS_READONLY)); break; case CXPC_COMBOBOX: if (_CXPGetStyle(CBS_TYPEMASK) == CBS_SIMPLE) { _CXPSetState(CXPS_SIMPLECMB); } break; case CXPC_SPINBOX: _ExIf(_CXPGetStyle(UDS_HORZ), _CXPSetState(CXPS_HORIZON)); _ExIf(_CXPGetStyle(UDS_ARROWKEYS), _CXPSetState(CXPS_ACCELSPIN)); _ExIf(_CXPGetStyle(UDS_ALIGNLEFT), _CXPSetState(CXPS_LEFTSPIN)); _ExIf(_CXPGetStyle(UDS_ALIGNRIGHT), _CXPSetState(CXPS_RIGHTSPIN)); // 设置旧伙伴 p = (PCLASSXP) pCxp->lParam; _ExIf(p, p->lParam = 0); p = (PCLASSXP) GetProp((HWND) SendMessage(pCxp->hWnd, UDM_GETBUDDY, 0, 0), TEXT("ClassXP")); if (p && (p->uClass == CXPC_EDITBOX)) { // 设置新伙伴 p->lParam = (LPARAM) pCxp; pCxp->lParam = (LPARAM) p; } break; } return TRUE; }