Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. LoadImage failure?

LoadImage failure?

Scheduled Pinned Locked Moved C / C++ / MFC
helpgraphicsperformancequestion
12 Posts 4 Posters 2 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H Hamid Taebi

    Can you show your code?

    L Offline
    L Offline
    Llasus
    wrote on last edited by
    #3

    The code is actually too large to paste in here. I can only paste the function which displays has the LoadImage part. void CDlg::DisplayImage() { //then use LoadImage and attach it to a BITMAP handle gOtherClass.gDisplayPanelHandle = (HBITMAP)::LoadImage ( 0, gMapPath, IMAGE_BITMAP, gSourceSize.cx, gSourceSize.cy, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); //check if GlobalMap.bmp was loaded if(gOtherClass.gDisplayPanelHandle == NULL) { AfxMessageBox("Error!\nUnable to load Map File"); return; } //Attach the bitmap handle to the CDC for display gCDC.SelectObject(gOtherClass.gDisplayPanelHandle); //reverse image and stretch it to display correctly gCDC.StretchBlt ( 0, 0, gSourceSize.cx, gSourceSize.cy, &gCDC, 0, gSourceSize.cy - 1, //added - 1 to display image properly gSourceSize.cx, -gSourceSize.cy, SRCCOPY ); Invalidate(FALSE); }

    H N J 3 Replies Last reply
    0
    • L Llasus

      The code is actually too large to paste in here. I can only paste the function which displays has the LoadImage part. void CDlg::DisplayImage() { //then use LoadImage and attach it to a BITMAP handle gOtherClass.gDisplayPanelHandle = (HBITMAP)::LoadImage ( 0, gMapPath, IMAGE_BITMAP, gSourceSize.cx, gSourceSize.cy, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); //check if GlobalMap.bmp was loaded if(gOtherClass.gDisplayPanelHandle == NULL) { AfxMessageBox("Error!\nUnable to load Map File"); return; } //Attach the bitmap handle to the CDC for display gCDC.SelectObject(gOtherClass.gDisplayPanelHandle); //reverse image and stretch it to display correctly gCDC.StretchBlt ( 0, 0, gSourceSize.cx, gSourceSize.cy, &gCDC, 0, gSourceSize.cy - 1, //added - 1 to display image properly gSourceSize.cx, -gSourceSize.cy, SRCCOPY ); Invalidate(FALSE); }

      H Offline
      H Offline
      Hamid Taebi
      wrote on last edited by
      #4

      What is gOtherClass.gDisplayPanelHandle?

      L 1 Reply Last reply
      0
      • H Hamid Taebi

        What is gOtherClass.gDisplayPanelHandle?

        L Offline
        L Offline
        Llasus
        wrote on last edited by
        #5

        its a class which contains all the shared variables between other characters. I have noticed also that after around 100 times of loading a bitmap, the application's performance is starting to decline.

        1 Reply Last reply
        0
        • L Llasus

          The code is actually too large to paste in here. I can only paste the function which displays has the LoadImage part. void CDlg::DisplayImage() { //then use LoadImage and attach it to a BITMAP handle gOtherClass.gDisplayPanelHandle = (HBITMAP)::LoadImage ( 0, gMapPath, IMAGE_BITMAP, gSourceSize.cx, gSourceSize.cy, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); //check if GlobalMap.bmp was loaded if(gOtherClass.gDisplayPanelHandle == NULL) { AfxMessageBox("Error!\nUnable to load Map File"); return; } //Attach the bitmap handle to the CDC for display gCDC.SelectObject(gOtherClass.gDisplayPanelHandle); //reverse image and stretch it to display correctly gCDC.StretchBlt ( 0, 0, gSourceSize.cx, gSourceSize.cy, &gCDC, 0, gSourceSize.cy - 1, //added - 1 to display image properly gSourceSize.cx, -gSourceSize.cy, SRCCOPY ); Invalidate(FALSE); }

          N Offline
          N Offline
          Naveen
          wrote on last edited by
          #6

          Llasus wrote:

          gOtherClass.gDisplayPanelHandle

          Do you destroy the handle after every display?

          nave [OpenedFileFinder]

          L 1 Reply Last reply
          0
          • L Llasus

            The code is actually too large to paste in here. I can only paste the function which displays has the LoadImage part. void CDlg::DisplayImage() { //then use LoadImage and attach it to a BITMAP handle gOtherClass.gDisplayPanelHandle = (HBITMAP)::LoadImage ( 0, gMapPath, IMAGE_BITMAP, gSourceSize.cx, gSourceSize.cy, LR_DEFAULTCOLOR | LR_LOADFROMFILE ); //check if GlobalMap.bmp was loaded if(gOtherClass.gDisplayPanelHandle == NULL) { AfxMessageBox("Error!\nUnable to load Map File"); return; } //Attach the bitmap handle to the CDC for display gCDC.SelectObject(gOtherClass.gDisplayPanelHandle); //reverse image and stretch it to display correctly gCDC.StretchBlt ( 0, 0, gSourceSize.cx, gSourceSize.cy, &gCDC, 0, gSourceSize.cy - 1, //added - 1 to display image properly gSourceSize.cx, -gSourceSize.cy, SRCCOPY ); Invalidate(FALSE); }

            J Offline
            J Offline
            jhwurmbach
            wrote on last edited by
            #7

            When calling SelectObject, you need to store the Pointer to the old GdiObject you get from the call and re-SelectObject it after finishing work. You are producing a so called GDI-Resource-Leak. In the ProcessExplorer, you cann swith on display of used GDI-Objects.


            Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal.
            George Orwell, "Keep the Aspidistra Flying", Opening words

            L 1 Reply Last reply
            0
            • N Naveen

              Llasus wrote:

              gOtherClass.gDisplayPanelHandle

              Do you destroy the handle after every display?

              nave [OpenedFileFinder]

              L Offline
              L Offline
              Llasus
              wrote on last edited by
              #8

              yes. I made sure that it destroys the object before loading the next image.

              1 Reply Last reply
              0
              • J jhwurmbach

                When calling SelectObject, you need to store the Pointer to the old GdiObject you get from the call and re-SelectObject it after finishing work. You are producing a so called GDI-Resource-Leak. In the ProcessExplorer, you cann swith on display of used GDI-Objects.


                Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal.
                George Orwell, "Keep the Aspidistra Flying", Opening words

                L Offline
                L Offline
                Llasus
                wrote on last edited by
                #9

                Thank you for the help. I will try this tomorrow. I have not encountered this GDI-Resource-Leak though. Sorry but could you please explain further what you mean by re-SelectObject after finishing the work and why I need it? Usually when loading the next image I just use the DeleteObject() to somehow release the object for next use.

                J 1 Reply Last reply
                0
                • L Llasus

                  Thank you for the help. I will try this tomorrow. I have not encountered this GDI-Resource-Leak though. Sorry but could you please explain further what you mean by re-SelectObject after finishing the work and why I need it? Usually when loading the next image I just use the DeleteObject() to somehow release the object for next use.

                  J Offline
                  J Offline
                  jhwurmbach
                  wrote on last edited by
                  #10

                  Llasus wrote:

                  could you please explain further what you mean by re-SelectObject after finishing the work and why I need it?

                  What I mean is this:

                  CBitmap m_bmpSnapshot = ...
                  CBitmap* pOldBmp = dcSnapshot.SelectObject(&m_bmpSnapshot);
                  dcSnapshot.BitBlt(0, 0, width, height, &dc, 0, 0, SRCCOPY);
                  dcSnapshot.SelectObject(pOldBmp);


                  Let's think the unthinkable, let's do the undoable, let's prepare to grapple with the ineffable itself, and see if we may not eff it after all.
                  Douglas Adams, "Dirk Gently's Holistic Detective Agency"

                  L 2 Replies Last reply
                  0
                  • J jhwurmbach

                    Llasus wrote:

                    could you please explain further what you mean by re-SelectObject after finishing the work and why I need it?

                    What I mean is this:

                    CBitmap m_bmpSnapshot = ...
                    CBitmap* pOldBmp = dcSnapshot.SelectObject(&m_bmpSnapshot);
                    dcSnapshot.BitBlt(0, 0, width, height, &dc, 0, 0, SRCCOPY);
                    dcSnapshot.SelectObject(pOldBmp);


                    Let's think the unthinkable, let's do the undoable, let's prepare to grapple with the ineffable itself, and see if we may not eff it after all.
                    Douglas Adams, "Dirk Gently's Holistic Detective Agency"

                    L Offline
                    L Offline
                    Llasus
                    wrote on last edited by
                    #11

                    I see. thank you very much for the help! I will try to test this tomorrow. Again, thank you very much for the time and help!

                    1 Reply Last reply
                    0
                    • J jhwurmbach

                      Llasus wrote:

                      could you please explain further what you mean by re-SelectObject after finishing the work and why I need it?

                      What I mean is this:

                      CBitmap m_bmpSnapshot = ...
                      CBitmap* pOldBmp = dcSnapshot.SelectObject(&m_bmpSnapshot);
                      dcSnapshot.BitBlt(0, 0, width, height, &dc, 0, 0, SRCCOPY);
                      dcSnapshot.SelectObject(pOldBmp);


                      Let's think the unthinkable, let's do the undoable, let's prepare to grapple with the ineffable itself, and see if we may not eff it after all.
                      Douglas Adams, "Dirk Gently's Holistic Detective Agency"

                      L Offline
                      L Offline
                      Llasus
                      wrote on last edited by
                      #12

                      It worked! Thank you so much for your help. I was never aware of the possibility that GDI may leak if you don't save and re-select the pointer that SelectObject returned. I did past applications though without doing that. Though not as much on loading in images like this one. Again, thank you to all that helped specially jhwurmbach. :)

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups