C++ Gui programmieren?

6 Antworten

So wie du es schreibst, klingt es so, als würdest du auch nach einer eher leichtgewichtigen Lösung suchen. In der Hinsicht könntest du dir Nana oder Nuklear anschauen.

Wenn du mit C++ komplexere GUI-Anwendungen bauen möchtest, nutze Qt oder vielleicht wxWidgets.

firstMark 
Fragesteller
 06.03.2021, 14:46

Danke für die Antwort. Ich werde es mir mal anschauen. Ich habe da aber noch eine zufällige Frage. Meines Wissens nach wurde Notepad++ in C++ programmiert. Weißt du eventuell mit welchem "Framework" Notepad++ programmiert wurde?

0
regex9  06.03.2021, 14:59
@firstMark

Für Notepad++ wurde die Windows API genutzt. So steht es auch auf deren Startseite:

Based on the powerful editing component  Scintilla, Notepad++ is written in C++ and uses pure Win32 API and STL which ensures a higher execution speed and smaller program size.

Quelle

1

zum Thema selber malen , hier mal ein beispiel

sieht dann wie unten aus , dazu brauchst du eine draw funktion die das objekt immer zeichnet , ein eventhandler damit du es anklicken kannst .

// CproCheckListView-Zeichnung

void CproCheckListView::OnDraw(CDC* pDC)
{
    CproCheckDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
/*
else
{

CMyFont.CreatePointFont(80,"Arial");
// Und neuen Zeichensatz selektieren
pDC->SelectObject(&CMyFont);
pDC->SetTextColor(RGB(0,0,255));
pDC->SetBkColor(RGB(255,255,255));
pDC->TextOut(recStatusColor.left,recStatusColor.bottom+5,szErrorText);
pDC->FillSolidRect(recStatusRot,recStatusRot);
}
*/

    // TODO: Code zum Zeichnen der systemeigenen Daten hinzufügen
        CproCheckApp* pApp = (CproCheckApp*) AfxGetApp();
    
            // Anzeige Layout
        int nMessStatus;
        int nErrorStatus;
        CString szErrorText;
        nMessStatus = REDSTATUS ;
        nErrorStatus = DEVERROR0;
        if (pApp->m_MessCtrl.m_CDeviceCtrl.m_bIsDevDllLoaded)
        {
        nMessStatus = YELLOWSTATUS ;
        nErrorStatus = DEVERROR2;
        if (pApp->m_MessCtrl.m_bDeviceConnected)
        {
        nMessStatus = YELLOWSTATUS ;
        nErrorStatus = DEVERROR2;
        if (pApp->m_MessCtrl.m_CDeviceCtrl.m_needcalli)
        {
        nMessStatus = YELLOWSTATUS ;
        nErrorStatus = DEVERROR2;
        }
        else
        {
        nMessStatus = GREENSTATUS ;
        nErrorStatus = DEVNOERROR;
        }
        }
        else
        {
        nMessStatus = REDSTATUS ;
        nErrorStatus = DEVERROR1;
        }
        }
        else
        {
        nMessStatus = REDSTATUS ;
        nErrorStatus = DEVERROR0;
        }
    
    int startleft,starttop;
    startleft=0;
    starttop=0;
    CRect recLayout(0,100,600,400);
    CRect recStatus(0,0,600,100);
    startleft+=600;
    CRect recStatusColor;
    CRect recStatusRot(startleft+10,10,startleft+110,50);
    CRect recStatusGelb(startleft+10,140,startleft+110,180);
    CRect recStatusGruen(startleft+10,270,startleft+110,310);

    COLORREF recColor,redColor,greenColor,yellowColor;
    redColor=RGB(255,0,0);
    greenColor=RGB(0,255,0);
    yellowColor=RGB(255,255,0);
    pDC->Draw3dRect(recStatus,RGB(255,255,255),RGB(0,0,0));
    // pDC->FillSolidRect(recStatus,RGB(100,100,100));
    pDC->Draw3dRect(recLayout,RGB(255,255,255),RGB(0,0,0));
    // pDC->FillSolidRect(recLayout,RGB(50,50,50));
    // pDC->Draw3dRect(recMessBTN,RGB(255,255,255),RGB(0,0,0));

    // StatusFLAG
    if (nMessStatus == REDSTATUS ) {
    recStatusColor = recStatusRot;
    recColor = redColor;
    if (nErrorStatus == DEVERROR1)
    {
    szErrorText = DEVERROR1TXT ;
    }
        if (nErrorStatus == DEVERROR0)
    {
    szErrorText = DEVERROR0TXT ;
    }
    }
    if (nMessStatus == YELLOWSTATUS ) {
    recStatusColor = recStatusGelb;
    recColor = yellowColor;
    if (nErrorStatus == DEVERROR2)
    {
    szErrorText = DEVERROR2TXT ;
    }
    if (nErrorStatus == DEVERROR3)
    {
    szErrorText = DEVERROR3TXT ;
    }
    }
    if (nMessStatus == GREENSTATUS ) {
    recStatusColor = recStatusGruen;
    recColor = greenColor;
    if (nErrorStatus == DEVNOERROR) {
    szErrorText = NODEVERROR1TXT;
    }
    }
        
        pDC->FillSolidRect(recStatusColor,recColor);

    // Error Text
    // Arial Zeichensatz in der Groesse 12pt erstellen
    CFont    CMyFont;
    CMyFont.CreatePointFont(80,"Arial");
    // Und neuen Zeichensatz selektieren
    pDC->SelectObject(&CMyFont);
    pDC->SetTextColor(RGB(0,0,255));
    pDC->SetBkColor(RGB(255,255,255));
    pDC->TextOut(recStatusColor.left,recStatusColor.bottom+5,szErrorText);

    CString ausgabe;
    ausgabe=_T("");

    // Parameter Default
    // Layout :
    pDC->SelectObject(&CMyFont);
    pDC->SetTextColor(RGB(0,0,255));
    pDC->SetBkColor(RGB(255,255,255));
    // m_proofCheck // misDefault
    ausgabe = pDoc->m_szDevice;
    pDC->TextOut(recStatus.left+10,recStatus.top+10,ausgabe);
        ausgabe = pDoc->m_szDrucker;
    pDC->TextOut(recStatus.left+10,recStatus.top+22,ausgabe);
        ausgabe = pDoc->m_szLayout;
    pDC->TextOut(recStatus.left+10,recStatus.top+34,ausgabe);
        ausgabe = pDoc->m_szBedingung;
    pDC->TextOut(recStatus.left+10,recStatus.top+46,ausgabe);
        ausgabe = pDoc->m_szFileName;
    pDC->TextOut(recStatus.left+10,recStatus.top+58,ausgabe);
        ausgabe = pDoc->m_szFileName;
    pDC->TextOut(recStatus.left+10,recStatus.top+58,ausgabe);
    ausgabe.Format("Patch: ID:%.2d  X:%.2d  Y:%.2d ",pApp->m_MessCtrl.GetAktivePatchID(),pApp->m_MessCtrl.GetAktiveColumn(),pApp->m_MessCtrl.GetAktiveRow());
    pDC->TextOut(recStatus.left+10,recStatus.top+70,ausgabe);

    
    
    // MK Auswertung :
    CRect recAuswert(300,0,600,100);
    ausgabe = _T("Durchschnitt :");
    pDC->TextOut(recAuswert.left+10,recAuswert.top+10,ausgabe);
    ausgabe = _T("Maximalwert :");
    pDC->TextOut(recAuswert.left+10,recAuswert.top+22,ausgabe);
    ausgabe = _T("Primärfarbe :");
    pDC->TextOut(recAuswert.left+10,recAuswert.top+34,ausgabe);
    ausgabe = _T("Bedruckstoff :");
    pDC->TextOut(recAuswert.left+10,recAuswert.top+46,ausgabe);
    ausgabe = _T("Norm wurde eingehalten :");
    pDC->TextOut(recAuswert.left+10,recAuswert.top+70,ausgabe);
    // SollWerte
    ausgabe.Format("%.2f",pDoc->m_Durch.m_dSchwellwert);
    pDC->TextOut(recAuswert.left+80,recAuswert.top+10,ausgabe);
    ausgabe.Format("%.2f",pDoc->m_Maximal.m_dSchwellwert);
    pDC->TextOut(recAuswert.left+80,recAuswert.top+22,ausgabe);
    ausgabe.Format("%.2f",pDoc->m_Primaer.m_dSchwellwert);
    pDC->TextOut(recAuswert.left+80,recAuswert.top+34,ausgabe);
    ausgabe.Format("%.2f",pDoc->m_Bedruck.m_dSchwellwert);
    pDC->TextOut(recAuswert.left+80,recAuswert.top+46,ausgabe);

    // IstWerte
    ausgabe.Format("%.2f",pDoc->m_Durch.m_dIstWert);
    pDC->TextOut(recAuswert.left+110,recAuswert.top+10,ausgabe);
    ausgabe.Format("%.2f",pDoc->m_Maximal.m_dIstWert);
    pDC->TextOut(recAuswert.left+110,recAuswert.top+22,ausgabe);
    ausgabe.Format("%.2f",pDoc->m_Primaer.m_dIstWert);
    pDC->TextOut(recAuswert.left+110,recAuswert.top+34,ausgabe);
    ausgabe.Format("%.2f",pDoc->m_Bedruck.m_dIstWert);
    pDC->TextOut(recAuswert.left+110,recAuswert.top+46,ausgabe);
    CString zallOK;
    zallOK=_T("OK");
    // OK
    if (pDoc->m_Durch.m_bIsOk)
    {
        ausgabe ="OK";
    }
    else
    {
        ausgabe=zallOK="WRONG";
    }

    pDC->TextOut(recAuswert.left+170,recAuswert.top+10,ausgabe);

    if (pDoc->m_Maximal.m_bIsOk)
    {
        ausgabe ="OK";
    }
    else
    {
        ausgabe=zallOK ="WRONG";
    }
    pDC->TextOut(recAuswert.left+170,recAuswert.top+22,ausgabe);

    if (pDoc->m_Primaer.m_bIsOk)
    {
        ausgabe ="OK";
    }
    else
    {
        ausgabe=zallOK ="WRONG";
    }
    pDC->TextOut(recAuswert.left+170,recAuswert.top+34,ausgabe);

    if (pDoc->m_Bedruck.m_bIsOk)
    {
        ausgabe ="OK";
    }
    else
    {
        ausgabe=zallOK ="WRONG";
    }

    pDC->TextOut(recAuswert.left+170,recAuswert.top+46,ausgabe);
    ausgabe = zallOK;
    pDC->TextOut(recAuswert.left+170,recAuswert.top+70,ausgabe);
    // Layout

    pDoc->paCMK[MKLAYOUT].drawChartDigital(pDC,590,390,recLayout.top+5,recLayout.left+5);
    pDoc->paCMK[MKMESSUNG].drawChartMessure(pDC,590,390,recLayout.top+5,recLayout.left+5);
    
    
    
    // ON TOP
    pApp->m_MessCtrl.ShowAktivPatchPos(pDC,recLayout.top+5,recLayout.left+5);

}
regex9  06.03.2021, 21:52

Es sollte erwähnt werden, dass dieses Beispiel die Win32 API verwendet.

1
TechPech1984  06.03.2021, 22:15
@regex9

praktisch war das MFC . sollte nur das zeichnen verdeutlichen .

0

Visual studio hat das doch integriert das du da so eine vorlage hast wo du buttons auswählen kannst usw

Woher ich das weiß:Hobby – Programmiere seid 6 Jahren Modifikationen für Spiele
TechPech1984  06.03.2021, 14:37

genau das will er ja nicht . er will selber machen .

1
firstMark 
Fragesteller
 06.03.2021, 14:40

Genau das möchte ich ja nicht machen. Ich will eine GUI ohne grafischem Creator-Tool erstellen.

0

Zwei Möglichkeiten:

  1. Unterstützung via Qt
  2. Ohne Unterstützung direkt in die API, bei Windows z.B. über die WIN32API (oder wenn es etwas moderneres gibt) bzw. bei Linux GTK oder ggf. noch direkter.
Woher ich das weiß:eigene Erfahrung – Hobby und teilweise beruflich

Unter Windows wirst du dafür vermutlich die Win32-API nutzen wollen.

Damit kannst du leicht GUI-Anwendungen ohne weitere Abhängigkeiten oder Ressourcendateien direkt im Code zusammenbauen.

Ein Hello-World mit GUI ist dann nur wenige KB groß.

Woher ich das weiß:Berufserfahrung