こんにちは。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
No.2ベストアンサー
- 回答日時:
>どうもCreateFontの情報がPrinterオブジェクトに伝わってないようです。
VBの制限事項です。→参考URL
>どうすればうまくいくのでしょうか。
Printer.Printではなく、TextOutを使いましょう。
参考URL:http://www.microsoft.com/japan/support/kb/articl …
回答ありがとうございます。
実はTextOutも下のように使ったんですが、やはりうまくいきませんでした。
Result = TextOut(hdc, OffsetX, OffsetY, tempStr, LenB(StrConv(tempStr, vbFromUnicode)))
どこが悪いのでしょうか。ちょっと八方塞がりの状態です。
とりあえず、参考URLありがとうございました。
No.3
- 回答日時:
回転文字の件は確か下記のMLの過去ログで見た記憶があります。
ただ過去ログの番号を忘れました。
そこで紹介されていたコードを下記に載せておきます。
ちなみに私はAPIには疎いので、動作の理屈がわかりませんが。
------------------------------------------------------
Option Explicit
Private Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" _
(ByVal H As Long, ByVal W As Long, ByVal E As Long, ByVal O As Long, _
ByVal W As Long, ByVal I As Long, ByVal u As Long, ByVal S As Long, _
ByVal C As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, _
ByVal PAF As Long, ByVal F As String) As Long
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" _
(ByVal hDc As Long, ByVal x As Long, ByVal y As Long, _
ByVal lpString As String, ByVal nCount As Long) As Long
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
Private Sub Form_Paint()
Dim Responce
Dim FontHandle As Long
Dim OldFontHandle As Long
Dim ResultCode As Long
Dim TargetDcHandle As Long
Dim strMsg As String
Responce = MsgBox("文字列を印刷しますか", 4, "")
'描画対象のデバイスコンテキストをフォームに設定
TargetDcHandle = Form1.hDc
'描画文字列の設定
strMsg = "文字列"
'論理フォントの作成
FontHandle = CreateFont(48, 24, 400, 0, 0, 0, 0, _
0, 1, 0, 0, 0, 0, "MS 明朝")
'作成した論理フォントを描画対象のデバイスコンテキストに割り当てる
OldFontHandle = SelectObject(TargetDcHandle, FontHandle)
'文字列を描画する
ResultCode = TextOut(TargetDcHandle, 10, 100, strMsg, _
LenB(StrConv(strMsg, vbFromUnicode)))
'元のフォントオブジェクトに戻す
ResultCode = SelectObject(TargetDcHandle, OldFontHandle)
'作成した論理フォントを削除する
ResultCode = DeleteObject(FontHandle)
If Responce = vbYes Then
'描画対象のデバイスコンテキストをプリンタに設定
TargetDcHandle = Printer.hDc
'描画文字列の設定
strMsg = "文字列"
Printer.Print ""
'論理フォントの作成
FontHandle = CreateFont(48, 24, 300, 0, 0, 0, 0, _
0, 1, 0, 0, 0, 0, "MS 明朝")
'作成した論理フォントを描画対象のデバイスコンテキストに割り当てる
OldFontHandle = SelectObject(TargetDcHandle, FontHandle)
'文字列を印刷する
ResultCode = TextOut(TargetDcHandle, 10, 100, strMsg, _
LenB(StrConv(strMsg, vbFromUnicode)))
Printer.EndDoc
'元のフォントオブジェクトに戻す
ResultCode = SelectObject(TargetDcHandle, OldFontHandle)
'作成した論理フォントを削除する
ResultCode = DeleteObject(FontHandle)
End If
End Sub
参考URL:http://dev.sfdata.ne.jp/VB/search.html
回答ありがとうございます。
実は書いていただいた内容は、私も見たことがあります。
結局、PrinterのLineメソッドを、CreateFontの後に使用していたのが原因のようで、先にLineメソッドで線(四角)を書いて、その後でCreateFontでフォントを作成して、TextOutを使用すると、一応文字列は回転しました。
どうもありがとうございました。
No.1
- 回答日時:
今VB4環境で、しかもMSDNが手元にないので、調べる事ができません。
ですので回避方法として、非表示のピクチャボックスに描画して、それをプリントアウトではだめですか?
フォームもピクチャボックスも内部では一緒だから、手っ取り早い回避方法だと思いますが。。。
やっぱダメ?
回答ありがとうございます。
>非表示のピクチャボックスに描画して、それをプリントアウトではだめですか?
PrintFormメソッドのことですよね。
実際には絵も一緒に印刷するので、PrintFormでは画質が問題で使えないんです。
なんにしろ、早い回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 数式が消える 1 2023/03/19 16:55
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
NVIDIAのシェーダーキャッシュ
-
VB6,リストボックスの特定行の...
-
CDCオブジェクトの作成について
-
エクセルでガンチャートを作成...
-
VC++プログラムをつかったBMP画...
-
ダイアログベースの再描画について
-
[VB.net] DataGridViewの列ヘッ...
-
フォームにビットマップを表示
-
OneNote 2010 文字と描画がずれる
-
CScrollViewの使用方法について
-
ビットマップを表示させる(MFC)
-
C#によるWPF その3
-
InvalidateRectの使い方について
-
TextBoxに文字を書いても表示さ...
-
画面リサイズ時のちらつきをな...
-
GDI+について
-
c言語を使いダイアログにbmpを...
-
GDI+で高速な描画
-
Windowsプログラミング:BitBlt...
-
動的に作成したメニュー名を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
word
-
[VB.net] DataGridViewの列ヘッ...
-
TextBoxに文字を書いても表示さ...
-
MFCでOnPaintのタイミング
-
UpdateData( FALSE); による文...
-
panelのスクロール表示について
-
VBAにGDI+を参照させる方法
-
VC++プログラムをつかったBMP画...
-
VB.netでのライン描画方法がわ...
-
FlexGridの一部のみ表示を更新...
-
絵を描くにはMac?Windows
-
CStaticコントロールの静的イメ...
-
SHGetFileInfoでアイコンが取得...
-
InvalidateRectの使い方について
-
WM_SIZEとWM_SIZINGの違い (Win...
-
Labelの文字をスクロールする際...
-
OneNote 2010 文字と描画がずれる
-
StretchBlt関数について
おすすめ情報