C++ Gui programmieren?
Hallo an Alle!
Mein Vorhaben ist, eine kleine GUI mit ein wenig Text (Labels) in der GUI zu programmieren. Hat jemand eventuell eine Ahnung, wie ich komplett OHNE Hilfe von beispielsweise einer WinForm (.NET) eine GUI erstelle. Am besten auch nur mit Code und halt nicht mit einem grafischen Creator-Tool. Habe normale C++ Kenntnisse.
Mfg
6 Antworten
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.
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);
}
praktisch war das MFC . sollte nur das zeichnen verdeutlichen .
Visual studio hat das doch integriert das du da so eine vorlage hast wo du buttons auswählen kannst usw
Genau das möchte ich ja nicht machen. Ich will eine GUI ohne grafischem Creator-Tool erstellen.
Zwei Möglichkeiten:
- Unterstützung via Qt
- 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.
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ß.
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?