Avatar billede soreno Praktikant
24. februar 2002 - 11:39 Der er 14 kommentarer og
1 løsning

mfc - arv - typecasting

Jeg har lavet en mfc app (CBlankApp) som nedarver fra en screensaver skabelon (CScreenSaverApp) fundet her: http://www.naughter.com/freegui.html

men når jeg overrider OnPaint() kan jeg ikke få føgende linie til at virke:
CPaintDC dc(this);
fejlen er:
cannot convert parameter 1 from 'class CBlankApp *const ' to 'class CWnd *'

Hvordan får jeg lavet "this" om til en CWnd ? (hvis det altså overhovedet kan lade sig gøre? - hvis ikke hvordan kan jeg så få fat i en CPaintDC ?)
Avatar billede soreno Praktikant
24. februar 2002 - 11:41 #1
her er Blank.cpp filen:

#include "stdafx.h"
#include "Blank.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BEGIN_MESSAGE_MAP(CBlankApp, CScreenSaverApp)
    //{{AFX_MSG_MAP(CBlankApp)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

CBlankApp theApp;

CBlankApp::CBlankApp() : CScreenSaverApp()
{
    SetScreenSaverTemplate(RUNTIME_CLASS(CScreenSaverWnd));
}

void CBlankApp::OnPaint()
{
    CPaintDC dc(this);
}
Avatar billede jpk Nybegynder
24. februar 2002 - 12:58 #2
Hvorfor vil du dog håndtere det grafiske fra app-delen?
Rent designmæssigt er det ikke særligt pænt...
Du burde nok gøre det i et view eller i det mindste i dit frame vindue, hvilket også vil løse dit problem!

Du får fejlen fordi din app ikke er en nedarving fra CWnd. Du forsøger at lave en implicit konvertering fra CBlanApp til CWnd, hvilket ikke er muligt.
Overrider du istedet OnPaint i framen eller view'et, er problemet der ikke!
Avatar billede soreno Praktikant
24. februar 2002 - 13:18 #3
fejlen er egentlig fordi jeg ikke læste dokumentationen godt nok. Mit vidre arbejde med screensaveren har resulteret i:

#include "stdafx.h"
#include "Blank.h"
#include "BlankDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CBlankDlg::CBlankDlg(CWnd* pParent /*=NULL*/) : CScreenSaverWnd()
{
    //{{AFX_DATA_INIT(CBlankDlg)
        // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
}

BEGIN_MESSAGE_MAP(CBlankDlg, CScreenSaverWnd)
    //{{AFX_MSG_MAP(CBlankDlg)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CBlankDlg::OnPaint()
{
    CPaintDC dc(this);
    dc.SetTextColor(RGB(255, 255, 255));
    dc.SetBkMode(TRANSPARENT);
    dc.TextOut(0, 0, "Override virkede");
}

Men den overrider ikke CScreenSaverWnd::OnPaint(WM_PAINT) hvilket jeg ikke kan forstå?
Avatar billede jpk Nybegynder
24. februar 2002 - 16:33 #4
har du sat den rigtige template?

SetScreenSaverTemplate(RUNTIME_CLASS(CBlankDlg));
Avatar billede soreno Praktikant
24. februar 2002 - 16:44 #5
nej, det havde jeg ikke men når jeg sætter den:

#include "BlankDlg.h"
..
CBlankApp::CBlankApp() : CScreenSaverApp()
{
    SetScreenSaverTemplate(RUNTIME_CLASS(CBlankDlg));
}

får jeg følgende fejl:
error C2039: 'classCBlankDlg' : is not a member of 'CBlankDlg'
Avatar billede jpk Nybegynder
24. februar 2002 - 16:50 #6
Okay, så skal du tilføje:
IMPLEMENT_DYNCREATE(CBlankDlg, CScreenSaverWnd)

i din cpp-fil, fx lige over message mappen, altså:

IMPLEMENT_DYNCREATE(CBlankDlg, CScreenSaverWnd)

BEGIN_MESSAGE_MAP(CBlankDlg, CScreenSaverWnd)
    //{{AFX_MSG_MAP(CBlankDlg)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

I din h-fil skal du envidere tilføje linien:
DECLARE_DYNCREATE(CBlankDlg)

til klassen CBlankDlg, fx lige over linien:
DECLARE_MESSAGE_MAP()
Avatar billede soreno Praktikant
24. februar 2002 - 16:56 #7
ok, så langt så godt, men udgangspunktet er stadig det samme.
void CBlankDlg::OnPaint()
{
    CPaintDC dc(this);
    dc.SetTextColor(RGB(255, 255, 255));
    dc.SetBkMode(TRANSPARENT);
    dc.TextOut(0, 0, "Override virkede");
}
overrider stadig ikke CScreenSaverWnd::OnPaint(WM_PAINT) ?
Avatar billede jpk Nybegynder
24. februar 2002 - 17:00 #8
Du har vel tilføjet linien:
afx_msg void OnPaint();
til din klasse CBlankDlg?
Avatar billede soreno Praktikant
24. februar 2002 - 17:01 #9
ja
Avatar billede soreno Praktikant
24. februar 2002 - 17:04 #10
arg, ups, sorry, det virker - det var forkerte version af screensaveren jeg prøvede af..
1000 tak for hjælpen
Avatar billede jpk Nybegynder
24. februar 2002 - 17:05 #11
Velbekomme...
Avatar billede jpk Nybegynder
24. februar 2002 - 17:06 #12
Forkerte, kører du den ikke fra VC++?
Avatar billede soreno Praktikant
24. februar 2002 - 17:08 #13
nej, for så åbner configurations delen af screensaveren, og jeg har ikke lige sat mig ind i hvordan man ændre parametre til eksekvering fra vc++
Avatar billede jpk Nybegynder
24. februar 2002 - 17:12 #14
Vælg menuen Project->Settings og fanebladet Debug.
Skriv et 's' under program arguments og din saver vil starte op i screensaver mode...
Avatar billede soreno Praktikant
24. februar 2002 - 17:18 #15
mange tak, det gør testning nemmere..
bare for en god ordens skyld, så var det først efter ændringerne du foreslog 16:50:06 at det virkede
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