印刷デバイスの曲線描画能力を取得          <TOP>


EnumPrinters 使用可能なプリンタ・プリントサーバーなどを列挙
CopyMemory メモリブロックを別の領域に移動
GetDeviceCaps デバイス固有の情報を取得
CreateDC 指定されたデバイスのデバイスコンテキストを、指定された名前で作成

CURVECAPS(28) デバイスがサポートする曲線描画能力
 

 

'================================================================
'= 印刷デバイスの曲線描画能力を取得
'=    (CURVECAPS.bas)
'================================================================
#include "Windows.bi"

Type PRINTER_INFO_5
    pPrinterName As Long
    pPortName    As Long
    Attributes   As Long
    DeviceNotSelectedTimeOut As Long
    TransmissionRetryTimeOut As Long
End Type

#define PRINTER_ENUM_NAME &H8           'Nameで指定されたプリンタを列挙
#define MAX_DEVICENAME 64               '
#define CURVECAPS 28                    'デバイスがサポートする曲線描画能力
#define CC_CHORD 4                      '弓形をサポート
#define CC_CIRCLES 1                    '円をサポート
#define CC_ELLIPSES 8                   '楕円をサポート
#define CC_INTERIORS 128                '内部の塗りつぶしをサポート
#define CC_NONE 0                       '曲線をサポートしない
#define CC_PIE 2                        '扇形をサポート
#define CC_ROUNDRECT 256                '角の丸い矩形をサポート
#define CC_STYLED 32                    'スタイルを持つ境界線をサポート
#define CC_WIDE 16                      '太い境界線をサポート
#define CC_WIDESTYLED 64                'スタイルを持つ太い境界線をサポート

' 使用可能なプリンタ・プリントサーバーなどを列挙する
Declare Function Api_EnumPrinters& Lib "winspool.drv" Alias "EnumPrintersA" (ByVal Flags&, ByVal Name$, ByVal Level&, pPrinterEnum As Any, ByVal cbBuf&, pcbNeeded&, pcReturned&)

' メモリブロックを別の領域に移動する
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length&)

' デバイス固有の情報を取得
Declare Function Api_GetDeviceCaps& Lib "gdi32" Alias "GetDeviceCaps" (ByVal hDC&, ByVal nIndex&)

' 指定されたデバイスのデバイスコンテキストを、指定された名前で作成
Declare Function Api_CreateDC& Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName$, ByVal lpDevName$, ByVal lpOutput$, ByVal lpInitData&)

Var Shared Combo1 As Object
Var Shared List1 As Object

Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14
List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
List1.SetWindowSize 206, 90

Var Shared PrinterName As String

'================================================================
'=
'================================================================
Declare Sub Mainform_Start edecl ()
Sub Mainform_Start()
    Var PrintServer As String
    Var Need As Long
    Var Returned As Long
    Var Level As Long
    Var CT As Long
    Var Ret As Long

    'ローカルプリンタから検索(サーバー名 \\xxx 指定可)
    PrintServer = ""

    'PRINTER_INFO_5構造体を受け取る
    Level = 5

    'バッファに必要なバイト数を調べる
    Ret = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Chr$(0), 0, Need, Returned)
    If Need = 0 Then End

    '全プリンタ情報を得る
    Var Buffer(Need - 1) As byte
    Ret = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Buffer(0), Need, Need, Returned)

    '構造体リストの準備
    Var PI_5(Returned - 1) As PRINTER_INFO_5

    For CT = 0 To Returned - 1

        'バッファから構造体1つ分を抜き取る
        CopyMemory PI_5(CT), Buffer(CT * Len(PI_5(CT))), Len(PI_5(CT))

        'プリンタ名を得る
        PrinterName = String$(MAX_DEVICENAME, Chr$(0))
        CopyMemory PrinterName, ByVal PI_5(CT).pPrinterName, Len(PrinterName)
        PrinterName = kLeft$(PrinterName$, KInStr(1, PrinterName, Chr$(0)) - 1)

        Combo1.AddString PrinterName
    Next
End Sub

'================================================================
'=
'================================================================
Declare Sub Combo1_Change edecl ()
Sub Combo1_Change()
    Var phDC As Long
    Var Ret As Long
    
    'プリンタ名から、そのデバイスコンテキストを作成
    phDC = Api_CreateDC("WinSpool", PrinterName, ByVal 0, 0)
    
    'リストボックスを初期化
    List1.Resetcontent

    '曲線描画能力を取得
    Ret = Api_GetDeviceCaps(phDC, CURVECAPS)

    '曲線描画能力を表示
    If Ret And CC_CIRCLES    Then List1.AddString "CIRCLES"
    If Ret And CC_PIE        Then List1.AddString "PIE"
    If Ret And CC_CHORD      Then List1.AddString "CHORD"
    If Ret And CC_ELLIPSES   Then List1.AddString "ELLIPSES"
    If Ret And CC_WIDE       Then List1.AddString "WIDE"
    If Ret And CC_STYLED     Then List1.AddString "STYLED"
    If Ret And CC_WIDESTYLED Then List1.AddString "WIDESTYLED"
    If Ret And CC_INTERIORS  Then List1.AddString "INTERIORS"
    If Ret And CC_ROUNDRECT  Then List1.AddString "ROUNDRECT"
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End