728x90
반응형
728x170
▶ PictureConverter.cs
using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// PICTURE 변환자
/// </summary>
public static class PictureConverter
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Class
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 그림 설명 - PICTDESC
/// <summary>
/// 그림 설명
/// </summary>
private static class PICTDESC
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// PICTYPE_UNINITIALIZED
/// </summary>
public const short PICTYPE_UNINITIALIZED = -1;
/// <summary>
/// PICTYPE_NONE
/// </summary>
public const short PICTYPE_NONE = 0;
/// <summary>
/// PICTYPE_BITMAP
/// </summary>
public const short PICTYPE_BITMAP = 1;
/// <summary>
/// PICTYPE_METAFILE
/// </summary>
public const short PICTYPE_METAFILE = 2;
/// <summary>
/// PICTYPE_ICON
/// </summary>
public const short PICTYPE_ICON = 3;
/// <summary>
/// PICTYPE_ENHMETAFILE
/// </summary>
public const short PICTYPE_ENHMETAFILE = 4;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Class
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 아이콘 - Icno
/// <summary>
/// 아이콘
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public class Icon
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 크기
/// </summary>
public int Size = Marshal.SizeOf(typeof(PICTDESC.Icon));
/// <summary>
/// 그림 타입
/// </summary>
public int PictureType = PICTDESC.PICTYPE_ICON;
/// <summary>
/// 아이콘 핸들
/// </summary>
public IntPtr IconHandle = IntPtr.Zero;
/// <summary>
/// 미사용 1
/// </summary>
public int Unused1 = 0;
/// <summary>
/// 미사용 2
/// </summary>
public int Unused2 = 0;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - Icon(icon)
/// <summary>
/// 생성자
/// </summary>
/// <param name="icon">아이콘</param>
public Icon(System.Drawing.Icon icon)
{
IconHandle = icon.ToBitmap().GetHicon();
}
#endregion
}
#endregion
#region 비트맵 - Bitmap
/// <summary>
/// 비트맵
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public class Bitmap
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 크기
/// </summary>
public int Size = Marshal.SizeOf(typeof(PICTDESC.Bitmap));
/// <summary>
/// 그림 타입
/// </summary>
public int PictureType = PICTDESC.PICTYPE_BITMAP;
/// <summary>
/// 비트맵 핸들
/// </summary>
public IntPtr BitmapHandle = IntPtr.Zero;
/// <summary>
/// 팔레트 핸들
/// </summary>
public IntPtr PaletteHandle = IntPtr.Zero;
/// <summary>
/// 미사용
/// </summary>
public int Unused = 0;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - Bitmap(bitmap)
/// <summary>
/// 생성자
/// </summary>
public Bitmap(System.Drawing.Bitmap bitmap)
{
BitmapHandle = bitmap.GetHbitmap();
}
#endregion
}
#endregion
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Import
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region OLE 그림 생성하기 (간접) - OleCreatePictureIndirect(pictureDescription, interfaceID, own);
/// <summary>
/// OLE 그림 생성하기 (간접)
/// </summary>
/// <param name="pictureDescription">그림 설명</param>
/// <param name="interfaceID">인터페이스 ID</param>
/// <param name="own">소유 여부</param>
/// <returns>IPictureDisp 인터페이스 객체</returns>
[DllImport("OleAut32.dll", EntryPoint = "OleCreatePictureIndirect", ExactSpelling = true, PreserveSig = false)]
private static extern stdole.IPictureDisp OleCreatePictureIndirect([MarshalAs(UnmanagedType.AsAny)] object pictureDescription, ref Guid interfaceID, bool own);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// IPictureDisp 인터페이스 GUID
/// </summary>
private static Guid _iPictureDispGUID = typeof(stdole.IPictureDisp).GUID;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region IPictureDisp 인터페이스 객체 구하기 - ToPicture(icon)
/// <summary>
/// IPictureDisp 인터페이스 객체 구하기
/// </summary>
/// <param name="icon">아이콘</param>
/// <returns>IPictureDisp 인터페이스 객체</returns>
public static stdole.IPictureDisp ToPicture(Icon icon)
{
PICTDESC.Icon pictDescIcon = new PICTDESC.Icon(icon);
return OleCreatePictureIndirect(pictDescIcon, ref _iPictureDispGUID, true);
}
#endregion
#region IPictureDisp 인터페이스 객체 구하기 - ToPicture(image)
/// <summary>
/// IPictureDisp 인터페이스 객체 구하기
/// </summary>
/// <param name="image">이미지</param>
/// <returns>IPictureDisp 인터페이스 객체</returns>
public static stdole.IPictureDisp ToPicture(Image image)
{
Bitmap bitmap = (image is Bitmap) ? (Bitmap)image : new Bitmap(image);
PICTDESC.Bitmap pictDescBitmap = new PICTDESC.Bitmap(bitmap);
return OleCreatePictureIndirect(pictDescBitmap, ref _iPictureDispGUID, true);
}
#endregion
}
}
728x90
▶ CustomAddIn.cs
using Microsoft.Office.Interop.Outlook;
using System;
using System.Drawing;
namespace TestProject
{
/// <summary>
/// 커스텀 애드인
/// </summary>
public partial class CustomAddIn
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 애플리케이션
/// </summary>
private Application application = null;
/// <summary>
/// 타겟 폴더
/// </summary>
private Folder targetFolder = null;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 커스텀 애드인 시작시 처리하기 - CustomAddIn_Startup(sender, e)
/// <summary>
/// 커스텀 애드인 시작시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void CustomAddIn_Startup(object sender, EventArgs e)
{
this.application = Application;
// Outlook에서 계정 폴더 아래에 Parent\Child 폴더가 사전에 생성되어 있어야 한다.
Folder parentFolder = this.application.ActiveExplorer().Session.Folders[1].Folders["Parent"] as Folder;
this.targetFolder = parentFolder.Folders["Child"] as Folder;
SetCustomIcon(this.targetFolder);
}
#endregion
#region 커스텀 애드인 셧다운시 처리하기 - CustomAddIn_Shutdown(sender, e)
/// <summary>
/// 커스텀 애드인 셧다운시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void CustomAddIn_Shutdown(object sender, EventArgs e)
{
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region VSTO에서 생성한 코드
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(CustomAddIn_Startup );
this.Shutdown += new System.EventHandler(CustomAddIn_Shutdown);
}
#endregion
#region 커스텀 아이콘 설정하기 - SetCustomIcon(folder)
/// <summary>
/// 커스텀 아이콘 설정하기
/// </summary>
/// <param name="folder">폴더</param>
private void SetCustomIcon(MAPIFolder folder)
{
Bitmap bitmap = null;
try
{
bitmap = Properties.Resources.sample;
stdole.StdPicture picture = PictureConverter.ToPicture(bitmap) as stdole.StdPicture;
folder.SetCustomIcon(picture);
}
finally
{
bitmap.Dispose();
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Outlook' 카테고리의 다른 글
[C#/OUTLOOK] Explorer 인터페이스 : Selection 속성 사용하기 (0) | 2021.07.08 |
---|---|
[C#/OUTLOOK] Explorer 인터페이스 : Selection 속성을 사용해 선택 메일 항목 열거 가능형 구하기 (0) | 2021.07.08 |
[C#/OUTLOOK] 메일 컨텍스트 메뉴에서 커스텀 컨텍스트 메뉴 추가하기 (0) | 2021.07.05 |
[C#/OUTLOOK] 폴더 컨텍스트 메뉴에서 커스텀 컨텍스트 메뉴 추가하기 (기능 개선) (0) | 2021.07.05 |
[C#/OUTLOOK] 폴더 컨텍스트 메뉴에서 커스텀 컨텍스트 메뉴 추가하기 (0) | 2021.07.04 |
[C#/OUTLOOK] MailItem 인터페이스 : 메일 아이콘 설정하기 (0) | 2021.07.02 |
[C#/OUTLOOK] 신규 메일 수신시 지정 폴더로 이동시키기 (0) | 2021.06.24 |
[C#/OUTLOOK] ExplorerEvents_10_Event 인터페이스 : FolderSwitch/SelectionChange 이벤트 사용하기 (0) | 2021.06.24 |
[C#/OUTLOOK] COMAddIn 인터페이스 : Connect 속성을 사용해 애드인 언로드시키기 (0) | 2021.06.24 |
[C#/OUTLOOK] _Explorer 인터페이스 : Selection 속성을 사용해 선택 메일 항목 열거 가능형 구하기 (0) | 2021.06.24 |
댓글을 달아 주세요