![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_01.png?5a7ff87)
現在Win32 APIのGetOpenFileName/SetOpenFileNameを利用したファイルダイアログの作成をしているのですが、OPENFILENAME.FlagsにOFN_ENABLESIZING属性を、lpfnHookにイベントを取得する関数を設定した状態で、手動によるダイアログサイズの変更を行っても、WM_INITDIALOGやWM_NOTYFYイベントは受け取ることはできても、WM_SIZEイベントを受け取ることができません。
コモンダイアログのウィンドウサイズが変更されたことを知る方法はないでしょうか。
No.4ベストアンサー
- 回答日時:
#1です。
「 親ダイアログのWM_SIZEイベントを取得できるようにするAPIなどがあればお教え下さい。」
ハイ、APIは #3のコードの中にある GetParent と SetWindowLong です。でもそのような質問を
される段階ならば、まずは「サブクラス化」について調べてみることをお勧めします。
#3の投稿によると 「//2回親を取らないと親ダイアログに辿りつけない」とのこですが、
確認のため試してみました。でも、フックダイアログの一つ上の階層が GetOpenFileName で
呼び出されるダイアログでした(SPYで確認)。
フックダイアログ一つ上の階層のダイアログにて WM_SIZE もマウスドラッグに応じてイベントを
取れました。コードを付けときますが、全角スペースでインシデントしてますので、変換してください。
//////////////////////////////////////////////////////////////////////////////
// resource.h
#define IDD_DIALOG1 101
//////////////////////////////////////////////////////////////////////////////
// resource.rc
#include "resource.h"
#include "afxres.h"
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 187, 90
STYLE WS_CHILD
FONT 9, "MS Pゴシック"
BEGIN
END
//////////////////////////////////////////////////////////////////////////////
// sample.cpp
#include <windows.h>
#include "resource.h"
UINT CALLBACK OfnTopDlgProc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp);
UINT CALLBACK OfnHookDlgProc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp);
DLGPROC OfnOrgTopDlgProc;
//--------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR pszCmdLine, int nCmdShow)
{
char fileName[MAX_PATH] = {0};
OPENFILENAME ofn = {0};
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hInstance = hinst;
ofn.lpstrFile = fileName;
ofn.nMaxFile = sizeof(fileName);
ofn.Flags |= OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLESIZING;
ofn.lpfnHook = OfnHookDlgProc;
ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);
::GetOpenFileName(&ofn);
return 0;
}
//--------------------------------------------------------------------------
UINT CALLBACK OfnTopDlgProc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
char buff[128];
switch(wm){
case WM_SIZE:
::wsprintf(buff, "WM_SIZE (%d, %d)\n", LOWORD(lp), HIWORD(lp));
::OutputDebugString(buff);
break;
}
return ::CallWindowProc((WNDPROC)OfnOrgTopDlgProc, hwnd, wm, wp, lp);
}
//--------------------------------------------------------------------------
UINT CALLBACK OfnHookDlgProc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
static HWND hTopDlg;
switch(wm){
case WM_INITDIALOG:
OfnOrgTopDlgProc = (DLGPROC)::SetWindowLong(::GetParent(hwnd), DWL_DLGPROC, (DWORD)OfnTopDlgProc);
break;
case WM_DESTROY:
if(!OfnOrgTopDlgProc)
::SetWindowLong(hTopDlg, DWL_DLGPROC, (DWORD)OfnOrgTopDlgProc);
break;
}
return FALSE;
}
サンプルコードを元に作ってみたところ見事メッセージを取得することができました。これまではサブクラス化はMFCが用意している関数から使っていたので、Win32による例は大変参考になりました。
No.3
- 回答日時:
こんにちは。
補足頂きました。親ダイアログの「WM_WINDOWPOSCHANGING」に送られて来ていました。
ただ、自分自身のメッセージかファイルダイアログからのメッセージかを見分ける手立てが無いので、フラグの上げ下げ等をしないといけないかもしれません。
因みに当方はwindows2000sp4、vc60です。以下参考程度に。
//ファイルダイアログのフックプロシージャ
UINT CALLBACK OFNHookProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
//2回親を取らないと親ダイアログに辿りつけない
HWND hParent = ::GetParent(::GetParent(hWnd));
switch(iMsg)
{
case WM_INITDIALOG:
//親ダイアログの自由データに1を書く
::SetWindowLong(hParent, GWL_USERDATA, 1);
break;
case WM_NCDESTROY:
//親ダイアログの自由データに0を書く(閉じて無くなるので)
::SetWindowLong(hParent, GWL_USERDATA, 0);
break;
case WM_SIZE://ココは一回しか呼ばれないらしい
break;
}
return 0;
}
//親ダイアログのプロシージャ
INT CALLBACK DlgProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch(iMsg)
{
case WM_????????:
取り敢えずココら辺でファイルダイアログを開いていると仮定する
return 0;
case WM_WINDOWPOSCHANGING://ファイルダイアログがリサイズされる度、ココに入って来ていた
{
LPWINDOWPOS lpwp = (LPWINDOWPOS)lParam;
//ファイルダイアログが開かれていれば自由データから1の数字が取れる筈・・・
const LONG lFromFileDialog = ::GetWindowLong(lpwp->hwnd, GWL_USERDATA);
return 0;
}
case WM_NOTIFY://ココには入って来なかった
}
return 0;
}
No.2
- 回答日時:
こんにちは。
OPENFILENAME構造体のFlagsメンバに、OFN_EXPLORERフラグを設定し忘れているのでは?
OFN_ENABLEHOOKフラグ等を指定する時は、OFN_EXPLORERフラグも追加してあげないと、旧スタイル(画像上)になってしまいます。
旧スタイルにはリサイズで摘む場所がない様です。
↓こんな感じに設定する
ofn.Flags = OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_ENABLEHOOK | OFN_EXPLORER;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- その他(Microsoft Office) Office(Windows版,Word/Excel/PowerPoint等)にログインできません 4 2022/07/24 15:18
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー Run-Time Check Failur...
-
Win32でシリアル通信
-
エディットボックスの背景の色...
-
C++のcase文の書き方
-
リソースファイルの結合ができない
-
C言語win32api、エディットボッ...
-
音量調節
-
PeekMessageについて
-
Win32APIでウィンドウを中央に...
-
不思議な現象が起こるプログラ...
-
ファンクションキー制御?
-
#define _CRT_SECURE_NO_WARNIN...
-
プログラミング初心者です。 Py...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
C言語での引数の省略方法
-
既定のコンストラクタがありま...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
エラー Run-Time Check Failur...
-
コンソールアプリケーションの...
-
MessageBoxについて
-
画像を表示したいのですが……
-
【Windowsアプリ】ファイルのド...
-
PeekMessageについて
-
キャレットの現在位置の表示 (W...
-
C言語win32api、エディットボッ...
-
ボタンの色(WINAPI)
-
Win32APIにて、ウィンドウ全体...
-
音量調節
-
エディットコントロール入力時...
-
ダイアログプログラムでEnterキ...
-
不明なエラー
-
C++のcase文の書き方
-
オーバーレイみたいな処理がしたい
-
ゲームとかの解像度変更&全画...
-
WM_CREATE について
-
LoadImageとSetCursorについて
おすすめ情報