Avatar billede baltazar_ Nybegynder
21. april 2003 - 22:04 Der er 17 kommentarer

fejl ang ASSERT(m_hDC != NULL);

Hvad betyder det når jeg får fejl i denne linie

ASSERT(m_hDC != NULL);

programmet lukker ned ved den linie når jeg ved hjælp af en radiobutton prøver at tegne nogle linier i et dc
således:

m_pt.x = rectStaticClient.left;
    m_pt.y = rectStaticClient.top;

    CScrollBitmapDlg* pDoc = this;

    // Major unit lines
    CPen penDash;
    penDash.CreatePen(PS_SOLID, 1, m_gridColor);
    CPen* pOldPen = pDC->SelectObject(&penDash);

    for (int x = 0-sourcex; x < rect.right; x += rect.right/10)
    {
        if (x != 0)
        {
            pDC->MoveTo(x, rect.top);
            pDC->LineTo(x, rect.bottom);
           
        }
    }

    for (int y = 0-sourcey; y < rect.bottom; y += rect.bottom/10)
    {
        if (y != 0)
        {
            pDC->MoveTo(rect.left, y);
            pDC->LineTo(rect.right, y);
        }
    }
    pDC->SelectObject(pOldPen);

}

Jeg kalder denne funktion således:

if (m_showgrid_state==TRUE)
{


    DrawGrid(pdc, rcClient);
    ReleaseDC(pdc);
   
}
Avatar billede arne_v Ekspert
21. april 2003 - 22:08 #1
Du kalder en metode i en klasse der har et member m_hDC og i
den metode er der sat en assert m_hDC != NULL ind og den
assertion fejler fordi m_hDC faktisk er NULL.

(og jeg har lidt svært ved at relatere det til det postede
kode fragment)
Avatar billede arne_v Ekspert
21. april 2003 - 22:09 #2
Muligvis er det bare så simpelt at din pDC er NULL !?
Avatar billede tam Nybegynder
21. april 2003 - 22:10 #3
Det betyder at m_hDC er NULL.

Når du kalder DrawGrid(pdc, rcClient); er du så sikker på at pdc ikke er NULL?
Avatar billede baltazar_ Nybegynder
21. april 2003 - 22:24 #4
jeg er ret sikker på at pdc ikke er null, jeg opretter det således CDC* pdc = m_st1.GetWindowDC();
MEN kan det tænkes at fejlen kommer fordi jeg har inddelt m_st1 i et par tusinde rect  ?? og den derved ikke kan finde ud af det på en eller anden måde.
Avatar billede arne_v Ekspert
21. april 2003 - 22:26 #5
Kan du ikke lige hurtigt teste om den faktisk er forskellig fra NULL
lige efter GetWindowDC ?
Avatar billede baltazar_ Nybegynder
21. april 2003 - 22:47 #6
har nu gjort således og den kommer ikke engang ud med afx boksen

if (m_showgrid_state==TRUE)
{

CDC* pdc = m_st1.GetWindowDC();
if(pDC==NULL)
{
            AfxMessageBox( "pdc null" );
}

    DrawGrid(pdc, rcClient);
    ReleaseDC(pdc);
   
}
Avatar billede tam Nybegynder
21. april 2003 - 22:48 #7
Hmmm, i hvilken funktion står du når du kalder DrawGrid(pdc, rcClient);?

(Jeg går ud fra at du koder til windows, din kode ser sådan ud)
Hvis du bruger MFC (ser sådan ud når du bruger et CDC) må du jo kun tegne i et window når dets OnPaint bliver kaldet........
Avatar billede tam Nybegynder
21. april 2003 - 22:49 #8
Du kunne også bare have skrevet ASSERT(pdc != NULL);
Avatar billede baltazar_ Nybegynder
21. april 2003 - 22:51 #9
jeg kalder DrawGrid fra OnPaint :(
Avatar billede tam Nybegynder
21. april 2003 - 22:55 #10
Og du kalder BeginPaint og EndPaint?
Avatar billede baltazar_ Nybegynder
21. april 2003 - 22:57 #11
nej det bruger jeg ikke
Avatar billede tam Nybegynder
21. april 2003 - 23:00 #12
Hmmmmmm, er det et windows du tegner i?
Hvis det er burde du jo bruge dets OnDraw(CDC pdc) function. Der er et DC med som du bare kan tegne i......
Avatar billede tam Nybegynder
21. april 2003 - 23:02 #13
Ahaemmm, hvis du ikke bruger begin/endpaint, bliver MFC framework'et en anelse irreteret hvis du tegner i det i en OnPaint function...

void CMyView::OnPaint()
{
  PAINTSTRUCT ps;
  CDC* pDC = BeginPaint(&ps);

  pDC->Rectangle(CRect(0, 0, 100, 100));

  EndPaint(&ps);

  // Do not call CView::OnPaint() for painting messages
}
Avatar billede baltazar_ Nybegynder
21. april 2003 - 23:13 #14
performance mæssigt så kan jeg godt følge dig, men jeg har haft det til at virke på denne måde. Selvom det måske ikke er det mest optimale.
Avatar billede tam Nybegynder
21. april 2003 - 23:16 #15
Det er ikke "ikke optimalt", det er forkert og giver underlige fejl... (Som du selv har fået)
Avatar billede baltazar_ Nybegynder
21. april 2003 - 23:24 #16
nu er jeg ikke så gammel i faget, så det må jeg kigge nærmere på. Nu vil jeg lige tygge over det natten over og se med friske øjne på det i morgen.
Avatar billede baltazar_ Nybegynder
22. april 2003 - 12:35 #17
sjovt nok, nu virker det ligepludseligt. Efter et crash hvor mit classview ikke var tilgængeligt og jeg derefter rekontruerede classview,  POP  så virkede det igen. mystisk.  Men måske er det blot en bekræftelse på hvad du netop sagde Tam  :O)
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