Avatar billede nubi19 Nybegynder
09. september 2003 - 21:48 Der er 17 kommentarer og
1 løsning

VC.NET / MFC - hvordan hulen fungerer dette

Jeg er gået fra BCB 4.0 til VC++.NET og er helt lost, jeg kan stadigvæk lave programmer ved at bruge windows api'en samt ANSI C++ men er der virkelig ingenting i VC++ til at smide f.eks. en knap på sit vindue (som i BCB hvor man lige kan "tegne" en knap) og hvad er MFC samt hvordan bruges det ?

Beklager de få point, men har lige brugt alle de andre, evt. kan besvareren få nogle flere på et senere tidspunkt såfremt vedkommende måtte ønske dette.
Avatar billede arne_v Ekspert
09. september 2003 - 21:52 #1
MFC = Microsoft Foundation Classes

Et yderst kraftfuædt bibliotek til mange ting.

Nyere BCB i Professional udgave har iøvrigt også MFC.
Avatar billede arne_v Ekspert
09. september 2003 - 21:56 #2
Der er en del materiale her:
  http://www.codeguru.com/cpp_mfc/index.shtml
Avatar billede arne_v Ekspert
09. september 2003 - 21:56 #3
Hvis du har VC++.NET hvorfor bruger du så ikke .NET WinForms i.s.f. MFC ?
Avatar billede nubi19 Nybegynder
09. september 2003 - 22:16 #5
Hmmm kan ik finde nogen .NET WinForms men kan ske det bare er mig der er et klummerhoved ?
Kigger lige på dine tutorials og siger mange tak =)
Avatar billede arne_v Ekspert
09. september 2003 - 22:21 #6
Jeg har ikke selv VC++.NET men prøv og led efter:

New Projects
Visual C++ Project
Windows Application eller Windows Form
Avatar billede nubi19 Nybegynder
09. september 2003 - 22:25 #7
Har kun disse:
ATL Project
ATL Server Project
ATL Server Web Service
Makefile Project
Managed C++ Application
Managed C++ Class Library
Managed C++ Empty Project
Managed C++ Web Service
MFC ActiveX Control
MFC Application
MFC DLL
Win32 Project

Win32 Projectet bruger WinMain etc.
Avatar billede nubi19 Nybegynder
09. september 2003 - 22:26 #8
Men hopper hen og sove nu så kan ik svare mere idag, endnu engang tak for din hjælp.
Avatar billede arne_v Ekspert
09. september 2003 - 22:27 #9
Prøv:

Managed C++ Application
Avatar billede jpk Nybegynder
10. september 2003 - 09:37 #10
Du skal lave et nyt projekt af typen "MFC Application".
Application Type:
- Single document = app med et framework der er forberedt til at håndtere et enkelt dokument ad gangen (fx et tekstbehandlingsprogram som Notepad)
- Multiple documents = app med et framework der er forberedt til at håndtere flere dokumenter ad gangen (fx et tekstbehandlingsprogram som Word)
- Dialog based = Et program hvor du har en dialog (form) som hovedvindue (fx som Windows Calculator)

MFC tilbyder et framework af typen document/view, hvilket betyder du kan holde dine data og dine views helt adskilt. Det giver muligheden for at tilføje/fjerne/ændre views helt uden indflydelse på din app's generelle struktur!

Hvis du vil hurtig igang, kan du prøve at lave en dialog baseret app, så vil du kunne se hvor let der kan tilføjes kontroller af forskellig salgs vha. drag/drop...

Smid fx en Edit Control på dialogen, højreklik og vælg Properties og giv den et id som fx IDC_MY_EDIT (eller lad det foreslåede id blive).
Hold Ctrl nede og dobbeltklik på Edit kontrollen ogt du vil se en dialogboks. Her kan du lave en membervariabel for kontrollen.
Vælg Category = Value og Variable type vil automatisk skifte til CString. Hvis du ønsker at bruge feltet til at vise andet end tekst (fx tal), kan du skifte typen til det passende.
Indtast et variabelnavn (Variable name) fx m_MyEdit og klik Finish.

Nu kan du bruge denne variabel til at ændre teksten i din edit.
Prøv fx at tilføje understående til din dialogs OnInitDialog metode lige efter linien "// TODO: Add extra initialization here"

m_MyEdit = "Hejsa";
UpdateData(false);

funktionen UpdateData sørger for, at alle dine members på dialogen bliver opdateret. Hvis du kalder den med "false" som argument, vil kontrollerne vise de data der er i variablerne. Hvis du derimod kalder den med "true" som argument, vil variablerne få værdierne der er indtastet i kontrollerne.

det smarte ved membervariabler er at du ikke behøver bruge kode som MyEdit->Caption = "Hejsa"; og heller ikke behøver bekymre dig om formatering til tekst.
Hvis du fx laver en member af typen double, kan du bare skrive:

m_MyEdit = 123.456;

eller med type COleDateTime, kan du fx:

m_MyEdit = COleDateTime::GetCurrentTime();

Du kan også lave variablen af typen Control, så får du et objekt der repræsenterer, nå ja, kontrollen...
Hvis du har laven din egen kontrol, som fx en specialisering af CEdit, kan du bare ændre typen af membervariablen og kontrollen bliver automatisk subclassed!
Altså istedet for det genererede:

CEdit m_Edit;

kan du bruge:

CMyEdit m_Edit

Og det er alt hvad du skal gøre for at ændre kontrollens type...
Avatar billede nubi19 Nybegynder
01. oktober 2003 - 16:02 #11
Undskyld jeg ikke har svaret, har haft så pokkers travlt i mit studie. Men tak for svaret alle sammen, da jpk er den eneste der har oprettet et svar får han pointene, er nogen utilfredse med det må i lige skrive så kyler jeg nogle point efter jer også.

Har forresten lige et kort spørgsmål: Kan man ikke tilføje ting til en group box, så når man flytter group box'en så flyttes tingene i den samtidig ? (i en dialog baseret mfc)
Avatar billede nubi19 Nybegynder
01. oktober 2003 - 21:29 #12
Hmmm jeg har nogle problemer med det skidt her :D

Hvordan gør jeg hvis jeg nu vil have et edit felt hvor man kun kan indtaste 1 tegn og det skal kun være tal ?
I BCB opsnappede jeg onKeyDown events og rodede med det der, men det kan jeg ik helt få til at virke (ingen onKeyDown event)
Avatar billede jpk Nybegynder
02. oktober 2003 - 10:00 #13
Skal feltet også kunne være tomt, eller SKAL der stå et tal mellem 1 og 9?
Avatar billede jpk Nybegynder
02. oktober 2003 - 10:09 #14
CEdit har en metode der hedder SetLimitText, den kan du bruge til at angive hvor mange tegn brugeren kan skrive i kontrollen.
Avatar billede jpk Nybegynder
02. oktober 2003 - 10:10 #15
Og så kal du iøvrigt krydse af ved "Number" for din Edit's properties, så tillader den kun, at der indtastes tal.
Avatar billede nubi19 Nybegynder
02. oktober 2003 - 13:05 #16
Hmm nu har jeg sat den til number, og det duer fint.
Men hvis jeg kalder SetLimitText(1); i OnInitDialog, så duer det ikke, hvorfor ?
Har prøvet med UpdataData efter SetLimitText, det hjalp ikke :/
Avatar billede jpk Nybegynder
02. oktober 2003 - 13:22 #17
Hmm, har lavet et eksempel og det virker fint:

En member i .h-filen:
CEdit m_NumberEdit;

// Og koden...
void CNumberEditDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT1, m_NumberEdit);
}

BOOL CNumberEditDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here
    m_NumberEdit.SetLimitText(1);
   
    return TRUE;  // return TRUE  unless you set the focus to a control
}
Avatar billede nubi19 Nybegynder
02. oktober 2003 - 13:28 #18
Ah det duer også nu, jeg havde bare sat den til det forkerte editfelt - ups :)
Takker for hjælpen
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis