こんにちは。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

A 回答 (3件)

>どうもCreateFontの情報がPrinterオブジェクトに伝わってないようです。



VBの制限事項です。→参考URL

>どうすればうまくいくのでしょうか。

Printer.Printではなく、TextOutを使いましょう。

参考URL:http://www.microsoft.com/japan/support/kb/articl …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
実はTextOutも下のように使ったんですが、やはりうまくいきませんでした。

Result = TextOut(hdc, OffsetX, OffsetY, tempStr, LenB(StrConv(tempStr, vbFromUnicode)))

どこが悪いのでしょうか。ちょっと八方塞がりの状態です。
とりあえず、参考URLありがとうございました。

お礼日時:2002/01/07 19:01

回転文字の件は確か下記の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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
実は書いていただいた内容は、私も見たことがあります。
結局、PrinterのLineメソッドを、CreateFontの後に使用していたのが原因のようで、先にLineメソッドで線(四角)を書いて、その後でCreateFontでフォントを作成して、TextOutを使用すると、一応文字列は回転しました。
どうもありがとうございました。

お礼日時:2002/01/08 14:43

今VB4環境で、しかもMSDNが手元にないので、調べる事ができません。



ですので回避方法として、非表示のピクチャボックスに描画して、それをプリントアウトではだめですか?
フォームもピクチャボックスも内部では一緒だから、手っ取り早い回避方法だと思いますが。。。

やっぱダメ?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>非表示のピクチャボックスに描画して、それをプリントアウトではだめですか?
PrintFormメソッドのことですよね。
実際には絵も一緒に印刷するので、PrintFormでは画質が問題で使えないんです。
なんにしろ、早い回答ありがとうございました。

お礼日時:2002/01/07 18:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q手書きでデザインした文字やロゴをデジタル化するソフト

手書きでデザインした文字や簡単な絵というか、
ロゴマークみたいなのをスキャナに取り込んで、
デジタル化したいのですが、
Illustratorは高くて買えません。
ベクトル画像でレイヤーが使えて使い方が簡単な
ソフトがあれば教えてください。
そんな都合のいいものはないのでしょうか?
無ければ、無いと教えていただきたいのですが・・・
PhotoshopElementsは使っているのですが、
限界を感じています。

Aベストアンサー

PaintShopPro7・Paintgraphic両方とも低価格でパスを扱えます。PaintShopProは最新版は9ですがパスや印刷プレビューの使い勝手が改悪された上動作が重くなっているので安く軽い7を推奨します。

PaintShopPro7・Paintgraphic両方ともElementsにないチャンネル・パス・トーンカーブ・マスクがありますしレイヤーも当然使えます。PaintShopPro7はイラストレーターのようにフォントをアウトライン化してベクターオブジェクトとしていじることができます。

>>手書きでデザインした文字や簡単な絵というか、
ロゴマークみたいなのをスキャナに取り込んで、
デジタル化したいのですが、
>>ベクトル画像でレイヤーが使えて使い方が簡単

はもちろんPaintShopPro7・Paintgraphicのどちらでも可能です。ただしPaintgraphicは価格は安いですが中上級者向きのソフトです。レタッチソフト初心者でなくてもマニュアルつきを購入したほうが無難です。PaintShopPro7はPDFとフラッシュによる動画マニュアルおよび絵入りのヘルプ画付属するので解説書は特に必要ないです。
PSP ver.7と6解説
http://www.seiai.ed.jp/t2000/psp7t2/index.html
http://www.seiai.ed.jp/t2000/psp/index.html

Paintgraphic
http://www.sourcenext.com/products/paint/
http://piro.sakura.ne.jp/latest/flakes/035kid.html
PaintgraphicとPhotoshopLEの比較
http://ojakan2.hp.infoseek.co.jp/cgtips_pg.html
PaintShopPro7
(http://www.amazon.co.jp/exec/obidos/ASIN/B0006IX6Z2/qid%3D1123834561/sr%3D1-1/ref%3Dsr%5F1%5F10%5F1/249-6805767-8787515)

PaintShopPro7・Paintgraphic両方とも低価格でパスを扱えます。PaintShopProは最新版は9ですがパスや印刷プレビューの使い勝手が改悪された上動作が重くなっているので安く軽い7を推奨します。

PaintShopPro7・Paintgraphic両方ともElementsにないチャンネル・パス・トーンカーブ・マスクがありますしレイヤーも当然使えます。PaintShopPro7はイラストレーターのようにフォントをアウトライン化してベクターオブジェクトとしていじることができます。

>>手書きでデザインした文字や簡単な絵というか、
...続きを読む

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

Q手書き文字&イラストをデザインに取り込みたい

手書き、もしくはスタンプでの文字(やイラスト)を
イラストレーターやフォトショップに取り込んで、

その後、ソフトでまた加工、レイアウトしたりして

(文字の書いてある紙の色や質感などは残さずに、
文字(結構細かい)だけをとりこんで、
ファイルにレイアウトしたいのです。)

印刷物にしたいのですが、取り込み方の方法が
いまいちわかりません。。

どなたか知っている方、
いらっしゃいましたらよろしくお願い致します。


ちなみにIllustrator9.0、photoshop5.5を使用しています。

Aベストアンサー

流れとしては
1.手書き等の文字をスキャナで大きめに取り込む(フォトショップ)
2.取り込んだ画像を文字の部分とその他の部分がはっきり分かれるようコントラストを強くして保存。必要に応じて消去したり白黒2階調にしたり、抽出したり技術を要します。(フォトショップ)
3.さきほど保存しておいたデータをイラストレータの書類に配置。
オートトレースツールで輪郭をトレース。大きい画像のほうがトレースしたときのあらがでにくいです。うまくいかない場合環境設定のオートトレースのところを調節してください。このツール、非常にアバウトで、うまくいくかどうか疑問ですが・・・^^:
(イラストレーター)
4.貼り付けた画像を削除
こうすれば文字の部分が図形になるはずなので拡大縮小、変形など自由にできます。
なお、3の部分ですが、アドビのストリームラインというソフトをお持ちでしたらそちらで簡単に精密に輪郭をトレースできます。

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。

Qパソコン上で手書き文字などを保存したいのですが。

パソコン上での手書きについてお聞きします。

マウスで、簡単な文字なり絵を描いて、それを保存したいのです。
できるのでしょうか?

手書き認識ではありません。すなわち、今、IME、ATOK,を
使用しています。このソフトは、マウスで描いた手書き文字を
漢字等に変換してくれます。しかし、この「変換」まではいらないのです。
マウスで描いた手書き文字等をそのまま保存したいのです。

Vista(Home)を使用しています。
標準搭載の「Tablet PC 入力パネル」でできるでしょうか?

何か、いい方法はありますか?

どうかよろしくお願いいたします。

Aベストアンサー

文字や絵を何かの文章で文字同様に利用するわけでなければ画像として残しておくことはできます。No.1の方のお返事通りペイントでもいいですし、売っているソフトでもいいですし、VistaならWindows Journalというソフトが標準で搭載されていると思います。これを用いれば通常のノートと同じように保存しておくことができますよ。

QDim x As Integer = 0

いつもお世話になっております。

只今、本に記載してあるソースコードを手入力しています。
標記のように入力したら、『コンパイルエラー 修正候補:ステートメントの最後』というエラーが出ました。

(1)このエラーは無視してもよいのでしょうか?
(2)そもそも、変数の宣言文の後ろに=0をつけている意味がわかりません。当方VB初心者です。

よろしくお願いいたします。

Aベストアンサー

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsugi.ed.jp/vba4graduate/vba_hensuusyokika.htm
ーーー
定数のConstであればこういう書き方はOK
Sub test01()
Const x As Integer = 0
MsgBox x
End Sub
ーーー
VB.NETでは、OK
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim x As Integer = 10
MsgBox(x)
End Sub
ーー
Javaでは可能であるようです
http://msugai.fc2web.com/java/var2.html
ーーーーー
>ろに=0をつけている意味がわかりません
宣言と同時に値を与える=初期化する

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsug...続きを読む

Q手書き文字入りの画像の作り方???

今日和<(_ _*)>

手書きの文字が入った待受画像を集めている
んですが、あれって どうやって作ってるんですか??

PictBear等、画像加工ソフトを使っていて、
手書き文字のフォントならDLしてあるし、
手書き風の文字で文字入れ出来る携帯サイトの文字
とも違うんですよね。。。

マウスで頑張ってみても上手く書けなくて、
細かい文字なんてムリ… ~(-゛-;)~

PCですか?
携帯だけで出来るのでしょうか??
スキャナで読み込んでるのでしょうか??
それとも、ペンタブが無くちゃ出来ませんか??

職人さんの中には作成方法までは答えない、って
人が多くて聞けずに ずっと気になってるんですが
職人さん達は どうやって手書きしているのか
教えて下さい(>_<)
お願いします☆

Aベストアンサー

やろうと思えば携帯で出来ます。

私はDoCoMo FOMA F900iTユーザーなのですが、此れにはタッチパネル機能があって、手書きできるんです。
絶対にやりたいなら買ってもいいと思いますが、発売からもう一年経っていて、しかも未だに高い。\20000overです。

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

Q手書きの文字入力はどうするの?

ペイント文字の入力方法はわかりました。
手書きの文字を入力したい場合ははどうするんでしょ?

Aベストアンサー

> 手書きの文字を入力したい場合ははどうするんでしょ?

下記URLのページのような「手書き(風)文字」フォントを使って入力します。

「漢字も使える手書き風の日本語フォントのまとめ」
http://coliss.com/articles/freebies/freebies-handwriting-japanese-font.html

「フリーで使えるいい感じの手書き風フォント特集(日本語も)」
http://e0166.blog89.fc2.com/blog-entry-526.html

「手書き和文フリーフォント」
http://pet.24-7smile.com/font/cursive.html

Q調べてもわからないのでこの文の意味を教えてください。 Dim a as system.Reflect

調べてもわからないのでこの文の意味を教えてください。

Dim a as system.Reflection.Assembly=system.Reflection.Assembly.GetExcutingAssembly()

Dim b as string = system.IO.Path.GetDirrectoryName(a.Location)


VB.NETを使用しています。

Aベストアンサー

Dim a as system.Reflection.Assembly=system.Reflection.Assembly.GetExcutingAssembly()
自分自身 (実行プログラム) を参照

Dim b as string = system.IO.Path.GetDirrectoryName(a.Location)
実行プログラムがあるフォルダーのパスを取得


人気Q&Aランキング

おすすめ情報