/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: WBEMDLG.CPP Abstract: History: --*/ #include "precomp.h" #include #include #include CBasicWbemDialog::CBasicWbemDialog(HWND hParent) { m_lRefCount = 0; m_hParent = hParent; m_hDlg = NULL; m_bDeleteOnClose = FALSE; m_pOwner = NULL; } CBasicWbemDialog::~CBasicWbemDialog() { if(m_pOwner) m_pOwner->Release(); } INT_PTR CALLBACK CBasicWbemDialog::staticDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { CBasicWbemDialog* pThis; if(uMsg == WM_INITDIALOG) { SetWindowLongPtr(hDlg, DWLP_USER, lParam); pThis = (CBasicWbemDialog*)lParam; pThis->m_hDlg = hDlg; ShowWindow(hDlg, SW_HIDE); } else { pThis = (CBasicWbemDialog*)GetWindowLongPtr(hDlg, DWLP_USER); } if(pThis) { return pThis->DlgProc(hDlg, uMsg, wParam, lParam); } else return FALSE; } INT_PTR CALLBACK CBasicWbemDialog::DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg) { case WM_INITDIALOG: { CenterOnParent(); return OnInitDialog(); } case WM_COMMAND: if(LOWORD(wParam) == IDOK) return OnOK(); else if(LOWORD(wParam) == IDCANCEL) return OnCancel(); else if(HIWORD(wParam) == LBN_DBLCLK) return OnDoubleClick(LOWORD(wParam)); else if(HIWORD(wParam) == LBN_SELCHANGE || HIWORD(wParam)==CBN_SELCHANGE) return OnSelChange(LOWORD(wParam)); else return OnCommand(HIWORD(wParam), LOWORD(wParam)); case WM_ACTIVATE: if(!m_bModal) { if(LOWORD(wParam) != WA_INACTIVE) { ms_hCurrentModeless = m_hDlg; } else { ms_hCurrentModeless = NULL; } } return TRUE; case WM_CLOSE: EndDialog(IDCANCEL); DestroyWindow(hDlg); return TRUE; case WM_NCDESTROY: if(m_bDeleteOnClose) { delete this; } return TRUE; case WM_VKEYTOITEM: { WORD KeyCode = LOWORD(wParam); if (VK_SPACE == KeyCode) { int ListBoxId = GetDlgCtrlID((HWND)lParam); OnDoubleClick(ListBoxId); } } return (BOOL)-1; case WM_APP: // safe private message range (doesn't overlap with dialog controls) return OnUser(wParam, lParam); } return FALSE; } BOOL CBasicWbemDialog::OnOK() { if(Verify()) { EndDialog(IDOK); return TRUE; } else return FALSE; } BOOL CBasicWbemDialog::OnCancel() { EndDialog(IDCANCEL); return TRUE; } BOOL CBasicWbemDialog::EndDialog(int nResult) { if(m_bModal) { // PostMessage(m_hDlg, WM_DESTROY, 0, (LPARAM)nResult); // return TRUE; return ::EndDialog(m_hDlg, nResult); } else { DestroyWindow(m_hDlg); return TRUE; } } WORD CBasicWbemDialog::GetCheck(int nID) { return (WORD)SendMessage(GetDlgItem(nID), BM_GETCHECK, 0, 0); } void CBasicWbemDialog::SetCheck(int nID, WORD wCheck) { SendMessage(GetDlgItem(nID), BM_SETCHECK, wCheck, 0); } UINT CBasicWbemDialog::GetDlgItemTextX( int nDlgItem, LPWSTR pStr, int nMaxCount ) /////////////////////////////////////////////////////////////////// // // Starts a loop which creates a buffer of an initial conservative // size and attempts to retrieve the dialog text using the buffer. // If the buffer overflows, iterate the loop, deleting the current // buffer, and recreating it incrementally larger. Continue until // full text is retrieved. If pStr is NULL, then the inner buffer // is not copied. // // PARAMETERS: The dialog item ID, a buffer pointer to receive // the string, the size of the buffer // // RETURNS: The size of the total amount of text in the dialog // item, or 0 on failure/empty buffer. It is up // to the caller to compare the buffer size to the // return value to determine of all text was recieved // /////////////////////////////////////////////////////////////////// { size_t uLen = 0; // Size of the internal buffer WCHAR *pTmpStr = 0; // The internal buffer UINT uRes; // The return value do { // Delete the previous buffer if (pTmpStr) delete [] pTmpStr; // Increase the size of the buffer uLen += 2048; pTmpStr = new WCHAR[ uLen+1 ]; if (0 == pTmpStr) return 0; // Get the text uRes = GetDlgItemTextW(m_hDlg, nDlgItem, pTmpStr, uLen); // Verify the text if (uRes == 0 || wcslen(pTmpStr) == 0) return 0; // If the buffer is smaller than the text, // then continue to expand the buffer } while(uRes >= (uLen - 1)); if (NULL != pStr) StringCchCopyW(pStr,nMaxCount,pTmpStr); delete [] pTmpStr; // Return the size of the text in the dlg box - regardless of // whether it was copied or not. return uRes; } BOOL CBasicWbemDialog::SetDlgItemTextX(int ID, WCHAR * pwc) { int iLen = 2*(wcslen(pwc))+1; char * pTemp = new char[iLen]; if(pTemp == NULL) return FALSE; wcstombs(pTemp, pwc, iLen); SetDlgItemText(ID, pTemp); delete [] pTemp; return TRUE; } void CBasicWbemDialog::AddStringToCombo(int nID, LPSTR szString, DWORD dwItemData) { HWND hControl=GetDlgItem(nID); if (hControl!=NULL) { int pos=(int)SendMessage(GetDlgItem(nID), CB_ADDSTRING, 0, LPARAM(szString)); if (dwItemData!=CB_ERR && pos!=CB_ERR) { SendMessage (hControl, CB_SETITEMDATA, pos, dwItemData); } } } void CBasicWbemDialog::SetComboSelection (int nID, DWORD dwItemData) { HWND hControl=GetDlgItem(nID); int count=(int)SendMessage (hControl, CB_GETCOUNT, 0, 0L); for (int pos=0; pos rDesktop.bottom ) ) { nY = ( rDesktop.bottom - nHeight ) - rParent.top; } if ( ( nWidth < ( rDesktop.right ) ) && ( ( rParent.left + nX + nWidth ) > rDesktop.right ) ) { nX = ( rDesktop.right - nWidth ) - rParent.left; } } } } MoveWindow(m_hDlg, rParent.left + nX, rParent.top + nY, nWidth, nHeight, TRUE); } void CBasicWbemDialog::SetOwner(CRefCountable* pOwner) { if(m_pOwner) m_pOwner->Release(); m_pOwner = pOwner; if(m_pOwner) m_pOwner->AddRef(); } LRESULT CBasicWbemDialog::GetLBCurSel(int nID) { return SendMessage(GetDlgItem(nID), LB_GETCURSEL, 0, 0); } LPSTR CBasicWbemDialog::GetLBCurSelString(int nID) { LRESULT nIndex = SendMessage(GetDlgItem(nID), LB_GETCURSEL, 0, 0); if(nIndex == LB_ERR) return NULL; LRESULT nLength = SendMessage(GetDlgItem(nID), LB_GETTEXTLEN, (WPARAM)nIndex, 0); char* sz = new char[nLength+3]; SendMessage(GetDlgItem(nID), LB_GETTEXT, (WPARAM)nIndex, (LPARAM)sz); return sz; } LRESULT CBasicWbemDialog::GetCBCurSel(int nID) { return SendMessage(GetDlgItem(nID), CB_GETCURSEL, 0, 0); } LPSTR CBasicWbemDialog::GetCBCurSelString(int nID) { LRESULT nIndex = SendMessage(GetDlgItem(nID), CB_GETCURSEL, 0, 0); if(nIndex == CB_ERR) return NULL; LRESULT nLength = SendMessage(GetDlgItem(nID), CB_GETLBTEXTLEN, (WPARAM)nIndex, 0); char* sz = new char[nLength+3]; SendMessage(GetDlgItem(nID), CB_GETLBTEXT, (WPARAM)nIndex, (LPARAM)sz); return sz; } HWND CBasicWbemDialog::ms_hCurrentModeless = NULL; BOOL CBasicWbemDialog::IsDialogMessage(MSG* pMsg) { if(ms_hCurrentModeless != NULL && IsWindow(ms_hCurrentModeless)) return ::IsDialogMessage(ms_hCurrentModeless, pMsg); else return FALSE; } LRESULT CBasicWbemDialog::MessageLoop() { MSG msg; while (GetMessage(&msg, (HWND) NULL, 0, 0)) { if(msg.message == WM_DESTROY && msg.hwnd == m_hDlg) { DispatchMessage(&msg); return msg.lParam; } if(CBasicWbemDialog::IsDialogMessage(&msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); } return FALSE; } BOOL CBasicWbemDialog::PostUserMessage(HWND hWnd, WPARAM wParam, LPARAM lParam) { // Since user messages don't seem to be queued (even when // posted) mouse & keyboard input messages aren't getting // processed. So we will process them here first. MSG msg; while (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)) { if (CBasicWbemDialog::IsDialogMessage(&msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); } BOOL result; while (result = PostMessage(hWnd, WM_APP, wParam, lParam) == 0 && IsWindow(hWnd)) { SwitchToThread();}; return result; } int CBasicWbemDialog::MessageBox(UINT uTextId, UINT uCaptionId, UINT uType) { return MessageBox(m_hDlg, uTextId, uCaptionId, uType); } int CBasicWbemDialog::MessageBox(HWND hDlg, UINT uTextId, UINT uCaptionId, UINT uType) { char szText[2048]; if(LoadString(GetModuleHandle(NULL), uTextId, szText, 2048) <= 0) { strcpy(szText, "Unable to load resource string"); } char szCaption[2048]; if(LoadString(GetModuleHandle(NULL), uCaptionId, szCaption, 2048) <= 0) { strcpy(szCaption, "Unable to load resource string"); } return ::MessageBox(hDlg, szText, szCaption, uType); } BOOL CBasicWbemDialog::SetDlgItemText(int nID, UINT uTextId) { char szText[2048]; if(LoadString(GetModuleHandle(NULL), uTextId, szText, 2048) <= 0) { strcpy(szText, "Unable to load resource string"); } return SetDlgItemText(nID, szText); } BOOL CALLBACK EnableWindowsProc(HWND hWnd, LPARAM lParam) { DWORD dwPid; DWORD dwTid = GetWindowThreadProcessId(hWnd, &dwPid); if(dwPid == GetCurrentProcessId()) { EnableWindow(hWnd, (BOOL)lParam); } return TRUE; } void CBasicWbemDialog::EnableAllWindows(BOOL bEnable) { EnumWindows((WNDENUMPROC)EnableWindowsProc, (LPARAM)bEnable); }