/*
 * Dutch resources for Twain
 *
 * Copyright 2006 Hans Leidekker
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

LANGUAGE LANG_DUTCH, SUBLANG_DEFAULT

IDD_CAMERAUI DIALOG DISCARDABLE  0, 0, 372, 273
STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_VISIBLE | 
    WS_CAPTION | WS_SYSMENU
CAPTION "Bestanden op de camera"
MENU 20545
FONT 8, "MS Sans Serif"
BEGIN
	CONTROL         "List1",IDC_LIST1,"SysListView32", LVS_ICON | WS_BORDER |
WS_TABSTOP,7,7,358,229
    DEFPUSHBUTTON   "Importeer geselecteerde bestanden",IDC_IMPORT,225,252,56,14
    PUSHBUTTON      "Importeer alles",IDC_IMPORTALL,7,252,52,14
    PUSHBUTTON      "Afsluiten",IDC_EXIT,295,252,50,14
END

IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 46
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_CENTER | DS_SETFOREGROUND
CAPTION "Transporteren"
FONT 8, "MS Sans Serif"
BEGIN
    LTEXT   "Transporteren.... Even geduld",IDC_STATIC,53,19,85,8
END

IDD_CONNECTING DIALOG DISCARDABLE  0, 0, 280, 116
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU| WS_VISIBLE | DS_CENTER
CAPTION "Verbinden met camera"
FONT 8, "MS Sans Serif"
BEGIN
    CONTROL         "",IDC_BITMAP,"Static",SS_BITMAP|SS_CENTERIMAGE,4,4,110,110
    LTEXT           "Verbinden met camera... Even geduld",IDC_STATIC,128,58,
                    116,8
END
