A compiled binary is included. Also, the program will make your photos into directories containing only files (=Images) or folders. Since the program will mess with your folder structure, recommend only running this program with a copy of your images (that you do not mind messing up). I can not be held responsible for any unintended consequences of this program, and any harm that it might cause your data.
Introduction
The following is a description of the Photo Album program I am writing. It is designed to be a standalone photo viewing and editing application. As of now, it is able to load the images and display them as thumbnails. There is also a preview window. The program also lets the user change the image's metadata (or properties) that appear when you click Properties in Windows Explorer and go to the "Summary" tab.
Note that you need to be using the .NET framework version 2.0, as the project uses generics and other features that were only available in version 2.0.
Background
The program currently includes a task pane (like the one in Windows Explorer). However, there are no commands on it yet. These will of course be updated. The taskpane was developed by Mathew Hall, whose article can be found on The Code Project here (great job!).
Using the code
Really, there is no code to re-use in this article. There are a few classes in the "Photo Album Helper Controls" project:
CloseButton
-- Mimics the close button on a tool window (that is the type of window you get when you pull off one of the toolbars in Paint).
ToolWindowTitleBar
-- Mimics the title bar of a tool window. One thing to mention here is that the visual styles (that are part of Windows) aren't quite up to snuff, and don't paint text correctly. If you look at a Windows tool window, you will see that the text is white; yet, when you try and paint it on with the following code, the text paints on black. (This is not a problem with .NET, but rather a problem with Windows.) protected override void OnPaint(PaintEventArgs e)
{
...
VisualStyleRenderer vsr = new VisualStyleRenderer("Window", 2, state);
vsr.DrawText(e.Graphics, new Rectangle(offset, 0,
Width - 3 * offset - h, Height),
Caption, true, TextFormatFlags.EndEllipsis);
...
}
Instead, I had to use the following code:
protected override void OnPaint(PaintEventArgs e)
{
...
e.Graphics.DrawString(Caption, SystemFonts.SmallCaptionFont,
SystemBrushes.ActiveCaptionText,
new RectangleF(offset,
(Height - (int)e.Graphics.MeasureString(Caption,
SystemFonts.SmallCaptionFont).Height)/2,
Width - 3 * offset - h, Height
)
);
...
}
ToolWindowGroup
-- This combines the above two controls into a container control. It looks like a panel that has a title bar tool window header.
One thing to note here is that when you add controls to it, and you dock them, you always want them to be in front (of the title bar, especially when you dock to fill). To accomplish this, I added the following code:
protected override void OnControlAdded(ControlEventArgs e)
{
TitleBar.SendToBack();
}
CyclingProgressBar
-- As the name suggests, this control mimics the progress bar controls, but instead of showing a percentage complete, it cycles. This control is actually an ownerdraw user control, which uses the new visual styles to render. This is actually quite a useful control.
Points of Interest
The code for this project is contained in three different projects. We already mentioned the "PhotoAlbumHelperControls", but in addition to that, there is also a library that mimics the folder tree. It dynamically updates the structure whenever a change occurs on the system. For my purposes however, I needed a set of classes that acted like the folder tree but kept track of images and albums. What is in this library is a result of that. The code in this library has not yet been cleaned up and is still a work in progress. Not every feature has been tested. An interesting thing to note here is that with these classes, you can update the metadata of an image file. Right now, there is only support for the date/time the picture was taken (which changed property number 306 and not the number that Windows uses) and the title of the image. Obviously, there are countless other properties and this is being worked on.
_Photo.Properties.Date.Value = DatePictureTakenDateTimePicker.Value;
History
- 12/14/2004 - First release on The Code Project. Alpha release (really only a viewer).
Coming Features
- Edit all image properties.
- Including special editing of people in the picture, and interfacing with MS Outlook contacts.
- Combining similar images into a multipage TIFF file.
- Other layouts/views including "Slideshow view".
- Image editing.
- Other suggestions welcome.