Windows-приложение для просмотра графических файлов
Министерство
образования и науки Российской Федерации
ФГАОУ ВПО
«УРАЛЬСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ
имени
первого Президента России Б.Н.Ельцина»
ПОЯСНИТЕЛЬНАЯ
ЗАПИСКА
к курсовой
работе
«Windows
приложение для просмотра графических файлов»
Руководитель
Зеленская Е.В.
Студент
Семенкин Л.В.
Группа
Р-38032
Екатеринбург
2010
Содержание
Введение
. Теоретическая часть
.1 Обозреватель графических файлов
.2 Библиотека классов GDI+
. Инструкция программиста
. Инструкция пользователя
. Тестирование
Заключение
Библиографический список
Приложение. Исходный текст программы
Введение
В настоящее время, обозреватель графических
файлов является одной из тех программ, без которых обычный пользователь не
представляет свой компьютер. Большинство людей хранит на своем компьютере
фотографии, картинки и для их просмотра необходима такая программа.
Современные графические обозреватели
поддерживают большое количество форматов, и имеют возможность редактирования
графики, в нашем обозревателе эта функция отсутствует.
1.Теоретическая часть
.1 Обозреватель графических файлов
Обозреватель графических файлов -
компьютерная программа
<#"871107.files/image001.jpg">
Рис 1.
Открытие директории (рис.2)
Рис 2
Заключение
графический обозреватель файл
редактирование
В данной курсовой работе была реализована
программа для просмотра графических файлов. Программа оснащена набором функций:
открывания как одного файла, так и директории, перелистывание файлов при помощи
кнопок “далее” и “обратно”, так же пишется информация о файле: имя файла, тип и
размер в байтах.
В ходе выполнения работы, мной были закреплены
навыки работы с объектно-ориентированным программированием в среде .NET,
в том числе я познакомился с этапами разработки программного обеспечения.
Получены навыки создания приложений для ОС Windows,
среди них работа с графическим интерфейсом, подключение библиотек DGIPlus.
Реализованная мною программа была разработана в
рамках учебного процесса, в связи с этим не имеет высокой конкурентно
способности, тем не менее, в дальнейшем возможна оптимизация работы программы,
увеличения числа функций, возможность редактирования графического файла
Библиографический список
1. Щупак
Ю.А.
“Win32 API. Эффективная разработка приложений” Учебник -
СПб.: ПИТЕР, 2007
. “Компьютерная
документация от А до Я”://www.compdoc.ru/prog/cpp/cpplesson95/index6.shtml
Приложение
Исходный текст программы.
Файл FilesListMaker.cpp
#include "stdafx.h"
#include "FilesListMaker.h"
#include <shlwapi.h> //add lib
ShLwApi.libFilesListMaker::AddFilter(TCHAR *tFilter)
{FilterToAdd;(FilterToAdd.FileExt,tFilter,FILTER_MAX_LEN);((LPWSTR)FilterToAdd.FileExt,FILTER_MAX_LEN);.push_back(FilterToAdd);
}FilesListMaker::DeleteFilter(TCHAR *tFilter)
{FilterToDel;(FilterToDel.FileExt,tFilter,FILTER_MAX_LEN);((LPWSTR)FilterToDel.FileExt,FILTER_MAX_LEN);<FileExtFilter>::iterator
it=AllowedExtensions.begin();(it;it!=AllowedExtensions.end();it++)
{(!lstrcmp((*it).FileExt,FilterToDel.FileExt))
{.erase(it);;
}
}
}FilesListMaker::AddFile(TCHAR *tFullFileName)
{fnFileToAdd;(fnFileToAdd.FileName,PathFindFileName(tFullFileName),MAX_FILENAME_LEN);(fnFileToAdd.FullFilePath,tFullFileName,MAX_FULL_PATH_LEN);.push_back(fnFileToAdd);
}FilesListMaker::AddGroupOfFiles(TCHAR
*tFileDir)
{fnFileToAdd;dir[MAX_FULL_PATH_LEN+2];_FIND_DATA
w32SearchingFile;(&w32SearchingFile,sizeof(WIN32_FIND_DATA));(dir,tFileDir,MAX_FULL_PATH_LEN-1);(dir,_TEXT("\\*"));hFile=FindFirstFile(dir,&w32SearchingFile);(hFile!=INVALID_HANDLE_VALUE)
{(fnFileToAdd.FileName,w32SearchingFile.cFileName,(MAX_FILENAME_LEN,MAX_PATH));(fnFileToAdd.FullFilePath,tFileDir,MAX_FULL_PATH_LEN-MAX_FILENAME_LEN-1);(fnFileToAdd.FullFilePath,_TEXT("\\"));(fnFileToAdd.FullFilePath,fnFileToAdd.FileName);(FiltrateFile(fnFileToAdd.FullFilePath))
{.push_back(fnFileToAdd);
}
}(FindNextFile(hFile,&w32SearchingFile))
{(fnFileToAdd.FileName,w32SearchingFile.cFileName,(MAX_FILENAME_LEN,MAX_PATH));(fnFileToAdd.FullFilePath,tFileDir,MAX_FULL_PATH_LEN-MAX_FILENAME_LEN-1);(fnFileToAdd.FullFilePath,_TEXT("\\"));(fnFileToAdd.FullFilePath,fnFileToAdd.FileName);(FiltrateFile(fnFileToAdd.FullFilePath))
{.push_back(fnFileToAdd);
}
}(hFile);
/*vector<FileNames>::iterator
it=Files.begin();(it;it!=Files.end();it++)
{(0,(*it).FullFilePath,
(*it).FileName,MB_OK);
}*/
}FilesListMaker::DeleteFileFromList(TCHAR*
tFullPathToFile)
{<FileNames>::iterator
it=Files.begin();(it;it!=Files.end();it++)
{.erase(it);;
}
}
}FilesListMaker::DelteFileFromListByIndex(long
lIndex)
{.erase(Files.begin()+lIndex);
}FilesListMaker::ClearFileList()
{.erase(Files.begin(),Files.end());
}FilesListMaker::ClearFilterList()
{.erase(AllowedExtensions.begin(),.end());
}FilesListMaker::FiltrateFile(TCHAR
*tFullPathToFile)
{FileExt[FILTER_MAX_LEN];(FileExt,PathFindExtension(tFullPathToFile),FILTER_MAX_LEN);((LPWSTR)FileExt,FILTER_MAX_LEN);<FileExtFilter>::iterator
it=AllowedExtensions.begin();(it;it!=AllowedExtensions.end();it++)
{(!lstrcmp((*it).FileExt,FileExt))
{true;;
}
}false;
}* FilesListMaker::operator [](unsigned long
lIndex)
{(lIndex<Files.size()&&(Files.size()>0))
{Files[lIndex].FullFilePath;
}
{(Files.size())Files[0].FullFilePath;return
NULL;
}
}* FilesListMaker::GetShortNameByIndex(unsigned
long lIndex)
{(lIndex<Files.size()&&(Files.size()>0))Files[lIndex].FileName;
{(Files.size())Files[0].FileName;return NULL;
}
}
Файл PictureViewer_with_GdiPlus.cpp
#include "stdafx.h"
#include
"PictureViewer_with_GdiPlus.h"
#include "GDIPlusLoader.h"
#include "FilesListMaker.h"
#include <commdlg.h>
#include <shlobj.h>
#include <shlwapi.h>namespace AdvDrawing;
#define MAX_LOADSTRING 100
#define XStart 50
#define YStart 20
#define MinWidth 950
#define MinHeight 660
#define MaxWidth 1000
#define MaxHeight 700
#define OPENFILE 11
#define CHOOSEDIR 22
#define FORWARD 33
#define BACKWARD 44
#define FILESLIST 55
// Global Variables:hInst; //
current instanceszTitle[MAX_LOADSTRING]; //
The title bar textszWindowClass[MAX_LOADSTRING]; // the
main window class name
// Forward declarations of functions included in
this code module: MyRegisterClass(HINSTANCE
hInstance); InitInstance(HINSTANCE,
int);CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);_PTR CALLBACK About(HWND,
UINT, WPARAM, LPARAM);Paint(HDC hdc, const RECT* rect, TCHAR* tFileName, HWND
hWnd);APIENTRY _tWinMain(HINSTANCE hInstance,hPrevInstance,lpCmdLine,nCmdShow)
{GdiPlus;_PARAMETER(hPrevInstance);_PARAMETER(lpCmdLine);
// TODO: Place code here.msg;hAccelTable;
// Initialize global strings(hInstance,
IDS_APP_TITLE, szTitle, MAX_LOADSTRING);(hInstance, IDC_PICTUREVIEWER_WITH_GDIPLUS,
szWindowClass, MAX_LOADSTRING);(hInstance);
// Perform application
initialization:(!InitInstance (hInstance, nCmdShow))
{FALSE;
}= LoadAccelerators(hInstance,
MAKEINTRESOURCE(IDC_PICTUREVIEWER_WITH_GDIPLUS));
// Main message loop:(GetMessage(&msg, NULL,
0, 0))
{(msg.message==WM_DESTROY)
{.~GDIPlusLoader();
}(!TranslateAccelerator(msg.hwnd, hAccelTable,
&msg))
{(&msg);(&msg);
}
}(int) msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only
necessary if you want this code
// function that was added to Windows 95. It is
important to call this function
// so that the application will get 'well
formed' small icons associated
// with it.
//MyRegisterClass(HINSTANCE hInstance)
{wcex;.cbSize = sizeof(WNDCLASSEX);.style =
CS_HREDRAW | CS_VREDRAW;.lpfnWndProc = WndProc;.cbClsExtra =
0;.cbWndExtra = 0;.hInstance = hInstance;.hIcon =
LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PICTUREVIEWER_WITH_GDIPLUS));.hCursor =
LoadCursor(NULL, IDC_ARROW);.hbrBackground =
(HBRUSH)(COLOR_WINDOW+1);.lpszMenuName =
MAKEINTRESOURCE(IDC_PICTUREVIEWER_WITH_GDIPLUS);.lpszClassName =
szWindowClass;.hIconSm = LoadIcon(wcex.hInstance,
MAKEINTRESOURCE(IDI_SMALL));RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates
main window
//
// COMMENTS:
//
// In this function, we save the instance handle
in a global variable and
// create and display the main program window.
//InitInstance(HINSTANCE hInstance, int
nCmdShow)
{hWnd;= hInstance; // Store instance handle in
our global variable= CreateWindow(szWindowClass, szTitle,_OVERLAPPEDWINDOW,,
YStart, MinWidth, MinHeight,, NULL, hInstance, NULL);(!hWnd)
{FALSE;
}(hWnd, nCmdShow);(hWnd);TRUE;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main
window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and
return
//
//CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
#define RELATIVE_X_OPForDBUTTON_COORD 4.2
#define RELATIVE_Y_OPForDBUTTON_COORD 14
#define BUTTON_WIDTH 38
#define BUTTON_HEIGHT 38
#define BUTTON_SPACING 40wmId, wmEvent;ps;RECT
clRect;RECT* rWinSize;int CurWidth,CurHeight;long lListIndex=0;FilesListMaker
GraphFiles;hdc;HWND hOpenFBut,hChooseDirBut,,hBackwBut,hFilesListLb;HBITMAP
hOpFIc,hChDIc, hForwBIc, hBackwBIc;OPENFILENAME ofnOpenGr;BROWSEINFO
biPath;ITEMIDLIST* iList;TCHAR FullPath[MAX_FULL_PATH_LEN],
FileName[MAX_FILENAME_LEN];dwErr;txt[10];(message)
{WM_CREATE:=CreateWindow(_TEXT("BUTTON"),,_CHILD|BS_PUSHBUTTON|BS_BITMAP,//WS_CHILD,
,48,_WIDTH,_HEIGHT,,(OPENFILE),(NULL),NULL);(hOpenFBut,SW_SHOW);=CreateWindow(_TEXT("BUTTON"),,_CHILD|BS_PUSHBUTTON|BS_BITMAP,
,48+BUTTON_SPACING,_WIDTH,_HEIGHT,hWnd,(CHOOSEDIR),(NULL),NULL);(hChooseDirBut,SW_SHOW);=CreateWindow(_TEXT("BUTTON"),,_CHILD|BS_PUSHBUTTON|BS_BITMAP,
,570,_WIDTH,_HEIGHT,hWnd,(FORWARD),(NULL),NULL);(hForwBut,SW_SHOW);=CreateWindow(_TEXT("BUTTON"),,_CHILD|BS_PUSHBUTTON|BS_BITMAP,
,570,_WIDTH,_HEIGHT,hWnd,(BACKWARD),(NULL),NULL);(hBackwBut,SW_SHOW);=CreateWindow(_TEXT("LISTBOX"),
_TEXT("Список файлов"),_CHILD,//|LBS_DISABLENOSCROLL
,//|LBS_MULTICOLUMN,
,180,
,//BUTTON_WIDTH,
,//BUTTON_HEIGHT,,(FILESLIST),(NULL),NULL);(hFilesListLb,SW_SHOW);=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_OPFILE));=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_OPDIR));=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_FORW));=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BACKW));(hOpenFBut,BM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hOpFIc);(hChooseDirBut,BM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hChDIc);(hForwBut,BM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hForwBIc);(hBackwBut,BM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBackwBIc);
//dwErr=GetLastError();
//swprintf(txt,10,L"%d",dwErr);
//MessageBox(0,txt,_TEXT("
"),MB_OK);(hOpenFBut);.AddFilter(_TEXT(".BMP"));.AddFilter(_TEXT(".JPEG"));.AddFilter(_TEXT(".JPG"));.AddFilter(_TEXT(".TIFF"));.AddFilter(_TEXT(".GIF"));.AddFilter(_TEXT(".PNG"));.lStructSize=sizeof(OPENFILENAME);.lpstrFile=FullPath;.nMaxFile=MAX_FULL_PATH_LEN;.lpstrFileTitle=FileName;.nMaxFileTitle=MAX_FILENAME_LEN;;WM_COMMAND:=
LOWORD(wParam);= HIWORD(wParam);
// Parse the menu selections:(wmId)
{IDM_EXIT:(hWnd);;OPENFILE:(GetOpenFileName(&ofnOpenGr))
{
//MessageBox(hWnd,FullPath,FileName,MB_OK);(hFilesListLb,LB_ADDSTRING,0,(LPARAM)FileName);.AddFile(FullPath);
}++;(hFilesListLb,LB_SETCURSEL,(WPARAM)lListIndex,0);(hWnd,&clRect,TRUE);(hWnd);;CHOOSEDIR:=SHBrowseForFolder(&biPath);(iList,FullPath);.AddGroupOfFiles(FullPath);(long
i=0; i<GraphFiles.GetFilesListSize();i++)(hFilesListLb,LB_ADDSTRING,0,
(LPARAM)GraphFiles.GetShortNameByIndex(i));=0;(hFilesListLb,LB_SETCURSEL,lListIndex,0);(hWnd,&clRect,TRUE);(hWnd);;FORWARD:(lListIndex<GraphFiles.GetFilesListSize()-1)++;lListIndex=0;(hFilesListLb,LB_SETCURSEL,lListIndex,0);(hWnd,&clRect,TRUE);(hWnd);;BACKWARD:(lListIndex)-;lListIndex=0;(hFilesListLb,LB_SETCURSEL,lListIndex,0);(hWnd,&clRect,TRUE);(hWnd);;FILESLIST:(hWnd,&clRect,TRUE);(hWnd);;
};;WM_PAINT:= BeginPaint(hWnd,
&ps);(hWnd,&clRect);(hdc,&clRect,GraphFiles[lListIndex],
hWnd);(hWnd, &ps);;WM_SIZING:=(RECT*)lParam;(rWinSize->right>MaxWidth)
{>right=MaxWidth;=MaxWidth;
}(rWinSize->bottom>MaxHeight)
{>bottom=MaxHeight;=MaxHeight;
}(rWinSize->right<MinWidth)
{>right=MinWidth;=MinWidth;
}(rWinSize->bottom<MinHeight)
{>bottom=MinHeight;=MinHeight;
}
{=rWinSize->bottom;=rWinSize->right;
}(hOpenFBut,HWND_TOP,
(int)((double)CurWidth/RELATIVE_X_OPForDBUTTON_COORD),
(int)((double)CurHeight/RELATIVE_Y_OPForDBUTTON_COORD),_WIDTH,BUTTON_HEIGHT,SWP_SHOWWINDOW);(hChooseDirBut,HWND_TOP,
(int)((double)CurWidth/RELATIVE_X_OPForDBUTTON_COORD),
(int)((double)CurHeight/RELATIVE_Y_OPForDBUTTON_COORD)+BUTTON_SPACING,_WIDTH,BUTTON_HEIGHT,SWP_SHOWWINDOW);(hForwBut,HWND_TOP,
(int)((double)CurWidth*0.7),
(int)((double)CurWidth*0.4),
(int)((double)(CurHeight-CurHeight/6.2)),_WIDTH,BUTTON_HEIGHT,SWP_SHOWWINDOW);(hFilesListLb,HWND_TOP,
(int)((double)CurWidth*0.005),
(int)((double)(CurHeight-CurHeight/1.36)),
(int)((double)CurWidth*0.17),
(int)((double)(CurHeight-CurHeight/2.5)),_SHOWWINDOW);;WM_SYSCOMMAND:(LOWORD(wParam))
{SC_MAXIMIZE:;:DefWindowProc(hWnd, message,
wParam, lParam);;
};WM_DESTROY:(0);;:DefWindowProc(hWnd, message,
wParam, lParam);
}0;
}Paint(HDC hdc, const RECT* rect, TCHAR*
tFileName, HWND hWnd)
{
#define VERT_DIVIZOR 5
#define HOR_SPLITTER_DIVIZOR 4
#define IMAGE_BORDER_DIVIZOR 5
#define RIGHT_BORDER 3.5
#define BOTTOM_BORDER 3.5
#define INFO_LEN 50tTitle[]=_TEXT("Выберите
изображение для просмотра:");tInfoStr1Title[]=_TEXT("Имя файла:
");tInfoStr2Title[]=_TEXT("Тип файла:
");tInfoStr3Title[]=_TEXT("Размер:
");tInfoStr1[INFO_LEN];tInfoStr2[INFO_LEN];tInfoStr3[INFO_LEN];tBuf1[INFO_LEN],
tBuf2[INFO_LEN];tFList[]=_TEXT("Cписок файлов: ");iVLine=(int)((double)(rect->right/VERT_DIVIZOR));iHorSplitLine=(int)((double)(rect->bottom/HOR_SPLITTER_DIVIZOR));_FILE_ATTRIBUTE_DATA
FileData;graph(hdc);MainPen(Color::Silver,3);BorderPen(Color::OrangeRed,3);Format;.SetAlignment(Gdiplus::StringAlignmentNear);//StringAlignment);.SetLineAlignment(StringAlignmentNear);mainFont(_TEXT("Arial"),22,FontStyleItalic);suppFont(_TEXT("Arial"),8,FontStyleItalic);clRect((REAL)rect->left,(REAL)rect->top,
(REAL)rect->right,(REAL)rect->bottom);GrBrush(clRect,Color(130,255,0,0),(255,0,0,255),);BgBrush(Color::LightGray);.FillRectangle(&BgBrush,clRect);TitleRect((REAL)iVLine+50,10,(REAL)rect->right,20+22);InfoRect1((REAL)10,10,(REAL)iVLine-5,16);InfoRect2((REAL)10,36,(REAL)iVLine-5,16);InfoRect3((REAL)10,62,(REAL)iVLine-5,16);FilesListRect((REAL)10,iHorSplitLine+10,(REAL)iVLine-5,16);.DrawString(tTitle,sizeof(tTitle)/sizeof(TCHAR)-1,
&mainFont,TitleRect,&Format,&GrBrush);.DrawString(tFList,sizeof(tFList)/sizeof(TCHAR)-1,
&suppFont,FilesListRect,&Format,&GrBrush);(tFileName==NULL)
{.DrawString(tInfoStr1Title,sizeof(tInfoStr1Title)/sizeof(TCHAR)-1,
&suppFont,InfoRect1,&Format,&GrBrush);.DrawString(tInfoStr2Title,sizeof(tInfoStr2Title)/sizeof(TCHAR)-1,
&suppFont,InfoRect2,&Format,&GrBrush);.DrawString(tInfoStr3Title,sizeof(tInfoStr3Title)/sizeof(TCHAR)-1,
&suppFont,InfoRect3,&Format,&GrBrush);
}
{(tFileName,GetFileExInfoStandard,&FileData);(tInfoStr3,tInfoStr3Title);(tBuf1,10,L"%d",FileData.nFileSizeLow);(tInfoStr3,tBuf1);(tInfoStr3,_TEXT("
байт"));(tInfoStr2,tInfoStr2Title);(tBuf1,PathFindExtension(tFileName),INFO_LEN);(tInfoStr2,tBuf1);(tInfoStr1,tInfoStr1Title);(tBuf1,PathFindFileName(tFileName),INFO_LEN);(tInfoStr1,tBuf1);.DrawString(tInfoStr1,-1,
&suppFont,InfoRect1,&Format,&GrBrush);.DrawString(tInfoStr2,-1,
&suppFont,InfoRect2,&Format,&GrBrush);.DrawString(tInfoStr3,-1,//sizeof(tInfoStr3)/sizeof(TCHAR)-1,
&suppFont,InfoRect3,&Format,&GrBrush);
}VerticalLine[2]={Point(iVLine,0),(iVLine,rect->bottom)};HorSplitLine[2]={Point(0,iHorSplitLine),(iVLine,iHorSplitLine)};.DrawLines(&BorderPen,VerticalLine,(VerticalLine)/sizeof(Point));.DrawLines(&BorderPen,HorSplitLine,(HorSplitLine)/sizeof(Point));PictureBorder((REAL)iVLine+50,(REAL)((int)((double)(rect->bottom/IMAGE_BORDER_DIVIZOR))+10),
(REAL)(rect->right-((int)((double)(rect->right/RIGHT_BORDER)))),
(REAL)(rect->bottom-((int)((double)(rect->bottom/BOTTOM_BORDER)))));.DrawRectangle(&MainPen,PictureBorder);(tFileName==NULL)
{.FillRectangle(&SolidBrush(Color::WhiteSmoke),);
}PicRect;(tFileName!=NULL)
{img(tFileName);.DrawImage(&img,PictureBorder);
}
Файл GdiPlusLoader.cpp
#include "stdafx.h"
#include "GdiPlusLoader.h"
#pragma comment(lib,"gdiplus.lib")
#ifndef DEBUG
#pragma comment(lib,"gdiplus.lib")
//#pragma
comment(linker,"/delayload:gdiplus.dll")
#endifAdvDrawing
{::GDIPlusLoader()
{=true;::GdiplusStartupInput gdipInput;
__try
{::GdiplusStartup(&upToken,&gdipInput,0);
}
__except(1)
{=false;
}
}::~GDIPlusLoader()
{(bSuccessInit)
Gdiplus::GdiplusShutdown(upToken);
}
}