Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4485 / 13646 ツリー ←次へ | 前へ→

【56149】シート上Imageのデバイスコンテキストハンドル ミカは記念 08/6/5(木) 11:18 質問[未読]
【56151】Re:シート上Imageのデバイスコンテキストハ... neptune 08/6/5(木) 15:45 発言[未読]
【56152】Re:シート上Imageのデバイスコンテキストハ... yuu1 08/6/5(木) 16:08 回答[未読]
【56350】Re:シート上Imageのデバイスコンテキストハ... みそじのおじさん 08/6/14(土) 13:24 発言[未読]

【56149】シート上Imageのデバイスコンテキストハ...
質問  ミカは記念  - 08/6/5(木) 11:18 -

引用なし
パスワード
   (初めて質問させていただきます。)

シート上のImageコントロールに線などを描画するプログラムを作りたいと思っています。

Imageコントロールのデバイスコンテキストハンドル(VBでいうhDC)が分かれば、APIのPolylineなどを用いて、線やレクトの描画ができると考えています。

しかし、シート上のImageコントロールなどは、ウィンドウ扱いではないので、ウィンドウハンドルを得られず、デバイスコンテキストハンドルも得られないという指摘もあり、難航しています。

どなたか、シート上のImageコントロールのデバイスコンテキストハンドルの取得方法を教えてくださらないでしょうか?

どうぞ宜しくお願い申し上げます。

追伸

実際にやりたいのは、オリジナルのグラフを、表と一緒に印刷することです。

Imageコントロール上に、直線やレクトを描いて、オリジナルのグラフを描きたいのですが、他に良い方法が思い浮かびません。

同じような経験をされた方がいらっしゃいましたら、ぜひアドバイスをお願いいたします。

【56151】Re:シート上Imageのデバイスコンテキスト...
発言  neptune  - 08/6/5(木) 15:45 -

引用なし
パスワード
   ▼ミカは記念 さん:
こんにちは

やった事は無いですが、過去ログを検索すると
参考になりそうなものはありました。
ワークシート上かどうかまでは見てませんけど。
キーワード「Excel Image HDC」

で、駄目なら、メモリ上で描画して、一度ファイルに落としそれを
Imageに読み込むとか。(やった事は無いです)
と、書いて見たもののかなり面倒そうですね。^ ^;;

【56152】Re:シート上Imageのデバイスコンテキスト...
回答  yuu1  - 08/6/5(木) 16:08 -

引用なし
パスワード
   こんにちは。
>しかし、シート上のImageコントロールなどは、ウィンドウ扱いではないので、ウィンドウハンドルを得られず、デバイスコンテキストハンドルも得られないという指摘もあり、難航しています。
>どなたか、シート上のImageコントロールのデバイスコンテキストハンドルの取得方法を教えてくださらないでしょうか?

Imageコントロールはウィンドウ扱いではないので、
(ハンドルはないので)取得はむりなのでは?
代わりにFrameコントロールを使えば出来ます。


>実際にやりたいのは、オリジナルのグラフを、表と一緒に印刷することです。
>Imageコントロール上に、直線やレクトを描いて、オリジナルのグラフを描きたいのですが、他に良い方法が思い浮かびません。

通常オリジナルのグラフを描く場合、
みなさん図形描画(Shape)の機能を使われますよ。
apiで描画なんて面倒なことはしません。
ChartObjectsを作成してその中に図形描画で描けばいいでしょう。

【56350】Re:シート上Imageのデバイスコンテキスト...
発言  みそじのおじさん  - 08/6/14(土) 13:24 -

引用なし
パスワード
   みなさんこんにちわ

私は、先日似たような質問をしていた者です。その節はneputuneさん、yuu1さん
ありがとうございました。

私の場合はフォーム上のImageだったのですが、自分の復習をかねてちょっと
やってみました。説明がおかしかったら適度につっこみをいれて下さい。

必要な物
  新規ワークブックにImage1を配置し、ペイントか何かで白色のbmpファイル
  を作成しておいて下さい。

方針
  Imageそのもののハンドルではなく、Image1のPictureにロードした絵のハン
  ドルを利用し(Image1.Picture.Handle),CreateCompatibleDCで互換性のある
  hDCを作成しSelectObjectでhDCとハンドルを関連付けて使用する。
  (最終的なデバイスコンテクストはhComDCです。)


neputuneさんに教えて頂いたやり方です。 

標準モジュールに

'*****************************************************************
Option Explicit

Public Declare Function CreateCompatibleDC Lib "gdi32" _
      (ByVal hDC As Long) As Long

Public Declare Function SetMapMode Lib "gdi32" _
      (ByVal hDC As Long, ByVal nMapMode As Long) As Long

Public Const MM_TWIPS = 6

Public Declare Function SelectObject Lib "gdi32" _
      (ByVal hDC As Long, ByVal hObject As Long) As Long

Public Declare Function DeleteDC Lib "gdi32" _
      (ByVal hDC As Long) As Long

Public Declare Function GetDC Lib "user32" _
         (ByVal hwnd As Long) As Long


Public Declare Function ReleaseDC Lib "user32" _
   (ByVal hwnd As Long, ByVal hDC As Long) As Long

Public Declare Function MoveToEx Lib "gdi32" _
  (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, _
  ByVal pLastPoint As Long) As Long


Public Declare Function LineTo Lib "gdi32" _
    (ByVal hDC As Long, ByVal XEnd As Long, _
    ByVal YEnd As Long) As Long
    
'*******************************************************************  
Sub Get_Image_hDC()

  Dim myImage As Image
  Dim hBmp As Long, hDC As Long
  Dim hComDC As Long
  Dim ret As Long
 
  Dim X As Long, Y As Long
  Dim c As Integer, i As Integer
 
  Set myImage = Worksheets("sheet1").Image1
   
   myImage.Picture = Nothing
   myImage.PictureAlignment = fmPictureAlignmentTopLeft
   myImage.PictureSizeMode = fmPictureSizeModeStretch

   'LineTo で引く直線の色がデフォルトで黒なので白のbmpをロードする。
   
   myImage.Picture = LoadPicture(ThisWorkbook.Path & "\test.bmp")
  
   hBmp = myImage.Picture.Handle
   hDC = GetDC(0)
   hComDC = CreateCompatibleDC(hDC)
   ret = ReleaseDC(0, hDC)
  
   ret = SetMapMode(hComDC, MM_TWIPS)
   
   ret = SelectObject(hComDC, hBmp)
   
   
   '////////////////////////////////////////////
   '適当に棒グラフを描画
   
   X = myImage.Picture.Width / 20
   Y = myImage.Picture.Height / 20
   
    MoveToEx hComDC, X, -Y * 9, 0
    LineTo hComDC, X, -Y
    MoveToEx hComDC, X, -Y * 9, 0
    LineTo hComDC, X * 9, -Y * 9
   
    For c = 2 To 7
    
      Randomize
      
      i = CInt(Rnd() * (7 - 1 + 1) + 1)
      
      MoveToEx hComDC, X * c, -Y * 9, 0
      LineTo hComDC, X * c, -Y * i
      LineTo hComDC, X * (c + 1), -Y * i
      LineTo hComDC, X * (c + 1), -Y * 9
   
    Next
   
   '////////////////////////////////////////////////
   
   ret = DeleteDC(hComDC)
  
  '書いたグラフを保存します。 
  SavePicture myImage.Picture, ThisWorkbook.Path & "\グラフ.bmp"
  
   
  Set myImage = Nothing
  
End Sub


パス名の所は、ミカは記念日さんの環境にあわせて変えて下さい。
それでは、お互いがんばりましょう。

4485 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free