Avatar billede sovsekoder Nybegynder
09. juni 2004 - 22:56 Der er 6 kommentarer og
1 løsning

pointer til menu i In-place komponent

Jeg har loadet en in-place COM komponent (modulet) i en container. Jeg vil nu gerne hente en pointer til menu'en i modulet, hvordan gør jeg dette?

det virker ikke med
CMenu *m_pMenu = GetParent()->GetMenu() i CView klassen.

nogle ideer ?
Avatar billede jpk Nybegynder
10. juni 2004 - 09:09 #1
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.
Avatar billede sovsekoder Nybegynder
10. juni 2004 - 10:58 #2
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.
Avatar billede jpk Nybegynder
11. juni 2004 - 08:18 #3
Har i selv lavet en klasse nedarvet fra CDocTemplate (eller CSingleDocTemplate/CMultiDocTemplate)?
Hvor den så har en member kaldet m_menuinplaceserver?

I så fald, hvordan initialiseres den?
Avatar billede sovsekoder Nybegynder
11. juni 2004 - 17:34 #4
fik løst problemet... :

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).
Avatar billede sovsekoder Nybegynder
11. juni 2004 - 17:37 #5
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..
Avatar billede sovsekoder Nybegynder
11. juni 2004 - 17:39 #6
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".
Avatar billede jpk Nybegynder
01. juli 2004 - 17:19 #7
Havde ikke set din kommentar med point'ene...
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester