//+---------------------------------------------------------------------------- // // Windows NT Directory Service Property Pages // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 2001 // // File: shlprop.cxx // // Contents: Tables for table-driven Shell DS property pages // // History: 14-July-97 Jimharr created from dsprop.cxx by ericb // // Note: Attribute LDAP display names, types, upper ranges, and so // forth, have been manually copied from schema.ini. Thus, // consistency is going to be difficult to maintain. If you know // of schema.ini changes that affect any of the attributes in // this file, then please make any necessary corrections here. // //----------------------------------------------------------------------------- #include "pch.h" #include "proppage.h" #include "user.h" #include "group.h" #include "computer.h" #include "pages.hm" // HIDC_* #include #include "dsprop.cxx" HRESULT ROList(CDsPropPageBase * pPage, PATTR_MAP pAttrMap, PADS_ATTR_INFO pAttrInfo, LPARAM lParam, PATTR_DATA pAttrData, DLG_OP DlgOp); #define NT_GROUP_PAGE #ifdef NT_GROUP_PAGE HRESULT BmpPictureCtrl(CDsPropPageBase * pPage, PATTR_MAP pAttrMap, PADS_ATTR_INFO pAttrInfo, LPARAM lParam, PATTR_DATA pAttrData, DLG_OP DlgOp); INT_PTR CALLBACK PictureDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); //+---------------------------------------------------------------------------- // // Class: CBmpPicCtrl // // Purpose: Picture control sub-class window proc for displaying bitmaps. // //----------------------------------------------------------------------------- class CBmpPicCtrl { public: #ifdef _DEBUG char szClass[32]; #endif CBmpPicCtrl(HWND hCtrl, PBYTE pb); ~CBmpPicCtrl(void); // // Static WndProc to be passed as subclass address. // static LRESULT CALLBACK StaticCtrlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // // Member functions, called by WndProc // LRESULT OnPaint(void); HRESULT CreateBmpPalette(void); // // Data members // protected: HWND m_hCtrl; HWND m_hDlg; WNDPROC m_pOldProc; PBYTE m_pbBmp; HPALETTE m_hPal; }; #endif // NT_GROUP_PAGE //+---------------------------------------------------------------------------- // User Object. //----------------------------------------------------------------------------- // // General page, first name // ATTR_MAP USGFirstName = {IDC_SH_FIRST_NAME_EDIT, FALSE, FALSE, 64, {L"givenName", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // General page, last name // ATTR_MAP USGLastName = {IDC_SH_LAST_NAME_EDIT, FALSE, FALSE, 64, {L"sn", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // General page, friendly name // ATTR_MAP USGFriendlyName = {IDC_SH_DISPLAY_NAME_EDIT, FALSE, FALSE, ATTR_LEN_UNLIMITED, {L"displayName", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // General page, phone number // ATTR_MAP USGPhone = {IDC_PHONE_EDIT, FALSE, FALSE, 32, {L"telephoneNumber", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // General page, email // ATTR_MAP USGEMail = {IDC_EMAIL_EDIT, FALSE, FALSE, 256, {L"mail", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // General page, URL // ATTR_MAP USGURL = {IDC_URL_EDIT, FALSE, FALSE, 2048, {L"wWWHomePage", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // The list of attributes on the User General page. // PATTR_MAP rgpUSGAttrMap[] = {{&GenIcon}, {&AttrName}, {&USGFirstName}, {&USGLastName}, {&USGFriendlyName}, {&USGPhone}, {&USGEMail}, {&USGURL}}; //-------------------------------------------------------- // Business page, title // ATTR_MAP USBTitle = {IDC_TITLE, FALSE, FALSE, ATTR_LEN_UNLIMITED, {L"title", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // Business page, Company // ATTR_MAP USBCo = {IDC_COMPANY, FALSE, FALSE, 64, {L"company", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // Business page, Department // ATTR_MAP USBDept = {IDC_DEPARTMENT, FALSE, FALSE, 64, {L"department", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // Business page, office // ATTR_MAP USBOffice = {IDC_OFFICE, FALSE, FALSE, 128, {L"physicalDeliveryOfficeName", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // Business page, Manager // ATTR_MAP USBMgr = {IDC_MANAGER, TRUE, FALSE, ATTR_LEN_UNLIMITED, {L"manager", ADS_ATTR_UPDATE, ADSTYPE_DN_STRING, NULL, 0}, ManagerEdit, NULL}; // // Business page, direct reports // ATTR_MAP USBReports = {IDC_REPORTS_LIST, TRUE, TRUE, 0, {L"directReports", ADS_ATTR_UPDATE, ADSTYPE_DN_STRING, NULL, 0}, DirectReportsList, NULL}; // // The list of attributes on the User Business page. // PATTR_MAP rgpUSBAttrMap[] = {{&USBTitle}, {&USBCo}, {&USBDept}, {&USBOffice}, {&USBMgr}, {&USBReports}}; // // The User General page description. // DSPAGE ShellUserGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_USER_GEN, 0, 0, NULL, CreateTableDrivenPage, sizeof(rgpUSGAttrMap)/sizeof(PATTR_MAP), rgpUSGAttrMap}; // // The User Business page description. // DSPAGE ShellUserBusiness = {IDS_TITLE_BUSINESS, IDD_SHELL_BUSINESS, 0, 0, NULL, CreateTableDrivenPage, sizeof(rgpUSBAttrMap)/sizeof(PATTR_MAP), rgpUSBAttrMap}; #ifdef NT_GROUP_PAGE //---------------------------------------------- // Special User page, Home phone primary/other // ATTR_MAP USpecHomePhone = {IDC_HOMEPHONE_EDIT, FALSE, FALSE, 64, {L"homePhone", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; ATTR_MAP USpecHomeOther = {IDC_OTHER_HOME_BTN, FALSE, TRUE, 64, {L"otherHomePhone", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, OtherValuesBtn, NULL}; // // Special page, Pager // ATTR_MAP USpecPager = {IDC_PAGER_EDIT, FALSE, FALSE, 64, {L"pager", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; ATTR_MAP USpecOtherPager = {IDC_OTHER_PAGER_BTN, FALSE, TRUE, 64, {L"otherPager", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, OtherValuesBtn, NULL}; // // Special page, Mobile // ATTR_MAP USpecMobile = {IDC_MOBILE_EDIT, FALSE, FALSE, 64, {L"mobile", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; ATTR_MAP USpecOtherMobile = {IDC_OTHER_MOBLE_BTN, FALSE, TRUE, 64, {L"otherMobile", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, OtherValuesBtn, NULL}; // // Special page, user's home page // ATTR_MAP USpecURL = {IDC_HOME_PAGE_EDIT, FALSE, FALSE, 2048, {L"wWWHomePage", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // Special page, other home pages // ATTR_MAP USpecOtherURL = {IDC_OTHER_URL_BTN, FALSE, TRUE, 2048, {L"url", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, OtherValuesBtn, NULL}; // // Special page, Address // ATTR_MAP USpecAddress = {IDC_ADDRESS_EDIT, FALSE, FALSE, 1024, {L"homePostalAddress", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; // // Special page, Picture // ATTR_MAP USpecPicture = {IDC_PICTURE_BMP, TRUE, FALSE, 0, {L"thumbnailPhoto", ADS_ATTR_UPDATE, ADSTYPE_OCTET_STRING, NULL, 0}, BmpPictureCtrl, NULL}; // // The list of attributes on the User Special page. // PATTR_MAP rgpUSpecAttrMap[] = {{&USpecHomePhone}, {&USpecHomeOther}, {&USpecPager}, {&USpecOtherPager}, {&USpecMobile}, {&USpecOtherMobile}, {&USpecURL}, {&USpecOtherURL}, {&USpecAddress}, {&USpecPicture}}; // // The Special page description. // DSPAGE NTGroup = {IDS_NT_GRP_TITLE, IDD_NT_GROUP, 0, 0, NULL, CreateTableDrivenPage, sizeof(rgpUSpecAttrMap)/sizeof(PATTR_MAP), rgpUSpecAttrMap}; //---------------------------------------------- // The list of Special pages. // PDSPAGE rgShellUSpecPages[] = {{&NTGroup}}; // // The User Special class description. // DSCLASSPAGES ShellUSpecCls = {&CLSID_SpecialUserInfo, TEXT("User Special Info"), sizeof(rgShellUSpecPages)/sizeof(PDSPAGE), rgShellUSpecPages}; #endif // NT_GROUP_PAGE //---------------------------------------------- // The list of User pages. // PDSPAGE rgShellUserPages[] = {{&ShellUserGeneral}, {&UserAddress}, {&ShellUserBusiness}}; // // The User class description. // DSCLASSPAGES ShellUserCls = {&CLSID_DsShellUserPropPages, TEXT("User"), sizeof(rgShellUserPages)/sizeof(PDSPAGE), rgShellUserPages}; //------------------------------------------------------- // Contact object //------------------------------------------------------- // // The list of Contact pages. // PDSPAGE rgShellContactPages[] = {{&ShellUserGeneral}, {&ShellUserBusiness}}; // // The Contact class description. // DSCLASSPAGES ShellContactCls = {&CLSID_DsShellContactPropPages, TEXT("Contact"), sizeof(rgShellContactPages)/sizeof(PDSPAGE), rgShellContactPages}; //------------------------------------------------------- // Volume object //------------------------------------------------------- // // Volume page, path // ATTR_MAP VSPath = {IDC_PATH, FALSE, FALSE, ATTR_LEN_UNLIMITED, {L"uNCName", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL, NULL}; ATTR_MAP VolKey = {IDC_KEYWORDS_LIST, TRUE, TRUE, 0, {L"keywords", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, ROList, NULL}; // // The list of attributes on the Volume General page. // PATTR_MAP rgpVSAttrMap[] = {{&GenIcon}, {&AttrName}, {&Description}, {&VSPath}, {&VolKey}}; // // The Volume General page description. // DSPAGE ShellVolumeGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_VOLUME_GEN, 0, 0, NULL, CreateTableDrivenPage, sizeof(rgpVSAttrMap)/sizeof(PATTR_MAP), rgpVSAttrMap}; //---------------------------------------------- // The list of Volume pages. // PDSPAGE rgShellVolumePages[] = {{&ShellVolumeGeneral}}; // // The Volume class description. // DSCLASSPAGES ShellVolumeCls = {&CLSID_DsShellVolumePropPages, TEXT("Volume"), sizeof(rgShellVolumePages)/sizeof(PDSPAGE), rgShellVolumePages}; // //----------------------------------------------- // computer object //---------------------------------------------- // // Computer General page, Network Address. // //ATTR_MAP CSComputerNetAddr = {IDC_NET_ADDR_EDIT, FALSE, FALSE, 256, // {L"networkAddress", ADS_ATTR_UPDATE, // ADSTYPE_CASE_IGNORE_STRING, NULL, 0}, NULL}; // // Computer General page, Role. // ATTR_MAP CSComputerRoleAttr = {IDC_ROLE, TRUE, FALSE, 260, {g_wzUserAccountControl, ADS_ATTR_UPDATE, ADSTYPE_INTEGER, NULL, 0}, ShComputerRole, NULL}; // // The list of attributes on the Computer General page. // PATTR_MAP rgpCSAttrMap[] = {{&GenIcon}, {&AttrName}, {&Description}, // {&CSComputerNetAddr}, {&CSComputerRoleAttr}}; // // The Computer General page description. // DSPAGE ShellComputerGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_COMPUTER_GEN, 0, 0, NULL, CreateTableDrivenPage, sizeof(rgpCSAttrMap)/sizeof(PATTR_MAP), rgpCSAttrMap}; //---------------------------------------------- // The list of Computer pages. // PDSPAGE rgShellComputerPages[] = {{&ShellComputerGeneral}}; // // The Computer class description. // DSCLASSPAGES ShellComputerCls = {&CLSID_DsShellComputerPropPages, TEXT("Computer"), sizeof(rgShellComputerPages)/sizeof(PDSPAGE), rgShellComputerPages}; //---------------------------------------------- // Domain object //---------------------------------------------- // // The list of attributes on the General page. // PATTR_MAP rgpDSAttrMap[] = {{&GenIcon}, {&AttrName}, {&Description}}; // // The Computer General page description. // DSPAGE ShellDomainGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_DOMAIN_GEN, 0, 0, NULL, CreateTableDrivenPage, sizeof(rgpDSAttrMap)/sizeof(PATTR_MAP), rgpDSAttrMap}; //---------------------------------------------- // The list of Domain pages. // PDSPAGE rgShellDomainPages[] = {{&ShellDomainGeneral}}; // // The Domain class description. // DSCLASSPAGES ShellDomainCls = {&CLSID_DsShellDomainPropPages, TEXT("Domain"), sizeof(rgShellDomainPages)/sizeof(PDSPAGE), rgShellDomainPages}; //---------------------------------------------- // OU object //---------------------------------------------- // // The list of attributes on the OU General page. // PATTR_MAP rgpOSAttrMap[] = {{&GenIcon}, {&AttrName}, {&Description}}; // // The OU General page description. // DSPAGE ShellOUGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_DOMAIN_GEN, 0, 0, NULL, CreateTableDrivenPage, sizeof(rgpOSAttrMap)/sizeof(PATTR_MAP), rgpOSAttrMap}; //---------------------------------------------- // The list of OU pages. // PDSPAGE rgShellOUPages[] = {{&ShellOUGeneral}}; // // The OU class description. // DSCLASSPAGES ShellOUCls = {&CLSID_DsShellOUPropPages, TEXT("OU"), sizeof(rgShellOUPages)/sizeof(PDSPAGE), rgShellOUPages}; //---------------------------------------------- // Group object //---------------------------------------------- // // The Group General page description. // DSPAGE ShellGroupGeneral = {IDS_TITLE_GENERAL, IDD_SHELL_GROUP_GEN, 0, 0, NULL, CreateGrpShlGenPage, 0, NULL}; //---------------------------------------------- // The list of Group pages. // PDSPAGE rgShellGroupPages[] = {{&ShellGroupGeneral}}; // // The Group class description. // DSCLASSPAGES ShellGroupCls = {&CLSID_DsShellGroupPropPages, TEXT("Group"), sizeof(rgShellGroupPages)/sizeof(PDSPAGE), rgShellGroupPages}; #ifdef NT_GROUP_PAGE //+---------------------------------------------------------------------------- // // Function: BmpPictureCtrl // // Synopsis: Fetches the bitmap from the user object Picture attribute // and draws it on the page. // //----------------------------------------------------------------------------- HRESULT BmpPictureCtrl(CDsPropPageBase * pPage, PATTR_MAP pAttrMap, PADS_ATTR_INFO pAttrInfo, LPARAM, PATTR_DATA pAttrData, DLG_OP DlgOp) { HWND hPicCtrl; PBYTE pb; CBmpPicCtrl * pPicCtrlObj; switch (DlgOp) { case fInit: pAttrData->pVoid = NULL; if (pAttrInfo == NULL) { return S_OK; } hPicCtrl = GetDlgItem(pPage->GetHWnd(), pAttrMap->nCtrlID); dspAssert(pAttrInfo->pADsValues != NULL); dspAssert(pAttrInfo->dwADsType == ADSTYPE_OCTET_STRING); dspAssert(pAttrInfo->dwNumValues == 1); dspAssert(pAttrInfo->pADsValues->dwType == ADSTYPE_OCTET_STRING); dspAssert(pAttrInfo->pADsValues->OctetString.dwLength > 0); dspAssert(pAttrInfo->pADsValues->OctetString.lpValue != NULL); // // Enforce the maximum size. // pb = pAttrInfo->pADsValues->OctetString.lpValue; PBITMAPINFO pBmpInfo; pBmpInfo = (PBITMAPINFO)((PBYTE)pb + sizeof(BITMAPFILEHEADER)); dspDebugOut((DEB_ITRACE, "Bitmap size: (%d, %d)\n", pBmpInfo->bmiHeader.biWidth, pBmpInfo->bmiHeader.biHeight)); #define MAX_PIC_SIZE 100 if ((pBmpInfo->bmiHeader.biWidth > MAX_PIC_SIZE) || (pBmpInfo->bmiHeader.biHeight > MAX_PIC_SIZE)) { LONG_PTR lStyle = GetWindowLongPtr(hPicCtrl, GWL_STYLE); lStyle &= ~(SS_BITMAP); lStyle |= SS_LEFT; SetWindowLongPtr(hPicCtrl, GWL_STYLE, lStyle); TCHAR szMsg[200]; wsprintf(szMsg, TEXT("Bitmap is too large (%d, %d)!"), pBmpInfo->bmiHeader.biWidth, pBmpInfo->bmiHeader.biHeight); SetWindowText(hPicCtrl, szMsg); dspDebugOut((DEB_ITRACE, "Bitmap too large! (%d, %d) max allowed.\n", MAX_PIC_SIZE, MAX_PIC_SIZE)); return S_OK; } // // Save the bitmap. // pb = (PBYTE)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, pAttrInfo->pADsValues->OctetString.dwLength); CHECK_NULL_REPORT(pb, pPage->GetHWnd(), return E_OUTOFMEMORY); memcpy(pb, pAttrInfo->pADsValues->OctetString.lpValue, pAttrInfo->pADsValues->OctetString.dwLength); // // Subclass the picture "static" control. // pPicCtrlObj = new CBmpPicCtrl(hPicCtrl, pb); CHECK_NULL_REPORT(pPicCtrlObj, pPage->GetHWnd(), return E_OUTOFMEMORY); pAttrData->pVoid = reinterpret_cast(pPicCtrlObj); break; case fOnDestroy: pPicCtrlObj = reinterpret_cast(pAttrData->pVoid); DO_DEL(pPicCtrlObj); break; } return S_OK; } //+---------------------------------------------------------------------------- // // Class: CBmpPicCtrl // // Synopsis: Icon control window subclass object, so we can paint a class- // specific icon. // //----------------------------------------------------------------------------- CBmpPicCtrl::CBmpPicCtrl(HWND hCtrl, PBYTE pb) : m_hCtrl(hCtrl), m_pbBmp(pb), m_pOldProc(NULL), m_hPal(NULL) { #ifdef _DEBUG strcpy(szClass, "CBmpPicCtrl"); #endif SetWindowLongPtr(hCtrl, GWLP_USERDATA, (LONG_PTR)this); m_pOldProc = (WNDPROC)SetWindowLongPtr(hCtrl, GWLP_WNDPROC, (LONG_PTR)StaticCtrlProc); m_hDlg = GetParent(hCtrl); } CBmpPicCtrl::~CBmpPicCtrl(void) { SetWindowLongPtr(m_hCtrl, GWLP_WNDPROC, (LONG_PTR)m_pOldProc); if (m_pbBmp) { GlobalFree(m_pbBmp); } if (m_hPal) { DeleteObject(m_hPal); } } //+---------------------------------------------------------------------------- // // Method: CBmpPicCtrl::StaticCtrlProc // // Synopsis: control sub-proc // //----------------------------------------------------------------------------- LRESULT CALLBACK CBmpPicCtrl::StaticCtrlProc(HWND hCtrl, UINT uMsg, WPARAM wParam, LPARAM lParam) { HRESULT hr; HDC hDC; HPALETTE hOldPal; UINT iChanged = 0; CBmpPicCtrl * pCCtrl = (CBmpPicCtrl*)GetWindowLongPtr(hCtrl, GWLP_USERDATA); dspAssert(pCCtrl != NULL); switch (uMsg) { case WM_PALETTECHANGED: if ((HWND)wParam == hCtrl) { break; } // Fall through: case WM_QUERYNEWPALETTE: dspDebugOut((DEB_ITRACE, "Got palette message.\n")); if (pCCtrl->m_hPal == NULL) { hr = pCCtrl->CreateBmpPalette(); CHECK_HRESULT(hr, return FALSE); } hDC = GetDC(hCtrl); if (hDC != NULL) { hOldPal = SelectPalette(hDC, pCCtrl->m_hPal, FALSE); iChanged = RealizePalette(hDC); SelectPalette(hDC, hOldPal, TRUE); RealizePalette(hDC); ReleaseDC(hCtrl, hDC); if (iChanged > 0 && iChanged != GDI_ERROR) { InvalidateRect(hCtrl, NULL, TRUE); } } return(iChanged); case WM_PAINT: if (!pCCtrl->OnPaint()) { return FALSE; } break; default: break; } return CallWindowProc(pCCtrl->m_pOldProc, hCtrl, uMsg, wParam, lParam); } //+---------------------------------------------------------------------------- // // Method: CBmpPicCtrl::OnPaint // // Synopsis: Paint the DS specified icon. // //----------------------------------------------------------------------------- LRESULT CBmpPicCtrl::OnPaint(void) { TRACE(CBmpPicCtrl,OnPaint); HRESULT hr = S_OK; HDC hDC = NULL; PAINTSTRUCT ps; HPALETTE hOldPal = NULL; if (m_hPal == NULL) { hr = CreateBmpPalette(); CHECK_HRESULT(hr, return FALSE); } hDC = BeginPaint(m_hCtrl, &ps); CHECK_NULL_REPORT(hDC, m_hDlg, return FALSE); if (m_hPal) { hOldPal = SelectPalette(hDC, m_hPal, FALSE); RealizePalette(hDC); } dspAssert(m_pbBmp != NULL); PBITMAPFILEHEADER pBmpFileHdr = (PBITMAPFILEHEADER)m_pbBmp; // Advance past the BITMAPFILEHEADER struct. // PBITMAPINFO pBmpInfo = (PBITMAPINFO)(m_pbBmp + sizeof(BITMAPFILEHEADER)); if (SetDIBitsToDevice(hDC, 0, 0, pBmpInfo->bmiHeader.biWidth, pBmpInfo->bmiHeader.biHeight, 0, 0, 0, pBmpInfo->bmiHeader.biHeight, m_pbBmp + pBmpFileHdr->bfOffBits, pBmpInfo, DIB_RGB_COLORS) == 0) { REPORT_ERROR(GetLastError(), m_hDlg); } if (m_hPal) { SelectPalette(hDC, hOldPal, TRUE); } EndPaint(m_hCtrl, &ps); return TRUE; } //+---------------------------------------------------------------------------- // // Function: CreateBmpPalette // // Synopsis: Creates the palette for the bitmap. // //----------------------------------------------------------------------------- HRESULT CBmpPicCtrl::CreateBmpPalette(void) { TRACE(CBmpPicCtrl,CreateBmpPalette); PBITMAPINFO pBmpInfo; pBmpInfo = (PBITMAPINFO)(m_pbBmp + sizeof(BITMAPFILEHEADER)); WORD nColors, cClrBits = pBmpInfo->bmiHeader.biBitCount; if (cClrBits == 1) cClrBits = 1; else if (cClrBits <= 4) cClrBits = 4; else if (cClrBits <= 8) cClrBits = 8; else if (cClrBits <= 16) cClrBits = 16; else if (cClrBits <= 24) cClrBits = 24; else cClrBits = 32; if (cClrBits >= 24) { // True color BMPs don't need explicit palettes. // return S_OK; } nColors = static_cast(1 << cClrBits); dspDebugOut((DEB_ITRACE, "Bitmap has %d colors.\n", nColors)); PLOGPALETTE plp = (PLOGPALETTE)LocalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof(LOGPALETTE) + sizeof (PALETTEENTRY) * nColors); CHECK_NULL_REPORT(plp, m_hDlg, return E_OUTOFMEMORY); plp->palVersion = 0x300; plp->palNumEntries = nColors; for (WORD i = 0; i < nColors; i++) { plp->palPalEntry[i].peBlue = pBmpInfo->bmiColors[i].rgbBlue; plp->palPalEntry[i].peGreen = pBmpInfo->bmiColors[i].rgbGreen; plp->palPalEntry[i].peRed = pBmpInfo->bmiColors[i].rgbRed; plp->palPalEntry[i].peFlags = 0; //PC_NOCOLLAPSE; } m_hPal = CreatePalette(plp); if (m_hPal == NULL) { REPORT_ERROR(GetLastError(), m_hDlg); return HRESULT_FROM_WIN32(GetLastError()); } LocalFree(plp); return S_OK; } #endif // NT_GROUP_PAGE HRESULT ROList(CDsPropPageBase * pPage, PATTR_MAP pAttrMap, PADS_ATTR_INFO pAttrInfo, LPARAM, PATTR_DATA, DLG_OP DlgOp) { if (DlgOp != fInit) { return S_OK; } if (pAttrInfo == NULL) { return S_OK; } dspAssert(pAttrInfo->pADsValues != NULL); for (DWORD i = 0; i < pAttrInfo->dwNumValues; i++) { SendDlgItemMessage(pPage->GetHWnd(), pAttrMap->nCtrlID, LB_ADDSTRING, 0, (LPARAM)pAttrInfo->pADsValues[i].CaseIgnoreString); } return S_OK; } //+---------------------------------------------------------------------------- // The list of classes. //----------------------------------------------------------------------------- PDSCLASSPAGES rgClsPages[] = { &ShellComputerCls, &ShellVolumeCls, &ShellUserCls, &ShellContactCls, &ShellDomainCls, &ShellGroupCls, &ShellOUCls, &ShellUSpecCls }; //+---------------------------------------------------------------------------- // The global struct containing the list of classes. //----------------------------------------------------------------------------- RGDSPPCLASSES g_DsPPClasses = {sizeof(rgClsPages)/sizeof(PDSCLASSPAGES), rgClsPages};