Avatar billede borrisholt Novice
15. marts 2001 - 08:18 Der er 12 kommentarer og
1 løsning

Dynamisk MFC

Hej NG

Jeg skal bruge nogle MFC eksempler der opretter sine kontroller dynamisk. DVS den bruger IKKE sin Windows Resource til at gemme placering etc i.

Eksempler kan Sendes til Jens@Borrisholt.com

Links kan offenliggøres her.

Jens B
Avatar billede wisen Nybegynder
15. marts 2001 - 08:19 #1
Øhh, jeg er ikke helt med, er det placering at kontroller du mangler eller hvad ?
Avatar billede jpk Nybegynder
15. marts 2001 - 08:22 #2
CRect rectStaticID(0, 0, 200, 100);
CStatic* staticfield = new CStatic;
staticfield->Create(fmt, WS_CHILD | WS_VISIBLE, rectStaticID, this, 10000);
Avatar billede wisen Nybegynder
15. marts 2001 - 08:23 #3
Vil du slet ikke bruge ressourceeditoren ?
Avatar billede jpk Nybegynder
15. marts 2001 - 08:24 #4
Du kan bruge samme fremgangsmåde til de forskellige kontroller...
Det du blot skal gøre er, at kalde deres Create-metode!
Avatar billede borrisholt Novice
15. marts 2001 - 08:27 #5
Wisen Jeg vil ikke bruge ressourceeditoren, fordi jeg skal bruge MFC i en meget Dynamisk verden. Jeg skal hente en masse ting ud af nogle DATABASER og så lave et skærmbillede der ud fra .... Derfor går det ikke at man ligger kontrollerne ned i en Windows Resource.

De 30 points er sat som noget tilfældigt, folg og fæ(?) vil blive belønnet efter deres indsats.

Jens B
Avatar billede borrisholt Novice
15. marts 2001 - 08:28 #6
Jeg er meget intresseret i nogle lidt stører eksemplet ...

Jens B
Avatar billede wisen Nybegynder
15. marts 2001 - 08:35 #7
Hvis du nu i ressourceeditoren laver dialogen og sætter en/flere \"picture\" kontroller ind, og laver dem non-visible, så kan du bruge dem til at placere din kontroller. f.eks :

CTabCtrl* ptabCtrl = new CTabCtrl;
CRect rect;
GetDlgItem(IDC_PICTUREFRAME)->GetWindowRect(&rect);
ScreenToClient(&rect);
DWORD style = (TCS_TABS | TCS_FIXEDWIDTH | TCS_TOOLTIPS | WS_CLIPCHILDREN | WS_TABSTOP);
ptabCtrl->Create(style, rect, this, 0x0001);

Det giver dig en tabkontrol med samme størrelse og placering som den picturekontrol på dialogen som hedder IDC_PICTUREFRAME...

Kan det bruges ?
Avatar billede jpk Nybegynder
15. marts 2001 - 08:35 #8
ok, større eksempler...
Her har jeg hentet oplysninger fra en DB på en server, via RPC, og viser dem så i et view.

void CGFoodView::LavSkema(RpcRaavarekatalog& katalog)
{
    // Det gamle skema slettes
    NedlaegSkema();

    CRect rect;
    GetClientRect(&rect);
    SetScrollSizes(MM_TEXT, CSize(0, rect.Height()+1));
    ScrollArea=30;
    UINT    StaticID=1500;
    UINT    EditID=2000;

    // Det nye skema til indtastning og aflæsning af værdier opbygges
    // Det sker ved at der dynamisk oprettes static- og edit-felter
    // og en pointer til hver gemmes i STL vektorer
    CRect rectStatic(100, 98+ScrollArea, 670, 122+ScrollArea);
    CStatic* staticfield = new CStatic;
    staticfield->Create(\"Tilsætn.ID        Tilsætningsstof\\t          Min\\t    Max\\t            Optimal\", WS_CHILD | WS_VISIBLE | WS_BORDER, rectStatic, this, StaticID);
    ScrollArea += 30;

    CString Extra[] = {\"Protein(g)\", \"Calcium(g)\", \"Fosfor(g)\", \"Natrium(g)\"};
    for(int i=0; i<TILSAETNINGSSTOFFER; ++i)
    {
        CString fmt;
        fmt.Format(\"%d\", i+1000);

        CRect rectStaticID(100, 98+ScrollArea, 200, 122+ScrollArea);
        CStatic* staticfield = new CStatic;
        staticfield->Create(fmt, WS_CHILD | WS_VISIBLE, rectStaticID, this, StaticID++);
        staticIdVector.push_back(staticfield);

        CRect rectStatic(200, 98+ScrollArea, 670, 122+ScrollArea);
        staticfield = new CStatic;
        staticfield->Create(Extra[i], WS_CHILD | WS_VISIBLE, rectStatic, this, StaticID++);
        staticVector.push_back(staticfield);

        CRect rectMin(400, 100+ScrollArea, 465, 120+ScrollArea);
        CNumEdit* editfield = new CNumEdit;
        editfield->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_RIGHT, rectMin, this, EditID++);
        editfield->SetWindowText(\"0.0000\");
        editVector.push_back(editfield);

        CRect rectMax(500, 100+ScrollArea, 565, 120+ScrollArea);
        editfield = new CNumEdit;
        editfield->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_RIGHT, rectMax, this, EditID++);
        editfield->SetWindowText(\"100.0000\");
        editVector.push_back(editfield);

        CRect rectStaticOpt(600, 100+ScrollArea, 665, 120+ScrollArea);
        staticfield = new CStatic;
        staticfield->Create(\"\", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, rectStaticOpt, this, StaticID++);
        staticOptVector.push_back(staticfield);

        ScrollArea += 30;
    }

    ScrollArea += 30;
    CRect rectStatic2(100, 98+ScrollArea, 670, 122+ScrollArea);
    CStatic* staticfield2 = new CStatic;
    staticfield2->Create(\"RåvareID          Råvare\\t\\t          Min\\t    Max\\t            Optimal\", WS_CHILD | WS_VISIBLE | WS_BORDER, rectStatic2, this, StaticID);
    ScrollArea += 30;

    for(i=0; i<katalog.AntalRaavarer(); ++i)
    {
        CString id;
        id.Format(\"%d\", katalog[i].GetRaavareID());

        CRect rectStaticID(100, 98+ScrollArea, 200, 122+ScrollArea);
        CStatic* staticfield = new CStatic;
        staticfield->Create(id, WS_CHILD | WS_VISIBLE, rectStaticID, this, StaticID++);
        staticIdVector.push_back(staticfield);

        CRect rectStatic(200, 98+ScrollArea, 670, 122+ScrollArea);
        staticfield = new CStatic;
        staticfield->Create(katalog[i].GetRaavarenavn(), WS_CHILD | WS_VISIBLE, rectStatic, this, StaticID++);
        staticVector.push_back(staticfield);

        CRect rectMin(400, 100+ScrollArea, 465, 120+ScrollArea);
        CNumEdit* editfield = new CNumEdit;
        editfield->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_RIGHT, rectMin, this, EditID++);
        editfield->SetWindowText(\"0.0000\");
        editVector.push_back(editfield);

        CRect rectMax(500, 100+ScrollArea, 565, 120+ScrollArea);
        editfield = new CNumEdit;
        editfield->Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP | ES_RIGHT, rectMax, this, EditID++);
        editfield->SetWindowText(\"100.0000\");
        editVector.push_back(editfield);

        CRect rectStaticOpt(600, 100+ScrollArea, 665, 120+ScrollArea);
        staticfield = new CStatic;
        staticfield->Create(\"\", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, rectStaticOpt, this, StaticID++);
        staticOptVector.push_back(staticfield);

        ScrollArea += 30;
    }
    ScrollArea += 30;
    //Felter til FE og Pris
    CString Result[] = {\"Foderenheder i blanding\", \"Pris pr. kg\"};
    for(i=0; i<2; ++i)
    {
        CRect rectStatic(100, 98+ScrollArea, 670, 122+ScrollArea);
        staticfield = new CStatic;
        staticfield->Create(Result[i], WS_CHILD | WS_VISIBLE | WS_BORDER, rectStatic, this, StaticID++);
        staticVector.push_back(staticfield);

        CRect rectStaticNum(600, 100+ScrollArea, 665, 120+ScrollArea);
        staticfield = new CStatic;
        staticfield->Create(\"\", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, rectStaticNum, this, StaticID++);
        staticOptVector.push_back(staticfield);

        ScrollArea += 30;
    }

    // Der sættes fokus i det første felt
    editVector[0]->SetFocus();

    // Det scrollbare område opdateres efter skemaets størrelse
    ScrollArea += 200;
    CRect ScrollRect;
    GetClientRect(&ScrollRect);
    if(ScrollRect.Height()+1 > ScrollArea)
        ScrollArea = ScrollRect.Height()+1;
    SetScrollSizes(MM_TEXT, CSize(0, ScrollArea));
}
Avatar billede borrisholt Novice
15. marts 2001 - 09:53 #9
hvad med en MENU er der nogen der ka hjælpe med det .. Alåst at lave en og sætte den på ...

Jens B
Avatar billede jpk Nybegynder
15. marts 2001 - 09:57 #10
Du kan bruge CreateMenu, AppendMenu, InsertMenu, ModifyMenu og RemoveMenu (CMenu)...
Avatar billede borrisholt Novice
15. marts 2001 - 10:10 #11
Hmmn .. Lidt mere hjælp er vist nødvendigt .. (Jeg er ny i MFC verden)

Jeg har der følgende :

void CMainWindow::CreateMenu()
{
  // Remove and destroy old menu
  CMenu *MainMenu;
  SetMenu(NULL);
  MainMenu = new CMenu();
  MainMenu->CreateMenu();
 
  CMenu *FileMenu = new CMenu(); 
  FileMenu->CreatePopupMenu();

  FileMenu->AppendMenu(MF_STRING, ID_APP_EXIT, (LPCTSTR)\"E&xit\");
  MainMenu->AppendMenu(MF_POPUP, (UINT) FileMenu->m_hMenu, \"&File\");

  SetMenu(MainMenu);

  // Assign default menu
  m_hMenuDefault = MainMenu->m_hMenu;
}


Lige for en god ordensskyld så er  CMainWindow en nedarvning af CFrameWnd (class CMainWindow : public CFrameWnd) så det burde være i orden ....

Jens B
Avatar billede moykal Nybegynder
15. marts 2001 - 11:15 #12
Jeg har - indtil for ca. et års tid siden været med til at lave en app, hvor vi også var ret dynamiske... og hvis du vil have gode hints om, hvad der i forvejen er lavet af folk derude, så kig på www.codeguru.com. Der er en masse. Har du overvejet at anvende WTL? Eller vil du have en applikation, der uden grund fylder 5 MB? Kontrollerne i WTL (en del af platform SDK\'et) hedder nøjagtigt det samme som i MFC. WTL er blot en overbygning på ATL. Og der er ikke de samme trådnings-problemer som i MFC. Læs mere om WTL på:

http://www.develop.com/dm/dev_resources.asp
Avatar billede borrisholt Novice
19. marts 2001 - 16:15 #13
jpk >> Held lige mig en e-mail på Jens@Borrisholt.com

Jens B
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