2011-10-23 6 views
0

私はVisual C++のWindowsアプリケーションプログラミングの初心者ですが、画面に画像を表示したいのですが、どうやってその方法がわかりません。誰でも助けてくれますか?Visual C++ウィンドウアプリケーションで画像を表示

私がネット上で見つけたものの大部分は、私が興味を持っていないMFCアプリケーションに関するものでした。 このアプリケーションはできるだけシンプルにしたいので、私は追加のものを使用することに興味がないのは驚きではありませんOpenCVやDirect2D、OpenGlのようなライブラリ。

+1

間違ったツールを選んだのであれば、それは簡単です。生のwinapiは単純ではありません。シンプルなのはMFCまたはWinFormsまたはVCLです。 –

答えて

1

次のコードを使用してください。それは醜いですが、デバッグのために十分に機能します。

#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,&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, &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(&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>(&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(&messages,NULL,0,0)){             
     TranslateMessage(&messages);      
     DispatchMessage(&messages); 
    } 
    return (int)messages.wParam; 
}