[リストへもどる]
一括表示

投稿時間:2003/07/16(Wed) 18:39
投稿者名:みさき
URL :
タイトル:
ExtCreatePen関数について

いつも参考にさせてもらっています。
みさきと申します。

ExtCreatePen関数にて任意のペンを作成したいのですが、
どうしてもExtCreatePen関数が失敗してしまいます。
エラーメッセージを見ると「パラメータが間違っています。」
と出ます。
Msdnどうりにしてるつもりなのですが・・・。

どこが間違っているのでしょうか?
よろしくお願いします。

開発環境:Win2000(SP4)、VB6(SP5)


 Dim typLog As LOGBRUSH
  Dim hPen As Long
  Dim hOldPen As Long
    
  With typLog
    .lbStyle = BS_SOLID
    .lbColor = vbWhite
    .lbHatch = 0
  End With

  hPen = ExtCreatePen(PS_GEOMETRIC Or PS_SOLID Or PS_ENDCAP_SQUARE Or PS_JOIN_BEVEL, 2, typLog, 0, 0)
  If hPen = 0 Then
     MsgBox GetErrMsg(Err.LastDllError)
  End If


Option Explicit

'LOGBRUSH構造体(ブラシ設定)
Public Type LOGBRUSH
        lbStyle As Long
        lbColor As Long
        lbHatch As Long
End Type

Public Const BS_SOLID = 0
Public Const BS_NULL = 1

Public Const PS_GEOMETRIC = &H10000
Public Const PS_SOLID = 0
Public Const PS_DASH = 1                    '  -------
Public Const PS_DOT = 2                     '  .......
Public Const PS_DASHDOT = 3                 '  _._._._
Public Const PS_DASHDOTDOT = 4              '  _.._.._
Public Const PS_NULL = 5
Public Const PS_USERSTYLE = 7
Public Const PS_INSIDEFRAME = 6
Public Const PS_ENDCAP_ROUND = &H0
Public Const PS_ENDCAP_SQUARE = &H100
Public Const PS_ENDCAP_FLAT = &H200
Public Const PS_JOIN_BEVEL = &H1000
Public Const PS_JOIN_MITER = &H2000
Public Const PS_JOIN_ROUND = &H0

'任意のペンを作成する
Public Declare Function ExtCreatePen Lib "gdi32" (ByVal dwPenStyle As Long, _
       ByVal dwWidth As Long, lplb As LOGBRUSH, ByVal dwStyleCount As Long, lpStyle As Long) As Long

Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

'線描画
Public Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Public Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal lpPoint As Long) As Long

' メッセージ文字列を書式化する関数の宣言
Public Declare Function FormatMessage Lib "kernel32.dll" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long

' 書式化の処理方法を示す定数の宣言
Public Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
Public Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000

' プロセスのデフォルト言語IDを示す定数
Public Const PROCESS_DEFAULT_LANGUAGE = &H400

'▲Dllエラーのメッセージを返す
'引数:lHdc   Err.LastDllErrorを指定

Public Function GetErrMsg(lHwnd As Long) As String
   Dim strLastDllErrMsgBuffer As String * 1024
   Dim lngWin32apiResultCode  As Long
  
   lngWin32apiResultCode = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or _
                                         FORMAT_MESSAGE_IGNORE_INSERTS, _
                                         ByVal vbNullString, _
                                         lHwnd, _
                                         PROCESS_DEFAULT_LANGUAGE, _
                                         strLastDllErrMsgBuffer, _
                                         Len(strLastDllErrMsgBuffer), ByVal 0)
  
   'エラーメッセージを表示
   GetErrMsg = Left(strLastDllErrMsgBuffer, InStr(strLastDllErrMsgBuffer, vbNullChar) - 1)

End Function

投稿時間:2003/07/16(Wed) 19:23
投稿者名:これ
URL :
タイトル:
Re: ExtCreatePen関数について
ExtCreatePenを使ってるサンプルがあったので見てみましたが
正常に描画されているそのサンプルの hPen は 0 でした。
>   If hPen = 0 Then
>      MsgBox GetErrMsg(Err.LastDllError)
>   End If
ここをコメントアウトしてみてはいかがでしょう?

投稿時間:2003/07/16(Wed) 20:17
投稿者名:みさき
URL :
タイトル:
Re^2: ExtCreatePen関数について
> ExtCreatePenを使ってるサンプルがあったので見てみましたが
> 正常に描画されているそのサンプルの hPen は 0 でした。
> >   If hPen = 0 Then
> >      MsgBox GetErrMsg(Err.LastDllError)
> >   End If
> ここをコメントアウトしてみてはいかがでしょう?

これさん返答ありがとうございます。

Msdnには
関数が成功すると、論理ペンのハンドルが返ります。
関数が失敗すると、0 が返ります。
とあります。
実際にhPenが0で SelectObjectでペンの変更を行い
LineToで実際に線を書いてみましたが、
ペンの変更は行われていませんでした。
※変更前のペンで描画はされています。

もしよろしければ、そのサンプルを
見せてもらえないでしょうか?
どうかよろしくお願いします。

投稿時間:2003/07/16(Wed) 20:01
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: ExtCreatePen関数について
第5引数の型がちがうからではないでしょうか?
Win98 ならそのままでもOKでしたが、WinXP では下記でないとハンドルが取得できないようです。
(APIの宣言の方を直すか)

  hPen = ExtCreatePen(PS_GEOMETRIC Or PS_SOLID Or PS_ENDCAP_SQUARE Or PS_JOIN_BEVEL, 2, typLog, 0, ByVal 0&)

投稿時間:2003/07/16(Wed) 20:26
投稿者名:みさき
URL :
タイトル:
ありがとうございました
> 第5引数の型がちがうからではないでしょうか?
> Win98 ならそのままでもOKでしたが、WinXP では下記でないとハンドルが取得できないようです。
> (APIの宣言の方を直すか)
>
>   hPen = ExtCreatePen(PS_GEOMETRIC Or PS_SOLID Or PS_ENDCAP_SQUARE Or PS_JOIN_BEVEL, 2, typLog, 0, ByVal 0&)

ご指摘のとうり変更したところ、正常にペンを変更できました。
ありがとうございました。

No.4861は行き違いになってしまいました。失礼しました。