Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: MFC (Visual C++) ::  Schriftfarbe von Buttons ändern     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 12:36:23 28.02.2010   Titel:   Schriftfarbe von Buttons ändern            Zitieren

Hi,
wie kann ich die Schriftfarbe von einzelnen Buttons verändern?
Hab lange gesucht, doch nichts hat funktioniert.
Bitte mit Beschreibbung, wo der Code einzugeben ist.
Danke
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 15:05:03 28.02.2010   Titel:              Zitieren

Google hätte dir auch Antworten auf deine Frage gegeben. Aber na ja wenn man selber nicht Suchen kann lässt man anderen das machen, bzw die Antwort geben.

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
.h:
CFont m_Font;
//.cpp:
LOGFONT lf;
    ::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
   
    CClientDC dc(this);
    strcpy(lf.lfFaceName, "times new roman");
    lf.lfHeight = -MulDiv(13, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);
   
    m_Font.CreateFontIndirect(&lf);
    m_Button.SetFont(&m_Font);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
.h:
CFont m_Font;
//.cpp:
LOGFONT lf;
::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);

CClientDC dc(this);
strcpy(lf.lfFaceName, "times new roman");
lf.lfHeight = -MulDiv(13, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);

m_Font.CreateFontIndirect(&lf);
m_Button.SetFont(&m_Font);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
.h:
CFont m_Font;
//.cpp:
LOGFONT lf;
    ::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
   
    CClientDC dc(this);
    strcpy(lf.lfFaceName, "times new roman");
    lf.lfHeight = -MulDiv(13, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);
   
    m_Font.CreateFontIndirect(&lf);
    m_Button.SetFont(&m_Font);


Dabei muß m_Font ein Member deiner Windowklasse sein, also kannst du nicht lokal in der Funktion erstellen, weil die sonnst wieder weg ist wenn die Funktion beendet ist. Ales klar?
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 21:33:57 28.02.2010   Titel:              Zitieren

Nee nix klar....

Wo soll ich das jetzt einfügen?

In der WinMain?
Oder WinForms?
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 23:13:54 28.02.2010   Titel:              Zitieren

WinForms bist du dir sicher dasd du MFC benutzt oder doch nicht .net? wenn du .net benutzt is das mal so das falsche Forum dann solltest du dich mal nach cli/.net verschieben lassen. an sonnsten gehört das natürlich in die mainframe-klasse also da wo du dein Button generierst.
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 16:00:33 04.03.2010   Titel:              Zitieren

Der mit dem WinForms war ein anderer Typ, der sich so genannt hat wie ich....
CTecS schrieb:
Google hätte dir auch Antworten auf deine Frage gegeben. Aber na ja wenn man selber nicht Suchen kann lässt man anderen das machen, bzw die Antwort geben.

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
.h:
CFont m_Font;
//.cpp:
LOGFONT lf;
    ::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
   
    CClientDC dc(this);
    strcpy(lf.lfFaceName, "times new roman");
    lf.lfHeight = -MulDiv(13, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);
   
    m_Font.CreateFontIndirect(&lf);
    m_Button.SetFont(&m_Font);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
.h:
CFont m_Font;
//.cpp:
LOGFONT lf;
::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);

CClientDC dc(this);
strcpy(lf.lfFaceName, "times new roman");
lf.lfHeight = -MulDiv(13, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);

m_Font.CreateFontIndirect(&lf);
m_Button.SetFont(&m_Font);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
.h:
CFont m_Font;
//.cpp:
LOGFONT lf;
    ::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
   
    CClientDC dc(this);
    strcpy(lf.lfFaceName, "times new roman");
    lf.lfHeight = -MulDiv(13, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72);
   
    m_Font.CreateFontIndirect(&lf);
    m_Button.SetFont(&m_Font);


Dabei muß m_Font ein Member deiner Windowklasse sein, also kannst du nicht lokal in der Funktion erstellen, weil die sonnst wieder weg ist wenn die Funktion beendet ist. Ales klar?

Also ich hab sowas schon gefunden, allerdings nutze ich einerseits Dialog, da gibts ja kein Mainframe und wenn ichs unter CXXXDLG packen will, klappts allerdins auch nicht...
Ich bin total neu in Visual studio und kapier einfach nie, wo ich was eingeben muss, hab vorher einfach mit dev-cpp gearbeitet, da gabs sowas mit ressourcen garnicht....
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 18:00:26 04.03.2010   Titel:              Zitieren

den teil von .cpp packst du einfach in die Oninit() deines Dialoges, und m_Button ist eine Membervariable vom Typ CButton auf den Button der den Font bekommen soll
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 23:45:22 09.03.2010   Titel:              Zitieren

dann kommt noch folgender fehler:
Zitat:
error C2664: 'strcpy': Konvertierung des Parameters 1 von 'WCHAR [32]' in 'char *' nicht möglich

habs leider nicht hinbekommen, das richtigzu machen.
kann mir bitte noch einmal geholfen werden ? o:)
Danke
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13513
Beitrag Martin Richter Moderator 09:18:33 10.03.2010   Titel:              Zitieren

Du hast ein Unicode/MBS Problem.
Deine Windows API Lib wil alles in Unicode (wchar_t) aber Du lieferst MBCS (char)!
Benutze TCHAR, das geht immer.

C/C++ Code:
_tcscpy(lf.lfFaceName, _T("times new roman"));
C/C++ Code:
_tcscpy(lf.lfFaceName, _T("times new roman"));
C/C++ Code:
_tcscpy(lf.lfFaceName, _T("times new roman"));


PS: Diese Frage beantworten wir hier in jeder dritten Positing.

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 16:28:03 10.03.2010   Titel:              Zitieren

danke,
nun ändert sich zwar der font, aber die farbe nun doch nicht.
ich dachte ich könnte nun einfach ne zeile hinzufügen die das tut, ist aber nicht so
wie änder ich denn nun die farbe?
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13513
Beitrag Martin Richter Moderator 16:46:20 10.03.2010   Titel:              Zitieren

Dir Farbe ändert man nicht mit dem Font, sondern durch Behandlung von WM_CTLCOLORBTN (aber Achtung, es geht nicht alles).
http://msdn.microsoft.com/en-us/library/bb761849(VS.85).aspx

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 21:17:53 10.03.2010   Titel:              Zitieren

also war alles vorher umsonst? :/
kannst du auch da mal sagen wo ich das hinschreiben muss, am besten mit beispiel?
Danke
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13513
Beitrag Martin Richter Moderator 21:34:48 10.03.2010   Titel:              Zitieren

Du behandelst die Nachricht im Parent. Oder Du benutzt Reflection.
CWnd::OnCtlColor http://msdn.microsoft.com/de-de/library/0wwk06hc(VS.80).aspx
TN062 http://msdn.microsoft.com/en-us/library/eeah46xd(VS.71).aspx

Du findest genug Code und Diskussionen darüber auch in diesem Forum.

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 18:10:46 11.03.2010   Titel:              Zitieren

Hö, ich brauch das wirklich genauer
bin mit meinem programm fertig, bis auf die blöde farbe und ich check da wirklich rein garnichts.
sorry für die blöden fragen, aber ich kapier das ganze hier mit nicht, ich brauch mal ein Bsp hiervon:
Zitat:
WM_CTLCOLORBTN

WPARAM wParam
LPARAM lParam;

was bedeutet dieses WPARAM wParam , LPARAM lParam;
finde nichts dazu und weis auch nicht wie ich das bei mir anwenden kann.
wenn ich zb eine einfach rote schrit auf meinem button haben möchte, auf dem zb die zahl "1" steht, wie mach ich das jetztß
suche schon ewig danach, wie gesagt, hab noch kein plan von windows programmierung, konnte mit devcpp recht gut in der konsole programmieren aber dashier ist so viel komplizierter :(
also, bitte ein Bsp
MfG
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 13:25:41 12.03.2010   Titel:              Zitieren

keiner ne idee?
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 13:52:20 12.03.2010   Titel:              Zitieren

was erwartest du für eine Antwort wenn auf der seite alles steht?

Zitat:

Parameters

wParam
A handle to the display context for the button.
lParam
A handle to the button.


das erste ist der DC auf deinen button und das zweite ein Handle auf den button selbst.
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 13:33:14 21.03.2010   Titel:              Zitieren

Ich habe jetzt dieses hier:
Zitat:
HBRUSH CGUEDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) //Funktion eingefügt für Listboxfarbe
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Attribute des Gerätekontexts hier ändern

if (pWnd->GetDlgCtrlID()==IDC_BUTTON20){
pDC->SetTextColor(RGB(178,34,34));

}

// TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll
return hbr;
}


Allerdings passiert überhauptnichts. Die Schrift auf dem Buttons soll ja rot sein, aber sie bleibt schwarz.

Was muss ich machen damit diese rot wird?
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 16:01:33 26.03.2010   Titel:              Zitieren

habs jetzt fast.
jetzt kommt aber wieder sowas:
konvertierung des parameters 3 von 'tchar[512]' in 'const char *' nicht möglich - C2664

Zitat:
const int bufSize = 512;
TCHAR buffer[bufSize];
if (state & ODS_DISABLED)
pDrawnObj->DrawText(pDC, btnRect, buffer, GetDisabledColor());

Danke
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 19:54:39 30.03.2010   Titel:              Zitieren

warum ist denn das so unheimlich schwer? :'(
ich bin schon sooooo lange dabei, ich hab ne möglichkeit gefunden nach nem tutorial per ownerdraw oder sowas, aber einerseits werden die buttons dadurch ecking und andererseits dauert das ewig.

ich will nur ganz einfach die schriftfarbe auf dem button ändern, in delphi geht das mit einem klick.
also von so:
http://www.imagebanana.com/img/aw7qkes/shiz.JPG
auf so:
http://www.imagebanana.com/view/feieh6xt/shiz2.JPG

hab das einfach mit dem ressourceneditor gemacht, hier wird doch jemand wissen wie das geht? :o
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 20:44:46 30.03.2010   Titel:              Zitieren

na wurden doch nun schon alle möglichkeiten genannt wie man die farbe setzen kann, is halt nun mal kein delphi oder c# wo man das mal klicki in nem editor oder per Funktion ändern kann, schau bei codeproject.com vorbei da findeste sicher auch ne klasse die entsprechende Funktionen hat.
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 22:37:26 30.03.2010   Titel:              Zitieren

es funktioniert einfach nichts...................................................

Zitat:
HBRUSH CAnswer::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(pWnd->GetDlgCtrlID() == IDC_BUTTON1)
pDC->SetTextColor(RGB(53,97,220));
return hbr;
}

das hab ich gefunden, bringt nichts, genauso we ales andere...
bittte hilfe.. ich kapiers einfach nicht.......
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 22:56:01 30.03.2010   Titel:              Zitieren

wenn ich sowas hingegen mit einem editcontrol mache ist das überhaupt kein problem.
einfach sowas:
Zitat:
HBRUSH CGUEDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID() == IDC_EDIT1)
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkMode(TRANSPARENT);

}
return hbr;
}

und schon ist die schrift im editfeld farbig. warum geht das mit den buttons nicht?
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13513
Beitrag Martin Richter Moderator 07:52:22 31.03.2010   Titel:              Zitieren

Warum es nicht geht kann ich Dir nicht sagen, aber es ist IMHO so dokumentiert!

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
Turmfalke64
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.10.2006
Beiträge: 54
Beitrag Turmfalke64 Mitglied 15:54:19 31.03.2010   Titel:              Zitieren

Meines Wissen hat Martin da recht, das man die Schriftfarbe eines Buttons,
nicht so einfach ändern kann, aber zu jedem Problem gibt es ja bekanntlich
eine Lösung und das Wunder heißt Bitmap.

Ein Beispiel wie man es realisieren kann findest Du hier

http://www.coding-help.de/buttons.html

Turmfalke64
Turmfalke64
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.10.2006
Beiträge: 54
Beitrag Turmfalke64 Mitglied 15:56:56 31.03.2010   Titel:              Zitieren

Meines Wissen hat Martin da recht, das man die Schriftfarbe eines Buttons,
nicht so einfach ändern kann, aber zu jedem Problem gibt es ja bekanntlich
eine Lösung und das Wunder heißt Bitmap.

Ein Beispiel wie man es realisieren kann findest Du hier

http://www.coding-help.de/buttons.html

Turmfalke64
Solkuma
Unregistrierter




Beitrag Solkuma Unregistrierter 00:14:18 01.04.2010   Titel:              Zitieren

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void CbutColorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

    if(nIDCtl==IDC_BUTTON1)
    {
    CDC dc;

    dc.Attach(lpDrawItemStruct->hDC);
    RECT rect;
    rect= lpDrawItemStruct->rcItem;
   
    UINT state=lpDrawItemStruct->itemState;

    if((state & ODS_SELECTED))
    {
        dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);

    }
    else
    {
        dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
    }

    dc.SetTextColor(RGB(255,0,0));


    TCHAR buffer[MAX_PATH];
    ZeroMemory(buffer,MAX_PATH );
    ::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
    dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    }               
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void CbutColorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

if(nIDCtl==IDC_BUTTON1)
{
CDC dc;

dc.Attach(lpDrawItemStruct->hDC);
RECT rect;
rect= lpDrawItemStruct->rcItem;

UINT state=lpDrawItemStruct->itemState;

if((state & ODS_SELECTED))
{
dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);

}
else
{
dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
}

dc.SetTextColor(RGB(255,0,0));


TCHAR buffer[MAX_PATH];
ZeroMemory(buffer,MAX_PATH );
::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void CbutColorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

    if(nIDCtl==IDC_BUTTON1)
    {
    CDC dc;

    dc.Attach(lpDrawItemStruct->hDC);
    RECT rect;
    rect= lpDrawItemStruct->rcItem;
   
    UINT state=lpDrawItemStruct->itemState;

    if((state & ODS_SELECTED))
    {
        dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);

    }
    else
    {
        dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
    }

    dc.SetTextColor(RGB(255,0,0));


    TCHAR buffer[MAX_PATH];
    ZeroMemory(buffer,MAX_PATH );
    ::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
    dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    }               
}


Passe noch IDC_BUTTON1 Deinem Code an und setze Ownerdrawn vom Button auf true.
Doug_HH
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.09.2007
Beiträge: 493
Beitrag Doug_HH Mitglied 11:08:32 01.04.2010   Titel:              Zitieren

Was spricht gegen den CommandButton?

http://www.rb-softarticle.com/CommandButton.jpg

http://www.rb-softarticle.com/ToolBox.jpg

Beispiel...

http://www.rb-softarticle.com/bntColor.rar

Gruß,

Doug_HH

_________________
The next time you think you are perfect, try walking on water.
www.rb-softarticle.com
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 16:43:49 01.04.2010   Titel:              Zitieren

Solkuma schrieb:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void CbutColorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

    if(nIDCtl==IDC_BUTTON1)
    {
    CDC dc;

    dc.Attach(lpDrawItemStruct->hDC);
    RECT rect;
    rect= lpDrawItemStruct->rcItem;
   
    UINT state=lpDrawItemStruct->itemState;

    if((state & ODS_SELECTED))
    {
        dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);

    }
    else
    {
        dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
    }

    dc.SetTextColor(RGB(255,0,0));


    TCHAR buffer[MAX_PATH];
    ZeroMemory(buffer,MAX_PATH );
    ::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
    dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    }               
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void CbutColorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

if(nIDCtl==IDC_BUTTON1)
{
CDC dc;

dc.Attach(lpDrawItemStruct->hDC);
RECT rect;
rect= lpDrawItemStruct->rcItem;

UINT state=lpDrawItemStruct->itemState;

if((state & ODS_SELECTED))
{
dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);

}
else
{
dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
}

dc.SetTextColor(RGB(255,0,0));


TCHAR buffer[MAX_PATH];
ZeroMemory(buffer,MAX_PATH );
::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void CbutColorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

    if(nIDCtl==IDC_BUTTON1)
    {
    CDC dc;

    dc.Attach(lpDrawItemStruct->hDC);
    RECT rect;
    rect= lpDrawItemStruct->rcItem;
   
    UINT state=lpDrawItemStruct->itemState;

    if((state & ODS_SELECTED))
    {
        dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);

    }
    else
    {
        dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
    }

    dc.SetTextColor(RGB(255,0,0));


    TCHAR buffer[MAX_PATH];
    ZeroMemory(buffer,MAX_PATH );
    ::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
    dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    }               
}


Passe noch IDC_BUTTON1 Deinem Code an und setze Ownerdrawn vom Button auf true.

dann kommt noch der fehler :
Zitat:
error C2509: 'OnDrawItem': Memberfunktion wurde in 'CGUEDlg' nicht deklariert
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 17:08:21 01.04.2010   Titel:              Zitieren

Ist die auch im Headerfile deiner Dialogklasse deklariert?

C/C++ Code:
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
C/C++ Code:
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
C/C++ Code:
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);


hast du OnDrawItem in deiner Dialogklasse auch richtig überladen, sonnst dürfte die Fehlermeldung nicht kommen
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 17:28:44 01.04.2010   Titel:              Zitieren

ich hab NUR gemacht was da steht also
Zitat:
void CbutColorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

if(nIDCtl==IDC_BUTTON1)
{
CDC dc;

dc.Attach(lpDrawItemStruct->hDC);
RECT rect;
rect= lpDrawItemStruct->rcItem;

UINT state=lpDrawItemStruct->itemState;

if((state & ODS_SELECTED))
{
dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);

}
else
{
dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
}

dc.SetTextColor(RGB(255,0,0));


TCHAR buffer[MAX_PATH];
ZeroMemory(buffer,MAX_PATH );
::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
}


Passe noch IDC_BUTTON1 Deinem Code an und setze Ownerdrawn vom Button auf true.

ich weis nicht ob ich die richtig deklariert ist, wie geht denn das? was genau soll ich da deklarieren?
und auch keine ahnung ob sie richtig überladen ist, ich hab wie gesagt nur gemacht was in dem zitierten beitrag steht..
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 17:51:24 01.04.2010   Titel:              Zitieren

na ist es da nicht besser du lernst erst mal die Grundlagen wie überlade ich eine funktion und solche sachen als sinnlos rum zu probieren wie du nen text von einem Button bunt bekommst?

als mal schnell, hoffe ich erkläre das jetzt richtig:

VS2008 rufst du deinen dialog im Resourceneditor auf und lässt dir die eigenschaften anzeigen. Unter eigenschaften hast du oben einen Button (neben dem gelben blitz) der für Nachrichten sind,l da werden dir alle nachrichten angezeigt die dein Dialog empfangen kann, da sucht du OnDrawItem raus und nutzt dann den kleinen pfeil daneben um die funktion einzufügen. noch source reinkompieren unbd anpassen, fertig.

Hoffe du kannst mit der beschreibung was anfangen, aber wenn du wirklich keine ahnung hast was du da machst und nur Sourcen per copy and paste reinhaust dann lass es und fang erstmal mit den grundlagen von c++ an, so wirst du nur scheitern und ständig fragen müssen
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 18:04:33 01.04.2010   Titel:              Zitieren

CTecS schrieb:
na ist es da nicht besser du lernst erst mal die Grundlagen wie überlade ich eine funktion und solche sachen als sinnlos rum zu probieren wie du nen text von einem Button bunt bekommst?

als mal schnell, hoffe ich erkläre das jetzt richtig:

VS2008 rufst du deinen dialog im Resourceneditor auf und lässt dir die eigenschaften anzeigen. Unter eigenschaften hast du oben einen Button (neben dem gelben blitz) der für Nachrichten sind,l da werden dir alle nachrichten angezeigt die dein Dialog empfangen kann, da sucht du OnDrawItem raus und nutzt dann den kleinen pfeil daneben um die funktion einzufügen. noch source reinkompieren unbd anpassen, fertig.

Hoffe du kannst mit der beschreibung was anfangen, aber wenn du wirklich keine ahnung hast was du da machst und nur Sourcen per copy and paste reinhaust dann lass es und fang erstmal mit den grundlagen von c++ an, so wirst du nur scheitern und ständig fragen müssen

ich hab ca 1 jahr mit dev-cpp in der konsole programmiert..
dh die grundlagen behersche ich, das programm ist auch soweit fertig bis auf einige äußerlichkeiten. von mfc, visualc++ und windowsprogrammierung hab ich leider bisher echt wenig ahnung.

zum thema, in der liste hab ich schon zuvor gesucht, da steht das nicht drin....
ich weis bisher echt nicht wie ich das dort reinbekomme...
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 20:13:21 01.04.2010   Titel:              Zitieren

Zitat:
void CbutColorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.

if(nIDCtl==IDC_BUTTON1)
{
CDC dc;

dc.Attach(lpDrawItemStruct->hDC);
RECT rect;
rect= lpDrawItemStruct->rcItem;

UINT state=lpDrawItemStruct->itemState;

if((state & ODS_SELECTED))
{
dc.DrawEdge(&rect,EDGE_SUNKEN,BF_RECT);

}
else
{
dc.DrawEdge(&rect,EDGE_RAISED,BF_RECT);
}

dc.SetTextColor(RGB(255,0,0));


TCHAR buffer[MAX_PATH];
ZeroMemory(buffer,MAX_PATH );
::GetWindowText(lpDrawItemStruct->hwndItem,buffer,MAX_PATH);
dc.DrawText(buffer,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
}


Passe noch IDC_BUTTON1 Deinem Code an und setze Ownerdrawn vom Button auf true.


so, ich habs jetzt, danke.
doch wie bekomme ich den button jetzt wieder in die form wie er beim dialog normalerweise ist?
so ist der jetzt grau und eckig, ich brauch den aber folgendermaßen:
http://www.imagebanana.com/view/feieh6xt/shiz2.JPG

also das mit der farbe klappt schonmal :)
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 22:08:17 01.04.2010   Titel:              Zitieren

sowas such ich, ich check das bloß nicht was da steht...
also so soll der owner draw button auch aussehen aber ich krieg das nicht so hin..
farbig ist er ja bereits
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 22:15:12 01.04.2010   Titel:              Zitieren

sry derr link:
http://www.codeproject.com/KB/buttons/nativewin32xpthemes.aspx
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 22:17:04 01.04.2010   Titel:              Zitieren

na so gar nicht weil du den Button komplett selbst zeichnest.

aber ich hab mal für dich gesucht und eine entsprechende Klasse gefunden die sollte alles das können was du Suchst und noch bissel mehr

XButtonXP

den Link von CodeProject hatte ich glaub ich schon mal gepostet, mit dem Hinweis das man dort fast alles findet, aber nur wenn man halt sucht.
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 02:06:40 02.04.2010   Titel:              Zitieren

CTecS schrieb:
na so gar nicht weil du den Button komplett selbst zeichnest.

aber ich hab mal für dich gesucht und eine entsprechende Klasse gefunden die sollte alles das können was du Suchst und noch bissel mehr

XButtonXP

den Link von CodeProject hatte ich glaub ich schon mal gepostet, mit dem Hinweis das man dort fast alles findet, aber nur wenn man halt sucht.


Ist doch genau der gleiche Mist...

Hast Du eine Allergie gegen das zuhören?

Meine Fresse noch mal, nur Vollhonks hier...
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 02:13:07 02.04.2010   Titel:              Zitieren

Mond19 schrieb:


Ist doch genau der gleiche Mist...

Hast Du eine Allergie gegen das zuhören?

Meine Fresse noch mal, nur Vollhonks hier...


sag mal spürst du dich noch, ersten macht die Klasse deinen scheiß Themes und den Farbigen Text, wenn du das natürlich nicht hin bekommst die einzubinden ist das dein Prpoblem, warum Antwortet dir überhaupt noch jemand sie doch zu wie du dein zeug auf die reihe bekommst.

Beleidigungen sind an deiner stelle sicher nicht angebracht
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 13:37:34 02.04.2010   Titel:              Zitieren

Mond19 schrieb:
CTecS schrieb:
na so gar nicht weil du den Button komplett selbst zeichnest.

aber ich hab mal für dich gesucht und eine entsprechende Klasse gefunden die sollte alles das können was du Suchst und noch bissel mehr

XButtonXP

den Link von CodeProject hatte ich glaub ich schon mal gepostet, mit dem Hinweis das man dort fast alles findet, aber nur wenn man halt sucht.


Ist doch genau der gleiche Mist...

Hast Du eine Allergie gegen das zuhören?

Meine Fresse noch mal, nur Vollhonks hier...

das hab ich nicht geschrieben, war wieder mal irgendein anderer typ...
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 13:52:28 02.04.2010   Titel:              Zitieren

dann registrier dich doch einfach auf der seite und keiner schreibt mehr in deinem namen irgenwelchen mist
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 02:17:56 03.04.2010   Titel:              Zitieren

CTecS schrieb:
na so gar nicht weil du den Button komplett selbst zeichnest.

aber ich hab mal für dich gesucht und eine entsprechende Klasse gefunden die sollte alles das können was du Suchst und noch bissel mehr

XButtonXP

den Link von CodeProject hatte ich glaub ich schon mal gepostet, mit dem Hinweis das man dort fast alles findet, aber nur wenn man halt sucht.

also.. ich hab die dateien eingefügt und die angegebene headerdatei includiert..
weiter komme ich jedoch nicht, also alles was ich versuche gibt mal wieder fehlermeldungen aus..
wie sollte das denn in meinem fall aussehen, ich will ja nur das template verwenden? also was muss ich noch eingeben?
danke
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 02:42:53 03.04.2010   Titel:              Zitieren

Erstell eine Membervariable vom Type CButton für deinen Button und ersetze in der Headerdatei deiner Dialogklasse CButton gegen CXButtonXP.

Das ganze kannst du dir in der Testanwenung die dabei ist anschaun. und nicht vergessen die ganzen benötigten Dateien mit in dein Projekt aufzunehmen, die CXButtonXP benötigt.

Wobei ich ebend mitbekommen habe das der Themes bei Farbigen Text auch nicht macht, zumindest sieht das im Demo so aus, was aber noch zu überprüfen ist.


Zuletzt bearbeitet von CTecS am 02:51:48 03.04.2010, insgesamt 1-mal bearbeitet
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 12:15:16 03.04.2010   Titel:              Zitieren

also ich hab die membervariable erstellt, dann in abcDlg.cpp dashier
Zitat:

public:
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
CButton m_Button;


zu dem hier

Zitat:
public:
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
CXButtonXP m_Button;

gemacht. jedoch stürzt das ganze ab, der debugger startet und hat die haltepunkte in irgendwelchen headerdateien des beispiels...
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 15:09:33 03.04.2010   Titel:              Zitieren

na OnDrawItem brauchst du doch gar nicht und CButton m_Button; musst du in der headerdatei deines dialoges definieren.
Schau dir doch mal in dem Beispiel an wo er und vorallem wie er den CXButtonXP erstellt hat.
An sonnsten solltest du alles erstmal wieder rausnehmen, dann fügst du über die resourcenansicht auf deinen Button eine neue Membervariable ein (button ->rechte Maustaste) vom Type CButton, jetzt sollte eine CButton Variable n der Headerdatei deines Dialoges sein, den änderst du in CXButtonXP und vergisst nicht am anfang der headerdatei die klassen von CXButtonXP zu inkludieren. In der resourcenansicht den Button eventuell noch auf Ownerdraw stellen und in der InitDialog die farbe setzen, das sollte es gewesen sein.
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 16:18:18 03.04.2010   Titel:              Zitieren

okay, hab das jetzt alles soweit gemacht, bis auf das einfärben.
kannst du den befehl dazu nochmal posten, der einzige, der bei mir funktionierte, war der, für den ich ondrawitem benötigte...

zumindest scheint es soweit zu funktionierten, der button wird per ownerdraw jetzt im xpstyle gezeichnet, allerdings gibts eine fehlermeldung wegen einer der hinzugefügten dateien: "oddbutton.cpp"
wenn ich auf ignore klicke läuft es aber dennoch.
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 16:44:13 03.04.2010   Titel:              Zitieren

mit
C/C++ Code:
CXButtonXP& SetTextColor(COLORREF rgb = XBUTTONXP_NO_COLOR)
C/C++ Code:
CXButtonXP& SetTextColor(COLORREF rgb = XBUTTONXP_NO_COLOR)
C/C++ Code:
CXButtonXP& SetTextColor(COLORREF rgb = XBUTTONXP_NO_COLOR)


in der InitDialog kannst du die Farbe des Textes setzen, aber wie gesagt ob der dann den Themes Style im Hintergrund behällt weis ich auch nicht, das müsstest du ausprobieren.

Wegen dem Fehler, sollteste vielleicht mal die Fehlermeldung Posten, dann kann dir jemand helfen
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 17:58:08 03.04.2010   Titel:              Zitieren

CTecS schrieb:
mit
C/C++ Code:
CXButtonXP& SetTextColor(COLORREF rgb = XBUTTONXP_NO_COLOR)
C/C++ Code:
CXButtonXP& SetTextColor(COLORREF rgb = XBUTTONXP_NO_COLOR)
C/C++ Code:
CXButtonXP& SetTextColor(COLORREF rgb = XBUTTONXP_NO_COLOR)


in der InitDialog kannst du die Farbe des Textes setzen, aber wie gesagt ob der dann den Themes Style im Hintergrund behällt weis ich auch nicht, das müsstest du ausprobieren.

Wegen dem Fehler, sollteste vielleicht mal die Fehlermeldung Posten, dann kann dir jemand helfen

danke, aber du hast recht, wenn ich den button einfärbe dann ist das xptheme wieder entfernt...

gibt es noch andere möglichkeiten?
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 23:00:20 03.04.2010   Titel:              Zitieren

hab jetzt dieshier noch ausprobiert
http://www.codeproject.com/KB/buttons/xp_button.aspx

zunächst zeichnet der den buton richtig im xpstyle, doch wenn ich den button färbe, dann wird er wieder so komisch grau...
Mond19
Unregistrierter




Beitrag Mond19 Unregistrierter 23:06:23 03.04.2010   Titel:              Zitieren

ich schätze, das ganze lässt sich doch mit CTLCOLORBTN lösen, jedenfalls hab ich das gelesen. ich kapier diesen befehl allerdings nicht, kann mir mal bitte jemand ein beispeil dazu geben, wie es bei meinem fall anzuwenden ist?
in dem nachrichtenbehandlungsteil gibts ja nur ctlcolor zum hinzufügen, wie komm ich da jetzt zu ctlcolorbtn?
danke
CTecS
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.09.2008
Beiträge: 821
Beitrag CTecS Mitglied 13:02:56 04.04.2010   Titel:              Zitieren

CTLCOLORBTN ist kein Befehl sondern ein Flag was in OnCtlColor() gesetzt ist wenn die Nachricht von einem Button kommt. Besteht wiederum die Frage wie dich das weiter bringt, ich denke mal gar nicht.

aber warum kasperst du hier tagelang rum, in der zwischenzeit hättest du schon längst eine eigene Klasse abgeleitet von CButton schreiben können die das macht was du dir vorstellst. ich denk mal so schwer wird das nicht sein sich in die Materie mit den Windows Themes einzuarbeiten.

Wobei du ja eigentlich wenn du darüber nachdenkst, die Textfarbe nicht ändern kannst weil diese ja zum Thema dazu gehört. Als Beistpeil du nimmst jetzt ne grüne Farbe für den Text des Buttons was glaubst du was der User lesen kann wenn der ein grünes Thama eingestellt hat und dadurch der hintergrund auch grün ist. Wenn du nichts an der Farbe des Textes änderst wird auch beim umstellen des Themas die Farbe passen.

Also wenn das unbedingt sein muß das der Text bunt ist würde ich alle Buttons des Programmes ändern und einheitlich machen.


Zuletzt bearbeitet von CTecS am 13:41:33 04.04.2010, insgesamt 1-mal bearbeitet
C/C++ Forum :: MFC (Visual C++) ::  Schriftfarbe von Buttons ändern   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.