ab.com コミュニティ https://www.activebasic.com/forum/ |
|
アイコン選択ダイアログについて https://www.activebasic.com/forum/viewtopic.php?t=888 |
ページ 1 / 1 |
作成者: | 如月 [ 2006年3月31日(金) 21:10 ] |
記事の件名: | アイコン選択ダイアログについて |
いろいろと試行錯誤の末、なんとかダイアログの表示に成功したのですが、 選択したアイコンファイルのパスが取得できません。 コード: Dim hShell As HINSTANCE Dim SHChangeIconDialog As *Function(hWnd As HWND, ByRef lpszFilename As *Byte, Reserved As Long, ByRef lpIconIndex As Long) As Long Dim str As *Byte, index As Long, flag As Long Dim dwSize As Long, pwFileName As *Word hShell = LoadLibrary("Shell32") As HINSTANCE SHChangeIconDialog = GetProcAddress(hShell, 62 As *Byte) As *Function flag=SHChangeIconDialog(hMainWnd, str, -1, index) If flag=1 Then MessageBox(hMainWnd, MakeStr(str), Str$(index), MB_OK) End If FreeLibrary(hShell As DWord)どこをどう直せばいいのかさっぱりです。 ヒントでもいいので、よろしくお願いします。 |
作成者: | イグトランス [ 2006年4月01日(土) 00:08 ] |
記事の件名: | |
まず、ByRef lpszFilename As *ByteのByRefは不要です。 strはポインタですがどこも指していないのでまずいです。 また,この関数は非公開なので,9xではマルチバイト文字,NTではユニコード文字を使用するのでその区別も必要です。 興味があったので自分なりにどうにかしてみました。 それらをChangeIconDialogという関数を作り,そこに押し込めてみました。 このように使えます。 コード: Dim Index As Long Dim strPath As String strPath = ChangeIconDialog(hMainWnd, Index) MessageBox(0, strPath, Str$(Index), MB_OK)ChangeIconDialog関数の定義です。プロジェクト内の適当なところにコピーしてください。 [ここをクリックすると内容が表示されます]
あるいはOleUIChangeIconという公開関数を使うという方法もあります。コード: Declare Function lstrlenW Lib "kernel32" (pwsz As *WCHAR) As Long Function ChangeIconDialog(hwnd As HWND, ByRef Index As Long) As String If VersionInfo.dwPlatformId <> VER_PLATFORM_WIN32_WINDOWS Then Dim wstr[ELM(MAX_PATH)] As WCHAR Dim SHChangeIconDialogW As PChangeIconDialogW SHChangeIconDialogW = GetProcAddress(hShell, 62 As *Byte) As PChangeIconDialogW If SHChangeIconDialogW(hwnd, wstr, MAX_PATH, Index) <> FALSE Then ChangeIconDialog = ToMBString(wstr) End If Else Dim str[ELM(MAX_PATH)] As Byte Dim SHChangeIconDialogA As PChangeIconDialogA SHChangeIconDialogA = GetProcAddress(hShell, 62 As *Byte) As PChangeIconDialogA If SHChangeIconDialogA(hwnd, str, MAX_PATH, Index) <> FALSE Then ChangeIconDialog = str End If End If End Function Function ToMBString(pwsz As *WCHAR) As String Dim lenW As Long lenW = lstrlenW(pwsz) Dim lenA As Long lenA = WideCharToMultiByte(CP_ACP, 0, pwsz, lenW, 0, 0, 0, 0) ToMBString = ZeroString(lenA) WideCharToMultiByte(CP_ACP, 0, pwsz, lenW, StrPtr(ToMBString), lenA, 0, 0) End Functionshell32.dllは毎回ロードしていては非効率なので,プログラム開始時にロードし,終了時にアンロードするようにします。 次の2つのグローバル変数が必要です。 コード: Dim VersionInfo As OSVERSIONINFO Dim hShell As HINSTANCECreateイベントには次の記述を追加してください。 コード: VersionInfo.dwOSVersionInfoSize = Len(VersionInfo) GetVersionEx(VersionInfo) hShell = LoadLibrary("Shell32") As HINSTANCEDestroyイベントには次の記述を加えます。 コード: FreeLibrary(hShell As DWord) ただこの関数で表示されるダイアログは見慣れないものだということが欠点です。 |
作成者: | 如月 [ 2006年4月01日(土) 11:12 ] |
記事の件名: | |
回答ありがとうございます。 PChangeIconDialogW や PChangeIconDialogA が無効な識別子と出るのですが、 どうすればよいのでしょうか? |
作成者: | 如月 [ 2006年4月01日(土) 19:49 ] |
記事の件名: | |
コード: Typedef PChangeIconDialogW = *Function(hWnd As HWND, lpszFilename As *Word, Reserved As Long, ByRef lpIconIndex As Long) As Long Typedef PChangeIconDialogA = *Function(hWnd As HWND, lpszFilename As String, Reserved As Long, ByRef lpIconIndex As Long) As Longを追加したらなんとか出来ました。 ありがとうございました。 これでOKなのか、やや不安がありますが… |
作成者: | 三毛CAT [ 2008年7月27日(日) 18:16 ] |
記事の件名: | バグ? |
このままだとパスが出なくて、(WindowsMe) ChangeIconDialogの中の コード: If SHChangeIconDialogA(hwnd, str, MAX_PATH, Index) <> FALSE Thenを、 コード: If SHChangeIconDialogA(hwnd, VarPtr(str[0]), MAX_PATH, Index) <> FALSE Thenに換えたらうまくいきました。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |