こんにちは。毎回お世話になっております。
今回メモ帳風なソフトウェアをつくっているのですが
エディットを右クリックしたときに出るデフォルトで実装されているポップアップが鬱陶しいです。
出ないように(というか自作のポップアップ)したいのですが、良い方法が見つかりません。
リッチエディットは「ES_NOIME」というのがあるのですが普通のエディットには見つかりませんでした。
どなたかご教授ください
エディットで自動ポップアップを無効化したい
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: エディットで自動ポップアップを無効化したい
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: エディットで自動ポップアップを無効化したい
確かサブクラス化してWM_CONTEXTMENUを横取りしたらできたかと思います(未確認)。
Re: エディットで自動ポップアップを無効化したい
WM_CONTEXTMENUを捕まえてbreakしてみましたが無理でした・・・
さらにサブクラス化したところでなんとWM_RBOTTONDOWNメッセージが来ません!
(つまり右クリックが受け取れない)
どうしたらいいでしょう・・・
さらにサブクラス化したところでなんとWM_RBOTTONDOWNメッセージが来ません!
(つまり右クリックが受け取れない)
どうしたらいいでしょう・・・
C,C++,C#,これらを極めることを「3C政策」と言う
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: エディットで自動ポップアップを無効化したい
サブクラス化してWM_CONTEXTMENUを捕まえる話は何処へいったのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: エディットで自動ポップアップを無効化したい
サブクラス化でコンテキストメニューの抑止はできますが……。
面倒なんでテストコードをそのまま (VS2010 in Win8pro)。
面倒なんでテストコードをそのまま (VS2010 in Win8pro)。
#include <Windows.h>
#include <CommCtrl.h>
#pragma comment(lib, "comctl32")
LRESULT CALLBACK EditSubClassedProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
if (uMsg == WM_CONTEXTMENU)
{
return 0;
}
if (uMsg == WM_DESTROY)
{
PostQuitMessage(0);
}
DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
HWND hWnd = CreateWindow(TEXT("EDIT"), TEXT("Test"), WS_OVERLAPPEDWINDOW | ES_MULTILINE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, nullptr, 0);
if (hWnd == nullptr)
{
return GetLastError();
}
if (!SetWindowSubclass(hWnd, EditSubClassedProc, 1, 0))
{
return GetLastError();
}
ShowWindow(hWnd, SW_SHOW);
MSG msg;
BOOL result;
while ((result = GetMessage(&msg, nullptr, 0, 0)) != 0 && result != -1)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (result == -1)
{
return GetLastError();
}
return msg.wParam;
}
Re: エディットで自動ポップアップを無効化したい
自力で解決できました!
解決方法としては、WM_RBOTTOMDOWNを受け取ってTrackPopupメニューを表示し、
return 0する方法です。
WM_RBOTTOMDOWNがこなかったのは「R」と「L」を間違えていたようです。
WM_CONTEXTMENUも検討しましたがWM_RBOTTOMDOWNは補助項目にマウス座標が入っていてやりやすいので
後者にします。
お答えしてくださった皆様ありがとうございました!
解決方法としては、WM_RBOTTOMDOWNを受け取ってTrackPopupメニューを表示し、
return 0する方法です。
WM_RBOTTOMDOWNがこなかったのは「R」と「L」を間違えていたようです。
WM_CONTEXTMENUも検討しましたがWM_RBOTTOMDOWNは補助項目にマウス座標が入っていてやりやすいので
後者にします。
お答えしてくださった皆様ありがとうございました!
C,C++,C#,これらを極めることを「3C政策」と言う
Re: エディットで自動ポップアップを無効化したい
WM_CONTEXTMENUでもマウス座標を取れますけどね。
マウスの右クリック以外でもコンテキストメニューを開くことはできるのですが、そのときWM_RBUTTONDOWNイベントは発生しましたっけ。
ウィンドウズがコンテキストメニューを表示する(WM_CONTEXTMENUを発生させる)タイミングはWM_RBUTTONUPのあとです。
変わる可能性が無いとも言えないので、専用イベントがあるものはそちらを使ったほうが良いですよ。
ウィンドウズの使い勝手なんて無視して独自のポリシーを貫きたいのかもしれませんが、わざわざ茨の道を進むこともないと思います。
マウスの右クリック以外でもコンテキストメニューを開くことはできるのですが、そのときWM_RBUTTONDOWNイベントは発生しましたっけ。
ウィンドウズがコンテキストメニューを表示する(WM_CONTEXTMENUを発生させる)タイミングはWM_RBUTTONUPのあとです。
変わる可能性が無いとも言えないので、専用イベントがあるものはそちらを使ったほうが良いですよ。
ウィンドウズの使い勝手なんて無視して独自のポリシーを貫きたいのかもしれませんが、わざわざ茨の道を進むこともないと思います。