Отображение изображения в приложении Visual c для Windows

#c

#c

Вопрос:

Я новичок в программировании приложений Visual c для Windows, и я хочу отобразить изображение на экране, но я не знаю, как это сделать. Кто-нибудь может мне помочь?

Большая часть материала, который я нашел в сети, касалась приложения MFC, которое меня не интересует. Я хочу, чтобы это приложение было как можно более простым, поэтому неудивительно, что я не заинтересован в использовании какой-либо дополнительной библиотеки, такой как OpenCV или Direct2D, OpenGL.

Комментарии:

1. Если вы хотите, чтобы это было просто, вы выбрали неправильный инструмент. Необработанный winapi не прост. Простой — это MFC, WinForms или VCL.

Ответ №1:

BitBlt, найдите его в MSDN. Также смотрите, http://www.winprog.org/tutorial/bitmaps.html .

Ответ №2:

Просто используйте следующий код. Это некрасиво, но работает достаточно хорошо для отладки

 #include <windows.h>
#include <tchar.h>

HBITMAP hBitmap;
HDC localDC;
HBITMAP hOld;
BITMAP qB;
HDC hDC;                                             // Handle (virtual memory pointer) to drawing characteristics

LRESULT CALLBACK fnWndProc(HWND hwnd, unsigned int msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
        case WM_CREATE:{
            //MessageBox(hwnd,_T("Window Procedure Received WM_CREATE Message!"),_T("Message Report!"),MB_OK);
            return 0;
        }
        case WM_LBUTTONDOWN: {
            //MessageBox(hwnd,_T("Window Procedure Received WM_LBUTTONDOWN Message!"),_T("Message Report!"),MB_OK);
        return 0;
        }

        case WM_PAINT: {                  //At program start up the whole window is invalid so must be drawn.
            //TCHAR tmpText[]=_T("TempText");
            PAINTSTRUCT ps;      
            hDC = BeginPaint(hwnd,amp;ps); 
            BOOL qRetBlit = ::BitBlt(hDC,0,0,qB.bmWidth,qB.bmHeight,localDC,0,0,SRCCOPY);
            // Draw text on top of the image
            //int iBkMode=SetBkMode(hDC,TRANSPARENT);                   // Save Background Mode characteristic of drawing context
            //TextOut(hDC,40,20,tmpText,(int)_tcslen(tmpText));     // Draw Text
            //SetBkMode(hDC,iBkMode);                                       // Return Drawing Context To Original State
            EndPaint(hwnd, amp;ps);
            return 0;
        }
        case WM_DESTROY: {                    
            ::SelectObject(localDC,hOld);
            ::DeleteDC(localDC);
            ::DeleteObject(hBitmap);
            PostQuitMessage(0);
            return 0;
         }
    }
    return (DefWindowProc(hwnd, msg, wParam, lParam));
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int iShow){
    TCHAR szClassName[]=_T("Name");
    WNDCLASSEX wc;
    MSG messages;
    HWND hWnd;

    wc.lpszClassName  =  szClassName;                     //Important Field!  Character string identifying window class
    wc.lpfnWndProc    =  fnWndProc;                       //Important Field!  Function Pointer.  Address of Window Procedure
    wc.cbSize         =  sizeof (WNDCLASSEX);             //Those top two fields I just listed are very important.  The
    wc.style          =  0;                               //others are of course necessary too, but fully understanding all
    wc.hIcon          =  LoadIcon(NULL,IDI_APPLICATION);  //the implications of the .szClassName and .lpfnWndProc fields will
    wc.hInstance      =  hInstance;                       //go a long way to helping you understand Win32 coding. The
    wc.hIconSm        =  0;                               //.hBrushBackground field will be the color of the Window's
    wc.hCursor        =  LoadCursor(NULL,IDC_ARROW);      //background.  The .cbWndExtra field is very useful as it allows
    wc.hbrBackground  =  (HBRUSH)COLOR_BTNSHADOW;         //you to associate object (Window) data to the instantiated Window's
    wc.cbWndExtra     =  0;                               //internal structure, i.e., accomodate member data.
    wc.cbClsExtra     =  0;
    wc.lpszMenuName   =  NULL;
    RegisterClassEx(amp;wc);
    hBitmap = (HBITMAP)::LoadImage(NULL, (LPCSTR)"P:/Resources/testing/a.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    GetObject(reinterpret_cast<HGDIOBJ>(hBitmap),sizeof(BITMAP),reinterpret_cast<LPVOID>(amp;qB));
    localDC = ::CreateCompatibleDC(hDC);
    hOld = (HBITMAP)::SelectObject(localDC,hBitmap);

    hWnd = CreateWindowEx(0,szClassName,szClassName,WS_OVERLAPPEDWINDOW,0,0,qB.bmWidth,qB.bmHeight,HWND_DESKTOP,0,hInstance,0);
    ShowWindow(hWnd,iShow);
    while(GetMessage(amp;messages,NULL,0,0)){                                                   
        TranslateMessage(amp;messages);                     
        DispatchMessage(amp;messages);
    }
    return (int)messages.wParam;
}