エディットで自動ポップアップを無効化したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
オカピーα
記事: 120
登録日時: 13年前

エディットで自動ポップアップを無効化したい

#1

投稿記事 by オカピーα » 12年前

こんにちは。毎回お世話になっております。
今回メモ帳風なソフトウェアをつくっているのですが
エディットを右クリックしたときに出るデフォルトで実装されているポップアップが鬱陶しいです。
出ないように(というか自作のポップアップ)したいのですが、良い方法が見つかりません。
リッチエディットは「ES_NOIME」というのがあるのですが普通のエディットには見つかりませんでした。
どなたかご教授ください
C,C++,C#,これらを極めることを「3C政策」と言う

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: エディットで自動ポップアップを無効化したい

#2

投稿記事 by softya(ソフト屋) » 12年前

Spy++でメッセージを調べてみてはどうでしょうか?
「Spy++ の概要」
http://msdn.microsoft.com/ja-jp/library ... 60756.aspx
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: エディットで自動ポップアップを無効化したい

#3

投稿記事 by ISLe » 12年前

確かサブクラス化してWM_CONTEXTMENUを横取りしたらできたかと思います(未確認)。

オカピーα
記事: 120
登録日時: 13年前

Re: エディットで自動ポップアップを無効化したい

#4

投稿記事 by オカピーα » 12年前

WM_CONTEXTMENUを捕まえてbreakしてみましたが無理でした・・・
さらにサブクラス化したところでなんとWM_RBOTTONDOWNメッセージが来ません!
(つまり右クリックが受け取れない)
どうしたらいいでしょう・・・
C,C++,C#,これらを極めることを「3C政策」と言う

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: エディットで自動ポップアップを無効化したい

#5

投稿記事 by softya(ソフト屋) » 12年前

サブクラス化してWM_CONTEXTMENUを捕まえる話は何処へいったのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: エディットで自動ポップアップを無効化したい

#6

投稿記事 by YuO » 12年前

サブクラス化でコンテキストメニューの抑止はできますが……。

面倒なんでテストコードをそのまま (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;
}

オカピーα
記事: 120
登録日時: 13年前

Re: エディットで自動ポップアップを無効化したい

#7

投稿記事 by オカピーα » 12年前

自力で解決できました!
解決方法としては、WM_RBOTTOMDOWNを受け取ってTrackPopupメニューを表示し、
return 0する方法です。
WM_RBOTTOMDOWNがこなかったのは「R」と「L」を間違えていたようです。
WM_CONTEXTMENUも検討しましたがWM_RBOTTOMDOWNは補助項目にマウス座標が入っていてやりやすいので
後者にします。
お答えしてくださった皆様ありがとうございました!
C,C++,C#,これらを極めることを「3C政策」と言う

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: エディットで自動ポップアップを無効化したい

#8

投稿記事 by ISLe » 12年前

WM_CONTEXTMENUでもマウス座標を取れますけどね。

マウスの右クリック以外でもコンテキストメニューを開くことはできるのですが、そのときWM_RBUTTONDOWNイベントは発生しましたっけ。

ウィンドウズがコンテキストメニューを表示する(WM_CONTEXTMENUを発生させる)タイミングはWM_RBUTTONUPのあとです。
変わる可能性が無いとも言えないので、専用イベントがあるものはそちらを使ったほうが良いですよ。
ウィンドウズの使い勝手なんて無視して独自のポリシーを貫きたいのかもしれませんが、わざわざ茨の道を進むこともないと思います。

オカピーα
記事: 120
登録日時: 13年前

Re: エディットで自動ポップアップを無効化したい

#9

投稿記事 by オカピーα » 12年前

返信ありがとうございます。
WM_CONTEXTMENUも検討してみることにします^^
C,C++,C#,これらを極めることを「3C政策」と言う

閉鎖

“C言語何でも質問掲示板” へ戻る