2010-12-02 5 views
0

LINK: http://www.codeproject.com/KB/dotnet/twaindotnet.aspxКак работает этот код? [ЖЕСТКИЙ]

Я пытаюсь создать класс-оболочку для этого открытой реализации .NET Самом и у меня возникают проблемы понять, как это на самом деле получает изображение.

Я загрузил исходный код, а в графическом интерфейсе есть кнопка Acquire. При нажатии на эту кнопку, чтобы перейти к это обработчик событий я нахожу этот код, который я предполагаю, что получает изображение:

private void menuItemScan_Click(object sender, System.EventArgs e) 
{ 
    if (!msgfilter) 
    { 
     this.Enabled = false; 
     msgfilter = true; 
     Application.AddMessageFilter(this); 
    } 
    tw.Acquire(); 
} 

Если я следовать методу Приобретать(), чтобы увидеть его содержимое, я вижу это:

public void Acquire() 
{ 
    TwRC rc; 
    CloseSrc(); 
    if (appid.Id == IntPtr.Zero) 
    { 
     Init(hwnd); 
     if (appid.Id == IntPtr.Zero) 
      return; 
    } 
    rc = DSMident(appid, IntPtr.Zero, TwDG.Control, TwDAT.Identity, TwMSG.OpenDS, srcds); 
    if (rc != TwRC.Success) 
     return; 

    TwCapability cap = new TwCapability(TwCap.XferCount, 1); 
    rc = DScap(appid, srcds, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap); 
    if (rc != TwRC.Success) 
    { 
     CloseSrc(); 
     return; 
    } 

    TwUserInterface guif = new TwUserInterface(); 
    guif.ShowUI = 1; 
    guif.ModalUI = 1; 
    guif.ParentHand = hwnd; 
    rc = DSuserif(appid, srcds, TwDG.Control, TwDAT.UserInterface, TwMSG.EnableDS, guif); 
    if (rc != TwRC.Success) 
    { 
     CloseSrc(); 
     return; 
    } 
} 

Что я не понимаю, так это то, как метод с возвращаемым типом «void» может иметь оператор return. Кроме того, где он приобретает и возвращает изображение?

Может ли кто-нибудь помочь?

Я пытаюсь создать полезную оболочку и с открытым исходным кодом, потому что, поскольку она стоит, нет простого решения перетаскивания для сканирования изображений на C#.

Спасибо за помощь!

Редактировать: Спасибо за помощь относительно ранних возвратов. TIL! Теперь мне интересно, как приложение получает изображения для отображения в форме.

Любые указания?

+2

@Serg - Вы можете вызвать return, чтобы завершить метод.Последнее возвращение не имеет значения, потому что метод заканчивается после оператора if. – tpow 2010-12-02 13:11:18

ответ

3

«Пустота» означает, что он ничего не возвращает, а не то, что он не возвращается. Таким образом, оператор возврата только завершает функцию и возвращает вызывающие

Для другого вопроса, есть несколько других соответствующих вопросов переполнения стека

DSCap линия видна, если есть несколько изображений. Захват происходит как часть вызова DSuserif

+0

Ах спасибо! А как насчет приобретения изображения. Вы видите, где у него есть элемент «Изображение»? – 2010-12-02 13:17:27

0

Метод просто возвращает void, чтобы избежать выполнения других выполняемых сегментов кода. Это совершенно законно. Метод не приобретает изображение, он только готовит аппаратное обеспечение и пользовательский интерфейс, который приобретает изображение, я бы сказал.

0

return; заставляет поток управления выйти из функции.

Посмотрите на библиотеку. Кажется, что Acquire() просто заставляет водителя выполнить покупку, и TransferPictures() вызывается для извлечения изображений (тот возвращает ArrayList, так что да, он что-то возвращает).

1

Infact, вы устанавливаете фильтр сообщений в своей форме, вызывая метод Application.AddMessageFilter(this). Итак, вы должны прослушивать события сканера, и когда вы получите событие TwainCommand.TransferReady, вы вызываете TransferPictures() для получения коллекции изображений.

Смежные вопросы