2009-12-02 4 views
2

Je tente d'obtenir la solution TwainDotNet que j'ai trouvée ici (C# TWAIN interaction) pour compiler, et je suis à bout de nerfs.Comment implémenter les propriétés automatiques dans VS 2005 pour un rappel de délégué

Cette solution a bien évidemment été développée en VS 2008, et je travaille en 2005 (pas de choix pour l'instant). J'ai passé beaucoup de temps à compiler tout cela en 2005, et j'ai réduit mes erreurs à deux, les deux étant le même problème.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 

namespace TwainDotNet.WinFroms 
{ 
    /// <summary> 
    /// A windows message hook for WinForms applications. 
    /// </summary> 
    public class WinFormsWindowMessageHook : IWindowsMessageHook, IMessageFilter 
    { 
    IntPtr _windowHandle; 
    bool _usingFilter; 

    public WinFormsWindowMessageHook(Form window) 
    { 
     _windowHandle = window.Handle; 
    } 

    public bool PreFilterMessage(ref Message m) 
    { 
     if (FilterMessageCallback != null) 
     { 
     bool handled = false; 
     FilterMessageCallback(m.HWnd, m.Msg, m.WParam, m.LParam, ref handled); 
     return handled; 
     } 

     return false; 
    } 

    public IntPtr WindowHandle { get { return _windowHandle; } } 

    public bool UseFilter 
    { 
     get 
     { 
     return _usingFilter; 
     } 

     set 
     { 
     if (!_usingFilter && value == true) 
     { 
      Application.AddMessageFilter(this); 
      _usingFilter = true; 
     } 

     if (_usingFilter && value == false) 
     { 
      Application.RemoveMessageFilter(this); 
      _usingFilter = false; 
     } 
     } 
    } 

    public FilterMessage FilterMessageCallback 
    { 
     get; 
     set; 
    } 
    } 

} 

La compilation échoue sur la propriété accédant à l'instance de délégué.

ERROR: 'TwainDotNet.WinFroms.WinFormsWindowMessageHook.FilterMessageCallback.get' doit déclarer un corps parce qu'il est pas marqué abstraite ou extern

Voici l'interface IWindowsMessageHook que cette classe implémente:

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace TwainDotNet 
{ 
    public interface IWindowsMessageHook 
    { 
    /// <summary> 
    /// Gets or sets if the message filter is in use. 
    /// </summary> 
    bool UseFilter { get; set; } 

    /// <summary> 
    /// The delegate to call back when the filter is in place and a message arrives. 
    /// </summary> 
    FilterMessage FilterMessageCallback { get; set; } 

    /// <summary> 
    /// The handle to the window that is performing the scanning. 
    /// </summary> 
    IntPtr WindowHandle { get; } 
    } 

    public delegate IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled); 
} 

J'avoue être un débutant délégué, et je suis à perte ici. Comment puis-je dupliquer cette fonctionnalité dans VS 2005?

Merci pour le temps.

Répondre

0

champ de support:

private FilterMessage m_FilterMessageCallback; 
public FilterMessage FilterMessageCallback 
{ 
    get { return m_FilterMessageCallback; } 
    set { m_FilterMessageCallback = value; } 
} 

Le code dans votre interface

FilterMessage FilterMessageCallback { get; set; } 

a BTW. rien à voir avec C# 2.0/3.0, c'est une définition normale d'inteface avec setter et getter.

+0

Merci beaucoup les gars. Je ne savais pas ce que le compilateur VS 2008 pourrait faire sous le capot - je suppose qu'il fait une version de cette chose même? – Ducain

+0

Oui, c'est exactement pareil. – tanascius

0

Un événement peut être souhaitable, mais comme une propriété déléguée:

private FilterMessage filterMessageCallback; 
public FilterMessage FilterMessageCallback 
{ 
    get {return filterMessageCallback;} 
    set { filterMessageCallback = value;} 
} 

Pour éviter un bord cas (fil course/null), vous pouvez également:

public bool PreFilterMessage(ref Message m) 
{ 
    FilterMessage callback = FilterMessageCallback; 
    if (callback != null) 
    { 
    bool handled = false; 
    callback(m.HWnd, m.Msg, m.WParam, m.LParam, ref handled); 
    return handled; 
    } 

    return false; 
} 
0

Fill dans les blancs dans la déclaration de propriété - rien de magique ne se passe:

private FilterMessage _filterMessageCallback; 

public FilterMessage FilterMessageCallback 
{ 
    get { return _filterMessageCallback; } 
    set { _filterMessageCallback = value; } 
} 
Questions connexes