• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB6 APIを使った文字印刷について)

VB6 APIを使った文字印刷について

taisuke555の回答

  • ベストアンサー
回答No.1

もう解決しましたか? 何日か経過しているので、お気づきかもしれませんし、 自分の推測による回答ですので、間違っていたらごめんなさい。 1.TextOut も フォントサイズもpixel指定になっていると思います。 質問のプログラムに下記を追加し、コマンドボタンを1つ追加して実行してみてください。 文字幅は半角文字のサイズのようです。 Private Sub Command2_Click()   FX = 6     '通常のフォント   FontTest1 "t"      FX = 0: FY = 6 '幅を0にすると高さに合わせて調整する   FontTest2 "t"   FX = 6: FY = 6 '半角の幅?   FontTest2 "t" End Sub Private Sub FontTest1(text As String)   Dim rtn As Long   Dim hdc As Long   Dim sz As Size      '通常のサイズ   Printer.FontName = "MS ゴシック"   Printer.FontSize = CLng(Printer.ScaleX(FX, vbMillimeters, vbPoints))      hdc = Printer.hdc   rtn = GetTextExtentPoint32(hdc, text, LenB(StrConv(text, vbFromUnicode)), sz)   MsgBox "[" & text & "] (" & CLng(Printer.ScaleX(FX, vbMillimeters, vbPoints)) & _         ") = (" & sz.cx & "," & sz.cy & ")" End Sub Sub FontTest2(text As String)   Dim LF As LOGFONT   Dim IX As Integer      Dim TempByteArray() As Byte   Dim ByteArrayLimit As Long      Dim OldFT As Long   Dim NewFT As Long   Dim rtn As Long      Dim hdc As Long      Dim sz As Size      hdc = Printer.hdc      With LF     .lfEscapement = 0 '文字の回転角度(角度*10)        '↓(2)ここで文字サイズをmmかTwipに変換しているつもりなのですが・・・     .lfHeight = Printer.ScaleY(FY, vbMillimeters, vbPixels) '文字の高さ     .lfWidth = Printer.ScaleX(FX, vbMillimeters, vbPixels) '文字の幅        .lfWeight = 400 '文字の太さ     .lfItalic = False '斜体     .lfUnderline = False '下線     .lfStrikeOut = False '取り消し線        .lfCharSet = DEFAULT_CHARSET     .lfOutPrecision = OUT_DEFAULT_PRECIS     .lfClipPrecision = OUT_DEFAULT_PRECIS     .lfQuality = DEFAULT_QUALITY     .lfPitchAndFamily = DEFAULT_PITCH Or FF_DONTCARE        TempByteArray = StrConv("MS ゴシック", vbFromUnicode)     ByteArrayLimit = UBound(TempByteArray)        For IX = 0 To ByteArrayLimit       .lfFaceName(IX) = TempByteArray(IX)     Next   End With      NewFT = CreateFontIndirect(LF)   OldFT = SelectObject(hdc, NewFT)      rtn = GetTextExtentPoint32(hdc, text, LenB(StrConv(text, vbFromUnicode)), sz)   MsgBox "[" & text & "] (幅,高さ) = (" & LF.lfWidth & "," & LF.lfHeight & ")→(" & sz.cx & "," & sz.cy & ")"      rtn = SelectObject(hdc, OldFT)   rtn = DeleteObject(NewFT) End Sub 2.あと印刷位置の方ですが、印刷不可能領域の問題があると思います。 たとえば、Pinrter.Line (0,0)-(1000,1000),,b を実行してみると、紙の左上ではなく、印刷可能領域の左上が(0,0)の位置になると思います。 ふちなし印刷とかですと端からかもしれませんが、私のプリンタでは上左3mmほど内側になりました プリンタによって違うと思いますので、その辺も考慮に入れないといけないと思います。

rai_rai_rai
質問者

お礼

わかりやすい回答ありがとうございました。助かります。 早速試してみます。

関連するQ&A

  • CreateFontで回転させて印刷出来ない

    こんにちは。maruru01です。 APIのCreateFont関数を使用して文字列を回転させ、それを印刷しようとしたのですが、うまくいきません。 どうもCreateFontの情報がPrinterオブジェクトに伝わってないようです。 オブジェクトをPrinterの替わりにForm1にするとちゃんと回転して表示されます。 どうすればうまくいくのでしょうか。 よろしくお願いします。 使用環境:Windows2000(SP2)、Visual Basic 6.0(SP5) EnterpriseEdition Private Sub Command1_Click()   Dim hdc As Long   Dim FontName As String   Dim FontHeight As Long   Dim hFont As Long   Dim hFontOld As Long   Dim tempStr As String      Const DEFAULT_CHARSET = 1      tempStr = "文字列回転"      hdc = Printer.hdc   FontName = "MS Pゴシック"   FontHeight = 9   hFont = CreateFont(-(FontHeight * 20 / Screen.TwipsPerPixelX), 0, 900, 2700, 0, False, False, False, DEFAULT_CHARSET, False, False, False, False, FontName)   hFontOld = SelectObject(hdc, hFont)      Printer.ScaleMode = vbCentimeters   Printer.CurrentX = 2   Printer.CurrentY = 2   Printer.Print tempStr      DeleteObject SelectObject(hdc, hFontOld)    End Sub

  • API関数 GetPixel

    質問ですが、Visual Basicで Option Explicit Private Declare Function Getpixel Lib "gdi32" (_ ByVal hdc As Long, _ ByVal x As Long, _ ByVal y As Long, _ ) As Long というソース部分があるのですが、これをVC++で書き直すとしたらどのようになるのでしょうか。また、VC++のAPI関数にはGetPixelはないのでしょうか。なにとぞよろしくお願いいたします。

  • API関係の用語で質問です

    'デバイスコンテキストにオブジェクトを選択する Private Declare Function SelectObject Lib "gdi32" _ (ByVal hDC As Long, ByVal hObject As Long) As Long 'グラフィックスオブジェクトを削除しシステムリソースを開放する Private Declare Function DeleteObject Lib "gdi32" _ (ByVal hObject As Long) As Long ―――――――――――――――――――――――――――――――― VBの初心者です 使うAPIとは別に上のようなSelectObjectや DeleteObjectという関数を 使わなければならないようなのですが これはどういう意味なのでしょうか? またこれはどういうことをしているのでしょうか? ほかの例ではDeleteObjectという関数だけを 使ってSelectObjectを使っていないのも見かけました。

  • プリンタの印刷ジョブを削除したい。

    プリンタの印刷ジョブを削除したい。 現在、VB.NET(Visual Studio 2008)で開発を行っています。 SetPrinter関数を使用して、印刷ジョブを全て削除したいのですがSetPrinterに失敗してしまいます。 GetLastErrorの戻り値は「5」でアクセス拒否のようです。 SetPrinterの前にOpenPrinterは成功しており、プリンタの印刷ジョブの情報は取得できています。 なお、同環境でVB6.0で同様のプログラムを作成し実行したところジョブの削除ができました。 類似した現象・解決方法等ご存知でしたら教えてください。 開発環境はWindowsXP、Visual Studio 2008です。 以下、ソースの抜粋です。 '宣言 Private Const DEF_INIT_BUFFER_PERFORM As Integer = 100 Public Const STANDARD_RIGHTS_REQUIRED = &HF0000 Public Const PRINTER_ACCESS_ADMINISTER = &H4 Public Const PRINTER_ACCESS_USE = &H8 Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _ PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE) Public Structure PRINTER_DEFAULTS Public pDatatype As IntPtr Public pDevMode As IntPtr Public DesiredAccess As Integer End Structure <DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)> _ Private Shared Function OpenPrinter( _ ByVal pPrinterName As String, _ ByRef hPrinter As IntPtr, _ ByVal pDefault As PRINTER_DEFAULTS _ ) As Boolean End Function <DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)> _ Private Shared Function SetPrinter( _ ByVal hPrinter As IntPtr, _ ByVal Level As Long, _ ByVal pDefault As IntPtr, _ ByVal Command As Long _ ) As Boolean End Function '実行部 Dim pd As New PRINTER_DEFAULTS pd.DesiredAccess = PRINTER_ALL_ACCESS Dim printerHandle As IntPtr Dim ret As Boolean = OpenPrinter("プリンタ名", printerHandle, pd) Dim err As Integer = Marshal.GetLastWin32Error() 'Falseが返る ret = SetPrinter(printerHandle, CLng(0), IntPtr.Zero, CLng(3)) '5が返る err = Marshal.GetLastWin32Error()

  • 画像の90度回転表示の処理時間を短縮したい

    今、PictureBox に読み込んだ画像を90度回転して別の PictureBox に表示していますが、処理にとても時間がかかっています。(480×640ピクセルを右90度変換するのに約3.5秒) もっと処理が早くなる方法があれば教えてください。よろしくお願いします。 ---現在の処理(Picture1 → Picture2)--- Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long Dim p1sw  As Long  'Picture1.ScaleWidth Dim p1sh  As Long  'Picture1.ScaleHeight Dim x1    As Long Dim y1    As Long Dim c    As Long  'カラーコード Dim hDC1  As Long  'Picture1.hDC Dim hDC2  As Long  'Picture2.hDC Dim X    As Long Dim Y    As Long '縦横サイズを逆転する With Picture1   p1sw = .ScaleWidth   p1sh = .ScaleHeight   hDC1 = .hdc End With With Picture2   .Height = Picture1.Width   .Width = Picture1.Height   hDC2 = .hdc End With p1sw = p1sw - 1 p1sh = p1sh - 1 'ピクチャを90度回転 For X = 0 To p1sw         'Picture1のX座標   y1 = X   For Y = 0 To p1sh       'Picture1のY座標     x1 = p1sh - Y     c = GetPixel(hDC1, X, Y) 'カラー情報の取得     '取得したカラーを指定位置に設定する     If c <> -1 Then Call SetPixelV(hDC2, x1, y1, c)   Next Y Next X # OSはWindows95、VB6.0(SP5)を使用しています。

  • 他のアプリケーションの hDC を取得したい

     APIの初歩的なことですみません 他のアプリケーションの hDC を取得して GetPixel() API等 を使用したいのですが どうもうまくいきません hDC や hWnd あたりがよくわからないのが 原因だと思いますが、分かる方教えてください  ソースは以下の様な感じです Private Declare Function FindWindowA Lib "user32" (ByVal cnm As String, ByVal cap As String) As Long Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long lhWnd = FindWindowA(vbNullString, "ExpApp") lColor = GetPixel(lhWnd, ix, iy)

  • VBAでSetTextColorがうまくいかない

    EXCELのVBAでユーザーフォームを使ったグラフィック表示のプログラムを 作っているのですが、SetTextColorでテキスト色の設定をしようと してもうまくいきません。何故か設定しようとする色の値が無視されて 「1304008」が設定されてしまいます。(GetTextColorで確認) そしてそれ以降何を設定してもこの状態のままです。 何か考えられることがありますでしょうか。 下にそのプログラムを示します。 ちなみにSetBKColorやAngleArcなど他のグラフィック命令は問題なく 動いていてSetTextColorだけがうまくいってない状態です。 '------------------------------------------------- ' ユーザーフォーム用プログラム '------------------------------------------------- Private Declare Function GetActiveWindow Lib "user32" () As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpszClass As String, _ ByVal lpszWindow As String) As Long Private Declare Function GetDC Lib "user32" ( _ ByVal hWnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" ( _ ByVal hWnd As Long, _ ByVal hdc As Long) As Long Private Declare Function SetTextColor Lib "gdi32" _ (ByVal hdc As Long, crColor As Long) As Long Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" _ (ByVal hdc&, ByVal x&, _ ByVal y&, ByVal lpString$, ByVal nCount&) As Long Dim hWnd As Long Dim hdc As Long Public Sub UserForm_Activate() DoEvents hWnd = FindWindowEx(GetActiveWindow, 0, "F3 Server 60000000", "") hdc = GetDC(hWnd) ret = SetTextColor(hdc, RGB(255, 0, 0)) ret = TextOut(hdc, 0, 0, "abc", 3) Call ReleaseDC(hWnd, hdc) End Sub '-------------------------------------------------

  • マウスのある個所の色

    お世話になります よろしくお願いします Pictureboxをクリックされたときに そのPictureboxがクリックされた箇所の色を16進数で取得したいのですが うまくいきません どこが間違っているのか教えてもらえないでしょうか? ソースは Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Type POINTAPI x As Long y As Long End Type Private Sub Picture1_Click() Dim Poi As POINTAPI Dim iro As Long GetCursorPos Poi iro = GetPixel(Me.Picture1.hdc, Poi.x, Poi.y) Me.Label2.Caption = Poi.x Me.Label3.Caption = Poi.y Me.Label1.Caption = iro CloseHandle (Me.Picture1.hdc) End Sub GetPixcelの引数に-1しか入りません あと、もし数値で取れたとして それを16進数にする方法を教えてください よろしくお願いします

  • ExcelでDeviceCapabilitie

    ExcelでAPIを使用して、用紙番号を取得したいと考えています。 Excel2007(OS Win7)上では取得できるのですがExcel2000(OS WinXP)上ではエラー。 GetPrinterNameAndPortで、『 on 』と『 の 』がバージョンによって変えてもダメでした。アドバイスよろしくお願い致します。 Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal pDevice As String, ByVal pPort As String, ByVal fwCapability As Long, pOutput As Any, pDevMode As Any) As Long Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_BINNAMES = 12 Private Const DC_BINS = 6 Private Const DEFAULT_VALUES = 0 Sub Numbertest() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long GetPrinterNameAndPort strDeviceName, strDevicePort lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, ByVal vbNullString, ByVal vbNullString) ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) For lngCounter = 0 To lngPaperCount - 1 MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64 MsgBox aintNubytPaper(lngCounter + 1) & " & " & Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) Next lngCounter End Sub Private Sub GetPrinterNameAndPort(printerName As String, printerPort As String) Dim sString As String Const searchText As String = " on " ←使い分け ' Const searchText As String = " の " sString = ActivePrinter printerName = Left(sString, InStr(1, sString, searchText) - 1) printerPort = Right(sString, Len(sString) - Len(printerName) - Len(searchText)) End Sub

  • Windows7-VB6でのアクティブウィンドウキャプチャ

    Windows7-VB6でのアクティブウィンドウキャプチャ お世話になります。 Private Declare Sub keybd_event Lib "User32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Const VK_LMENU = &HA4 Private Const VK_SNAPSHOT = &H2C Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Command1.SetFocus DoEvents Load form2 Clipboard.Clear keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0 keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0 DoEvents keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 ※form2.picPrint.Picture = Clipboard.GetData() 上記コードはWinXPであれば問題なく動作するのですが Win7ではform2のピクチャボックスにイメージが貼り付けられません ※行にブレイクを入れて、一旦プログラムを停止し再開するとOKで その他にもALTキーの送信をしないでprtscrのみでも動作可能です。 win7-vb6でアクティブウィンドウのキャプチャを クリップボードを使用し、フォームのピクチャボックスに貼り付けることは 可能でしょうか