| | |
Displaying a JPEG image using Windows GUI
This program shows how to display a JPEG (also GIF,BMP,WMF etc.) image using some Windows Graphical User Interface C code. The program uses the uuid.lib file that comes with many C compilers.
// load and display BMP, GIF, JPG, WMF, EMF, or ICO images // image file Audi.jpg should be in the working directory // filename is specified in FormLoad() and can be changed // BCX generated code is modified for the PellesC compiler // free C compiler with a sweet IDE from: // http://smorgasbordet.com/pellesc/index.htm // free BCX basic to C translator (includes PellesC) from: // http://www.rjpcomputing.com/programming/bcx/devsuite.html // needed headers #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <io.h> // _access() #include <ocidl.h> // LPPICTURE #include <olectl.h> // OleLoadPicture() #include <ole2.h> // CreateStreamOnHGlobal // these are the needed libraries #pragma comment(lib,"uuid.lib") #pragma comment(lib,"ole32.lib") #pragma comment(lib,"oleaut32.lib") // macro #define Show(Window) RedrawWindow(Window,0,0,0);ShowWindow(Window,SW_SHOW); // globals static HINSTANCE BCX_hInstance; static int BCX_ScaleX; static int BCX_ScaleY; static char BCX_ClassName[80]; static HWND Form1; static HWND Jpg1; // prototypes HWND BCX_Form(char*,int=0,int=0,int=250,int=150,int=0,int=0); HWND BCX_OlePicture(char*,HWND=0,int=0,int=0,int=0,int=0,int=0,int=0,int=0,int=0); STDAPI OleLoadPicture(LPSTREAM, LONG, BOOL, REFIID, LPVOID *); void FormLoad (void); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); // standard main for Windows Graphics User Interface (GUI) int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR CmdLine,int CmdShow) { WNDCLASS Wc; MSG Msg; // ***************************** strcpy(BCX_ClassName,"JPEG_FILE1"); // ************************************ // Scale Dialog Units To Screen Units // use of pixels has not been specified // ************************************ RECT rc = {0,0,4,8}; MapDialogRect (NULL,&rc); BCX_ScaleX = rc.right/2; BCX_ScaleY = rc.bottom/4; BCX_hInstance = hInst; // ****************************************************** Wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; Wc.lpfnWndProc = WndProc; Wc.cbClsExtra = 0; Wc.cbWndExtra = 0; Wc.hInstance = hInst; Wc.hIcon = LoadIcon(NULL,IDI_WINLOGO); // standard icon Wc.hCursor = LoadCursor(NULL,IDC_ARROW); // standard cursor Wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); Wc.lpszMenuName = NULL; Wc.lpszClassName = BCX_ClassName; RegisterClass(&Wc); FormLoad(); // message loop while(GetMessage(&Msg,NULL,0,0)) { HWND hActiveWindow = GetActiveWindow(); if (!IsWindow(hActiveWindow) || !IsDialogMessage(hActiveWindow,&Msg)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } } return Msg.wParam; } // create the Windows form HWND BCX_Form(char *Caption, int X, int Y, int W, int H, int Style, int Exstyle) { HWND A; // assign a default style if (!Style) { Style= WS_MINIMIZEBOX | WS_SIZEBOX | WS_CAPTION | WS_MAXIMIZEBOX | WS_POPUP | WS_SYSMENU; } A = CreateWindowEx(Exstyle,BCX_ClassName,Caption, Style, X*BCX_ScaleX, Y*BCX_ScaleY, (4+W)*BCX_ScaleX, (12+H)*BCX_ScaleY, NULL,(HMENU)NULL,BCX_hInstance,NULL); // assign a default font SendMessage(A,(UINT)WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT), (LPARAM)MAKELPARAM(FALSE,0)); return A; } // this is the meat! HWND BCX_OlePicture(char* szFile,HWND hWnd,int id,int X,int Y,int W,int H, int Res,int Style,int Exstyle) { HWND A; HBITMAP hBitmap; DWORD dwFileSize; DWORD dwBytesRead; HANDLE hFile; LPPICTURE gpPicture; LPVOID lpPicData; LPVOID pvData; LPSTREAM pstm; LPVOID hrlp; HGLOBAL hGlobal; // assign a default style if (!Style) Style=WS_CHILD|WS_VISIBLE|WS_TABSTOP|SS_BITMAP; A=CreateWindowEx(Exstyle,"static",NULL,Style,X*BCX_ScaleX,Y*BCX_ScaleY,0,0,hWnd,(HMENU)(HMENU)id,BCX_hInstance,NULL); // in case image is resource, fancier than needs to be if (Res) { hrlp=FindResource(BCX_hInstance,MAKEINTRESOURCE(Res),RT_RCDATA); if (hrlp!=0) { dwFileSize=SizeofResource(BCX_hInstance,hrlp); hGlobal=LoadResource(BCX_hInstance,hrlp); if (hGlobal!=0) { lpPicData=LockResource(hGlobal); pvData=NULL; hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize); pvData=GlobalLock(hGlobal); CopyMemory(pvData,lpPicData,dwFileSize); GlobalUnlock(hGlobal); } } else return NULL; } else { hFile=CreateFile(szFile,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); dwFileSize=GetFileSize(hFile,NULL); if(dwFileSize==-1) return NULL; pvData=NULL; hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize); pvData=GlobalLock(hGlobal); ReadFile(hFile,pvData,dwFileSize,&dwBytesRead,NULL); GlobalUnlock(hGlobal); CloseHandle(hFile); } CreateStreamOnHGlobal(hGlobal,TRUE,&pstm); OleLoadPicture(pstm,0,FALSE,&IID_IPicture,(LPVOID*)&gpPicture); pstm->lpVtbl->Release(pstm); gpPicture->lpVtbl->get_Handle(gpPicture,(OLE_HANDLE*)&hBitmap); if (W || H) hBitmap = CopyImage(hBitmap,IMAGE_BITMAP,W*BCX_ScaleX,H*BCX_ScaleY,LR_COPYRETURNORG); SendMessage(A,(UINT)STM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hBitmap); if (W || H) SetWindowPos(A,HWND_TOP,X*BCX_ScaleX,Y*BCX_ScaleY,W*BCX_ScaleX,H*BCX_ScaleY,SWP_DRAWFRAME); return A; } // details like title, corner coordinates,width,height,filename to load void FormLoad (void) { char filename[80]; Form1=BCX_Form("Display a JPEG from a file ... ",0,0,260,145); // change filename to whatever image file you have!!!!!!!!!!!!!!!!!!!!!!! strcpy(filename,"Audi.jpg"); if ( _access(filename,0) != 0) ExitProcess(0); // width, height = 0,0 adjusts automatically to image Jpg1=BCX_OlePicture(filename,Form1,115,1,1,0,0); Show(Form1); } // message handler LRESULT CALLBACK WndProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { // cleanup and exit program if (Msg == WM_DESTROY) { UnregisterClass(BCX_ClassName,BCX_hInstance); PostQuitMessage(0); } return DefWindowProc(hWnd,Msg,wParam,lParam); } // ******************* credit to Kevin ************************* // Created with BCX -- The BASIC To C Translator (ver 5.02) // BCX (c) 1999, 2000, 2001, 2002, 2003, 2004 by Kevin Diggins // *************************************************************
0
•
•
•
•
OleLoadPicture is murder on the CPU if you want to display jpeg at a fast rate. Do you know of a function which would not take up so much cpu time.
Thanks
Thanks
Similar Threads
- IE7 not displaying all .jpeg - help? (HTML and CSS)
- Word 2000 Not Displaying JPEG (Windows Software)
- converting JPEG colour image into gray scale image?? (Java)
- Flash: displaying JPEG graphics dynamically in movie (Game Development)
- Python and the JPEG Image File, Part 2, The Image (Python)
| Thread Tools | Search this Thread |
#include * ansi array arrays asterisks binarysearch calculate centimeter changingto char character convert copyanyfile copyimagefile copypdffile creafecopyofanytypeoffileinc createprocess() database dynamic execv fflush fgets file floatingpointvalidation fork forloop function getlogicaldrivestrin givemetehcodez grade gtkwinlinux histogram homework i/o ide inches include infiniteloop input interest intmain() iso keyboard km license linked linkedlist linux list looping lowest matrix meter microsoft mysql number oddnumber open opendocumentformat openwebfoundation pdf pointer posix power probleminc process program programming pyramidusingturboccodes radix read recursion recv recvblocked research reversing scheduling segmentationfault send sequential single socket socketprogramming stack standard strchr string suggestions systemcall test threads turboc unix urboc user variable whythiscodecausesegmentationfault win32api windowsapi



