Hvordan har du loadet din COM-component? Hvilken baseklasse har dit view? Jeg går ud fra COM-componenten er en ActiveX control..?
GetParent() i et view vil typisk returnere en pointer til det frame window der indeholder view'et, det du skal have fat i er ikke en parent, men et child.
Hvis du har fx har et view nedarvet fra CFormView, indeholdene din kontrol, kan du få en pointer til kontrollen med GetDlgItem.
Min view klasse er nedarvet fra CView. Det er ikke mig selv der loader COM komponenten det er containeren (kunne f.eks være word). Min kollega fandt en måde at hente menuen, men han kan ikke ændre i den - hvilket er vores mål! Følgende kode er brugt til at hente menuen (inde i OnActivate i CView klassen):
CMenu menu; menu.Attach(GetDocument()->GetDocTemplate()->m_menuinplaceserver); // Herunder kommer koden hvor menu'en bliver ændret // menu.ModifyMenu(...) bliver brugt til at ændre menuerne
- jeg har skrevet koden udfra "hukommelse", har muligvis ikke stavet alle funktionskald rtigtigt.
Har i selv lavet en klasse nedarvet fra CDocTemplate (eller CSingleDocTemplate/CMultiDocTemplate)? Hvor den så har en member kaldet m_menuinplaceserver?
for at svare på dit spørgsmål. Følgende kode givet (af wizard i VS når man laver en miniserver) i InitInstance (i nedarvningen fra CWinApp): CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CQMDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CQMView)); if (!pDocTemplate) return FALSE; pDocTemplate->SetServerInfo( IDR_SRVR_EMBEDDED, IDR_SRVR_INPLACE, RUNTIME_CLASS(CInPlaceFrame)); Når SetServerInfo kaldes sættes m_hMenuInplaceServer (ved at hente menuen man indirekte angiver ved argumentet IDR_SRVR_INPLACE til SetServerInfo).
vi fik has på menuerne ved at bruge følgende kode (som undgår CMenu, hvilket vi tilsyneladende ikke havde stort køre kort til :-D) : static bool bMenuSet = false; if(!bMenuSet) { bMenuSet = true; HMENU hMenu = GetDocument()->GetDocTemplate()->m_hMenuInPlaceServer; TraverseMenus(hMenu,0); }
void CQMView::TraverseMenus(HMENU hMenu, int level) { // Number of items int itemcount = GetMenuItemCount(hMenu);
// Loop through items, get info for each one. MENUITEMINFO mii; mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
for(int c = 0; c<itemcount; c++) { CString str=""; mii.dwTypeData = str.GetBuffer(256); mii.cch = str.GetAllocLength(); if(GetMenuItemInfo(hMenu, c, TRUE, &mii) != TRUE) continue; if( mii.fType != MFT_SEPARATOR) { // It's text - translate it (in this sample - sh is appended to each menu item...) mii.dwTypeData = strcat(mii.dwTypeData, "- sh"); SetMenuItemInfo(hMenu, c, TRUE, &mii); } if( mii.hSubMenu != 0) { TraverseMenus(mii.hSubMenu, level + 1); } } }
jpk - ellers tak for din interresse for problemet, jeg vil gerne gi' dig point hvis du ligger et svar..
ovenstående kode gennemgår alle menu punkter og tilføjer en tilfældig streng (- sh) til alle menupunkter for at vise at man kan "ændre dem uden problemer".
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.