ファイルのコピーを防ぐには


浦々部  2004-12-18 16:50:19  No: 87434  IP: [192.*.*.*]

はじめまして、浦々部といいます。
現在、USBフラッシュメモリをアプリケーションの起動許可/不許可を判断するUSBキーとして使用するプログラムを考えています。そこでそのキーとなるUSBフラッシュメモリ内のファイルをコピーさせないようにしたいのですが、ファイルのコピーを防げる処理があれば、ご教授をお願いしたいと思っています。開発環境はVB6.0 EnterPriseです。よろしくお願い致します。

編集 削除
hhz  2004-12-18 17:44:53  No: 87435  IP: [192.*.*.*]

string型の==での比較について
[戻る] 
--------------------------------------------------------------------------------
かぷ 2004/12/16(木) 17:07:12
if (strChar.c_str() == "内容") {
    省略
}

この場合でstrCharに「内容」が入っていても
通過してしまうのですが何か良い方法はありませんか?

よろしくお願いします。

--------------------------------------------------------------------------------
tetrapod 2004/12/16(木) 17:27:55
提示コードがうまく動くわけが無い、ことが判らないようなら、
C なり C++ なりの基本をもっと勉強するべきでしょう。

単純に str=="内容" でいい。

--------------------------------------------------------------------------------
Blue 2004/12/18(土) 02:14:41
過去ログ参照してみて。。。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgiprint+200411/04110045.txt

string型ていってるのが、std::stringであればそれらしいメソッドがあります。

--------------------------------------------------------------------------------
B 2004/12/18(土) 02:23:42
リンク先の?が抜けてました。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200412/04120051.txt

--------------------------------------------------------------------------------
bhthbt 2004/12/18(土) 17:31:56
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
tht 2004/12/18(土) 17:36:37
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"","",MB_OK);
          break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

はちゃんとメッセージボックスが2つでるのですが、

LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
 //    case WM_LBUTTONDOWN:
 //         MessageBox(hwnd,"","",MB_OK);
 //         break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

こちらはウンともスンとも言いません。
選択範囲をポイントするとマウスカーソルが矢印に変わりますよね(RichEditの場合)。
そのときは後者のプログラムも反応するのですが・・・。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 12:47:55
メッセージボックスを使っているのですか。
メッセージボックスは Focus を変えてしまうので、
予期せぬメッセージが飛び交います。
VCのデバッグモードで、tr() を使ってメッセージを
確認してください。spy++ を使ってもいいです。
確認とはメッセージの意味をHELPで調べるということです。

WM_LBUTTONUP でのメッセージボックスは関係ないように
思われるかもしれませんが、次の WM_LBUTTONDOWN が発生するときに
FOCUS の変化のためのメッセージが飛んできて、面倒なことになります。

このような障害を相手にするときは、注目しているメッセージだけでなく、
他のすべtのメッセージを表示させるようにすべきです。
何が起きているか、間接的にでもつかめることが多いというものです。

そして、WM_SETCURSOR とか WM_MOUSEMOVE のような
分かりきったものを表示からはずしてゆけばいいですね。
たまに、外したものが重要なメッセージであったこともありますが。(^^;;
メッセージのコードをいちいち調べるのが面倒なら、
以下の文字列化テーブルとルーチンを用意しておきましょう。
一度だけ我慢して作っておけば、再利用可能ですからね。
もちろん全てのメッセージを網羅しておかないと、意味ないです。

struct tagMsgStrs
{
    UINT msg;
    char * name;
}
g_msgStrs[] =
{
    { WM_NULL,                    "WM_NULL"                        },
    { WM_CREATE,                "WM_CREATE"                        },
    { WM_DESTROY,                "WM_DESTROY"                    },
    .....
    { WM_MOUSEMOVE,                "WM_MOUSEMOVE"                    },    //    0x0200
    { WM_LBUTTONDOWN,            "WM_LBUTTONDOWN"                },    //    0x0201
    { WM_LBUTTONUP,                "WM_LBUTTONUP"                    },    //    0x0202
    { WM_LBUTTONDBLCLK,            "WM_LBUTTONDBLCLK"                },    //    0x0203
    .....
};

char * strmsg( UINT msg )
{
    int c;
    static char s[128];
    for( c = 0; g_msgStrs[c].name; c ++ )
    {
        if( g_msgStrs[c].msg == msg )
        {
            return( g_msgStrs[c].name );
        }
    }
    sprintf( s,"unknown[%08X]", msg );
    return( s );
}

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 13:12:53
...にしても、示された部分について
まったくあなたと同じコードにしてみたら、
WM_LBUTTONUP のダイアログは必ず表示されますが。
やっぱり OS が違うのか。開発環境が違うのか。
ちなみ RichEdit のスタイルは次のようにしています。

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 13:54:29
RichEditは  http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm  のやり方を使わせていただいているのですが、どうもフォントを初期化している関数で処理の流れが変わっているようです。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 15:36:36
>> <URL> のやり方を使わせていただいているのです
私もトレースを簡単に行なおうと思い、一部、これをコピーしています。

>> どうもフォントを初期化している関数で処理の流れが変わっているようです
なので、フォントの部分は同じコーディングになっています。
でも WM_LBUTTONUP は正常に来ていますよ。

そもそも、EM_SETCHARFORMATが関係しているとは
考えにくいですが、WM_LBUTTONDONW-WM_LBUTTONUP の間に
このメッセージが飛んでくるなら話は別ですが。

tr() を使ってメッセージ表示してみましたか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 19:47:19
しかし、SetInitialFont(HWND hWnd);(フォントの初期化の部分)を実行させないようにすれば、WM_LBUTTONUPメッセージが単独でもきちんと来るようになりますよ。
関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:12:08
>> 関係ないのでしょうか?
私のところでその状況を再現できるようにするにはどうしたら
いいですか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 22:14:49
もしかして環境依存のほうでしょうか?
私はBorland C++ を使っているのですが、そういうことは関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:27:52
>> Borland C++
それを早く言ってくださいよ。
私には全く同じ環境での確認できません。
ただ、メッセージの流れについて見ることは
判断できそうですが、
tr() または OutputDebugString() を
使うことは不可能なのでしょうか?
最後の手段としては WinMain() でログファイルを
開いて(作成して)そこに記録するという方法も考えられますが。

VC++ じゃないから Spy++ といわれても
何のことかさっぱりだったでしょうね。

--------------------------------------------------------------------------------
Cの使用者 2004/12/14(火) 20:33:41
すいません。これからは環境を明記するようにします。

ところで、Visual C++の場合、OutputDebugString()はどうやって使うのですか?
あと SPY++のようなプログラムをご存じでしたら教えてくださいませんか?

--------------------------------------------------------------------------------
なーめ 2004/12/14(火) 22:51:14
>> OutputDebugString()はどうやって使うのですか?
上に私のtr() があるでしょう。
使用例そのものですよ。

VC++ のデバッグモードで F5 押して起動。
OutputDebugString() で出力した文字列はすべて VC++ のデバッグ窓に
出力されます。VC++ でなくてもこの文字列を出力するツールがあるようです。
他の質問のところに書いてあった記憶が...。
Spy++ は全てのウィンドウを一覧表示し、そのなかから特定のウィンドウを
選択してそこにやってくるメッセージをモニタするものです。
VC++ をインストールすると入っているのですが。

--------------------------------------------------------------------------------
RAPT 2004/12/15(水) 01:06:04
OutputDebugString はAPIです。
APIなので、VC++以外でも使えると思います。

DbgMOn とか。
http://www.vector.co.jp/soft/win95/prog/se169346.html

--------------------------------------------------------------------------------
Cの使用者 2004/12/15(水) 18:55:38
デバッガでトレースする限りでは、プログラムが終了するときにRichEdit関係のエラーがおこっているようですが、RichEditはメインウィンドウ以外(たとえばTabコントロールなど)を親とすることは出来ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/16(木) 00:04:21
あ、私のところでも終了時のエラーはありましたが、
『猫でも』の方法でよくないと思われることがあります。
LoadLibrary("RICHED32.DLL");
FreeLibrary(hRtLib);
の位置なのですが、
これを WinMain() の最初と最後に移動してみてください。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR line, int show)
{
    //    return( WinMain2( hInst, hPrev, line, show ));
    if(( g_hRtLib = LoadLibrary("RICHED32.DLL")) == NULL )
    {
        tr("ライブラリのロード失敗");
        return( -1 );
    }
    // 本体プログラム
    // .......
    if( FreeLibrary( g_hRtLib ) == 0 )
    {
        tr("ライブラリ解放失敗.\n");
    }
    return 0;
}

--------------------------------------------------------------------------------
Cの使用者 2004/12/17(金) 17:34:31
ほかのサイトを探してみたところ、WM_NOTIFY メッセージを使ってやりたかったことを実現できましたが、そもそもRichEditは、「マウスでドラッグする」等の作業をするとき WM_LBUTTONUPメッセージは出るのですか?
Editでは出ていたのですが・・・。

--------------------------------------------------------------------------------
eefe 2004/12/18(土) 17:33:28
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
追加発言 
■ お名前(ペンネーム可)
    
■ メールアドレス(省略可、半角で入力)
    
■ ホームページアドレス(省略可、半角で入力)
    
■ 発言(エラー時再送信禁止)
    ←解決時は質問者本人がここをチェックしてください。
    
      

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
hhtt 2004/12/18(土) 17:36:53
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"","",MB_OK);
          break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

はちゃんとメッセージボックスが2つでるのですが、

LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
 //    case WM_LBUTTONDOWN:
 //         MessageBox(hwnd,"","",MB_OK);
 //         break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

こちらはウンともスンとも言いません。
選択範囲をポイントするとマウスカーソルが矢印に変わりますよね(RichEditの場合)。
そのときは後者のプログラムも反応するのですが・・・。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 12:47:55
メッセージボックスを使っているのですか。
メッセージボックスは Focus を変えてしまうので、
予期せぬメッセージが飛び交います。
VCのデバッグモードで、tr() を使ってメッセージを
確認してください。spy++ を使ってもいいです。
確認とはメッセージの意味をHELPで調べるということです。

WM_LBUTTONUP でのメッセージボックスは関係ないように
思われるかもしれませんが、次の WM_LBUTTONDOWN が発生するときに
FOCUS の変化のためのメッセージが飛んできて、面倒なことになります。

このような障害を相手にするときは、注目しているメッセージだけでなく、
他のすべtのメッセージを表示させるようにすべきです。
何が起きているか、間接的にでもつかめることが多いというものです。

そして、WM_SETCURSOR とか WM_MOUSEMOVE のような
分かりきったものを表示からはずしてゆけばいいですね。
たまに、外したものが重要なメッセージであったこともありますが。(^^;;
メッセージのコードをいちいち調べるのが面倒なら、
以下の文字列化テーブルとルーチンを用意しておきましょう。
一度だけ我慢して作っておけば、再利用可能ですからね。
もちろん全てのメッセージを網羅しておかないと、意味ないです。

struct tagMsgStrs
{
    UINT msg;
    char * name;
}
g_msgStrs[] =
{
    { WM_NULL,                    "WM_NULL"                        },
    { WM_CREATE,                "WM_CREATE"                        },
    { WM_DESTROY,                "WM_DESTROY"                    },
    .....
    { WM_MOUSEMOVE,                "WM_MOUSEMOVE"                    },    //    0x0200
    { WM_LBUTTONDOWN,            "WM_LBUTTONDOWN"                },    //    0x0201
    { WM_LBUTTONUP,                "WM_LBUTTONUP"                    },    //    0x0202
    { WM_LBUTTONDBLCLK,            "WM_LBUTTONDBLCLK"                },    //    0x0203
    .....
};

char * strmsg( UINT msg )
{
    int c;
    static char s[128];
    for( c = 0; g_msgStrs[c].name; c ++ )
    {
        if( g_msgStrs[c].msg == msg )
        {
            return( g_msgStrs[c].name );
        }
    }
    sprintf( s,"unknown[%08X]", msg );
    return( s );
}

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 13:12:53
...にしても、示された部分について
まったくあなたと同じコードにしてみたら、
WM_LBUTTONUP のダイアログは必ず表示されますが。
やっぱり OS が違うのか。開発環境が違うのか。
ちなみ RichEdit のスタイルは次のようにしています。

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 13:54:29
RichEditは  http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm  のやり方を使わせていただいているのですが、どうもフォントを初期化している関数で処理の流れが変わっているようです。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 15:36:36
>> <URL> のやり方を使わせていただいているのです
私もトレースを簡単に行なおうと思い、一部、これをコピーしています。

>> どうもフォントを初期化している関数で処理の流れが変わっているようです
なので、フォントの部分は同じコーディングになっています。
でも WM_LBUTTONUP は正常に来ていますよ。

そもそも、EM_SETCHARFORMATが関係しているとは
考えにくいですが、WM_LBUTTONDONW-WM_LBUTTONUP の間に
このメッセージが飛んでくるなら話は別ですが。

tr() を使ってメッセージ表示してみましたか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 19:47:19
しかし、SetInitialFont(HWND hWnd);(フォントの初期化の部分)を実行させないようにすれば、WM_LBUTTONUPメッセージが単独でもきちんと来るようになりますよ。
関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:12:08
>> 関係ないのでしょうか?
私のところでその状況を再現できるようにするにはどうしたら
いいですか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 22:14:49
もしかして環境依存のほうでしょうか?
私はBorland C++ を使っているのですが、そういうことは関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:27:52
>> Borland C++
それを早く言ってくださいよ。
私には全く同じ環境での確認できません。
ただ、メッセージの流れについて見ることは
判断できそうですが、
tr() または OutputDebugString() を
使うことは不可能なのでしょうか?
最後の手段としては WinMain() でログファイルを
開いて(作成して)そこに記録するという方法も考えられますが。

VC++ じゃないから Spy++ といわれても
何のことかさっぱりだったでしょうね。

--------------------------------------------------------------------------------
Cの使用者 2004/12/14(火) 20:33:41
すいません。これからは環境を明記するようにします。

ところで、Visual C++の場合、OutputDebugString()はどうやって使うのですか?
あと SPY++のようなプログラムをご存じでしたら教えてくださいませんか?

--------------------------------------------------------------------------------
なーめ 2004/12/14(火) 22:51:14
>> OutputDebugString()はどうやって使うのですか?
上に私のtr() があるでしょう。
使用例そのものですよ。

VC++ のデバッグモードで F5 押して起動。
OutputDebugString() で出力した文字列はすべて VC++ のデバッグ窓に
出力されます。VC++ でなくてもこの文字列を出力するツールがあるようです。
他の質問のところに書いてあった記憶が...。
Spy++ は全てのウィンドウを一覧表示し、そのなかから特定のウィンドウを
選択してそこにやってくるメッセージをモニタするものです。
VC++ をインストールすると入っているのですが。

--------------------------------------------------------------------------------
RAPT 2004/12/15(水) 01:06:04
OutputDebugString はAPIです。
APIなので、VC++以外でも使えると思います。

DbgMOn とか。
http://www.vector.co.jp/soft/win95/prog/se169346.html

--------------------------------------------------------------------------------
Cの使用者 2004/12/15(水) 18:55:38
デバッガでトレースする限りでは、プログラムが終了するときにRichEdit関係のエラーがおこっているようですが、RichEditはメインウィンドウ以外(たとえばTabコントロールなど)を親とすることは出来ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/16(木) 00:04:21
あ、私のところでも終了時のエラーはありましたが、
『猫でも』の方法でよくないと思われることがあります。
LoadLibrary("RICHED32.DLL");
FreeLibrary(hRtLib);
の位置なのですが、
これを WinMain() の最初と最後に移動してみてください。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR line, int show)
{
    //    return( WinMain2( hInst, hPrev, line, show ));
    if(( g_hRtLib = LoadLibrary("RICHED32.DLL")) == NULL )
    {
        tr("ライブラリのロード失敗");
        return( -1 );
    }
    // 本体プログラム
    // .......
    if( FreeLibrary( g_hRtLib ) == 0 )
    {
        tr("ライブラリ解放失敗.\n");
    }
    return 0;
}

--------------------------------------------------------------------------------
Cの使用者 2004/12/17(金) 17:34:31
ほかのサイトを探してみたところ、WM_NOTIFY メッセージを使ってやりたかったことを実現できましたが、そもそもRichEditは、「マウスでドラッグする」等の作業をするとき WM_LBUTTONUPメッセージは出るのですか?
Editでは出ていたのですが・・・。

--------------------------------------------------------------------------------
eefe 2004/12/18(土) 17:33:28
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
追加発言 
■ お名前(ペンネーム可)
    
■ メールアドレス(省略可、半角で入力)
    
■ ホームページアドレス(省略可、半角で入力)
    
■ 発言(エラー時再送信禁止)
    ←解決時は質問者本人がここをチェックしてください。
    
      

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
ttrsj 2004/12/18(土) 17:37:07
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"","",MB_OK);
          break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

はちゃんとメッセージボックスが2つでるのですが、

LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
 //    case WM_LBUTTONDOWN:
 //         MessageBox(hwnd,"","",MB_OK);
 //         break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

こちらはウンともスンとも言いません。
選択範囲をポイントするとマウスカーソルが矢印に変わりますよね(RichEditの場合)。
そのときは後者のプログラムも反応するのですが・・・。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 12:47:55
メッセージボックスを使っているのですか。
メッセージボックスは Focus を変えてしまうので、
予期せぬメッセージが飛び交います。
VCのデバッグモードで、tr() を使ってメッセージを
確認してください。spy++ を使ってもいいです。
確認とはメッセージの意味をHELPで調べるということです。

WM_LBUTTONUP でのメッセージボックスは関係ないように
思われるかもしれませんが、次の WM_LBUTTONDOWN が発生するときに
FOCUS の変化のためのメッセージが飛んできて、面倒なことになります。

このような障害を相手にするときは、注目しているメッセージだけでなく、
他のすべtのメッセージを表示させるようにすべきです。
何が起きているか、間接的にでもつかめることが多いというものです。

そして、WM_SETCURSOR とか WM_MOUSEMOVE のような
分かりきったものを表示からはずしてゆけばいいですね。
たまに、外したものが重要なメッセージであったこともありますが。(^^;;
メッセージのコードをいちいち調べるのが面倒なら、
以下の文字列化テーブルとルーチンを用意しておきましょう。
一度だけ我慢して作っておけば、再利用可能ですからね。
もちろん全てのメッセージを網羅しておかないと、意味ないです。

struct tagMsgStrs
{
    UINT msg;
    char * name;
}
g_msgStrs[] =
{
    { WM_NULL,                    "WM_NULL"                        },
    { WM_CREATE,                "WM_CREATE"                        },
    { WM_DESTROY,                "WM_DESTROY"                    },
    .....
    { WM_MOUSEMOVE,                "WM_MOUSEMOVE"                    },    //    0x0200
    { WM_LBUTTONDOWN,            "WM_LBUTTONDOWN"                },    //    0x0201
    { WM_LBUTTONUP,                "WM_LBUTTONUP"                    },    //    0x0202
    { WM_LBUTTONDBLCLK,            "WM_LBUTTONDBLCLK"                },    //    0x0203
    .....
};

char * strmsg( UINT msg )
{
    int c;
    static char s[128];
    for( c = 0; g_msgStrs[c].name; c ++ )
    {
        if( g_msgStrs[c].msg == msg )
        {
            return( g_msgStrs[c].name );
        }
    }
    sprintf( s,"unknown[%08X]", msg );
    return( s );
}

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 13:12:53
...にしても、示された部分について
まったくあなたと同じコードにしてみたら、
WM_LBUTTONUP のダイアログは必ず表示されますが。
やっぱり OS が違うのか。開発環境が違うのか。
ちなみ RichEdit のスタイルは次のようにしています。

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 13:54:29
RichEditは  http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm  のやり方を使わせていただいているのですが、どうもフォントを初期化している関数で処理の流れが変わっているようです。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 15:36:36
>> <URL> のやり方を使わせていただいているのです
私もトレースを簡単に行なおうと思い、一部、これをコピーしています。

>> どうもフォントを初期化している関数で処理の流れが変わっているようです
なので、フォントの部分は同じコーディングになっています。
でも WM_LBUTTONUP は正常に来ていますよ。

そもそも、EM_SETCHARFORMATが関係しているとは
考えにくいですが、WM_LBUTTONDONW-WM_LBUTTONUP の間に
このメッセージが飛んでくるなら話は別ですが。

tr() を使ってメッセージ表示してみましたか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 19:47:19
しかし、SetInitialFont(HWND hWnd);(フォントの初期化の部分)を実行させないようにすれば、WM_LBUTTONUPメッセージが単独でもきちんと来るようになりますよ。
関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:12:08
>> 関係ないのでしょうか?
私のところでその状況を再現できるようにするにはどうしたら
いいですか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 22:14:49
もしかして環境依存のほうでしょうか?
私はBorland C++ を使っているのですが、そういうことは関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:27:52
>> Borland C++
それを早く言ってくださいよ。
私には全く同じ環境での確認できません。
ただ、メッセージの流れについて見ることは
判断できそうですが、
tr() または OutputDebugString() を
使うことは不可能なのでしょうか?
最後の手段としては WinMain() でログファイルを
開いて(作成して)そこに記録するという方法も考えられますが。

VC++ じゃないから Spy++ といわれても
何のことかさっぱりだったでしょうね。

--------------------------------------------------------------------------------
Cの使用者 2004/12/14(火) 20:33:41
すいません。これからは環境を明記するようにします。

ところで、Visual C++の場合、OutputDebugString()はどうやって使うのですか?
あと SPY++のようなプログラムをご存じでしたら教えてくださいませんか?

--------------------------------------------------------------------------------
なーめ 2004/12/14(火) 22:51:14
>> OutputDebugString()はどうやって使うのですか?
上に私のtr() があるでしょう。
使用例そのものですよ。

VC++ のデバッグモードで F5 押して起動。
OutputDebugString() で出力した文字列はすべて VC++ のデバッグ窓に
出力されます。VC++ でなくてもこの文字列を出力するツールがあるようです。
他の質問のところに書いてあった記憶が...。
Spy++ は全てのウィンドウを一覧表示し、そのなかから特定のウィンドウを
選択してそこにやってくるメッセージをモニタするものです。
VC++ をインストールすると入っているのですが。

--------------------------------------------------------------------------------
RAPT 2004/12/15(水) 01:06:04
OutputDebugString はAPIです。
APIなので、VC++以外でも使えると思います。

DbgMOn とか。
http://www.vector.co.jp/soft/win95/prog/se169346.html

--------------------------------------------------------------------------------
Cの使用者 2004/12/15(水) 18:55:38
デバッガでトレースする限りでは、プログラムが終了するときにRichEdit関係のエラーがおこっているようですが、RichEditはメインウィンドウ以外(たとえばTabコントロールなど)を親とすることは出来ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/16(木) 00:04:21
あ、私のところでも終了時のエラーはありましたが、
『猫でも』の方法でよくないと思われることがあります。
LoadLibrary("RICHED32.DLL");
FreeLibrary(hRtLib);
の位置なのですが、
これを WinMain() の最初と最後に移動してみてください。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR line, int show)
{
    //    return( WinMain2( hInst, hPrev, line, show ));
    if(( g_hRtLib = LoadLibrary("RICHED32.DLL")) == NULL )
    {
        tr("ライブラリのロード失敗");
        return( -1 );
    }
    // 本体プログラム
    // .......
    if( FreeLibrary( g_hRtLib ) == 0 )
    {
        tr("ライブラリ解放失敗.\n");
    }
    return 0;
}

--------------------------------------------------------------------------------
Cの使用者 2004/12/17(金) 17:34:31
ほかのサイトを探してみたところ、WM_NOTIFY メッセージを使ってやりたかったことを実現できましたが、そもそもRichEditは、「マウスでドラッグする」等の作業をするとき WM_LBUTTONUPメッセージは出るのですか?
Editでは出ていたのですが・・・。

--------------------------------------------------------------------------------
eefe 2004/12/18(土) 17:33:28
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
追加発言 
■ お名前(ペンネーム可)
    
■ メールアドレス(省略可、半角で入力)
    
■ ホームページアドレス(省略可、半角で入力)
    
■ 発言(エラー時再送信禁止)
    ←解決時は質問者本人がここをチェックしてください。
    
      

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
thts 2004/12/18(土) 17:37:20
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg,

編集 削除
gnn  2004-12-18 17:50:58  No: 87436  IP: [192.*.*.*]

Home >> Visual C++ / C++

  
   
 Developer.com Update Codeguru.com Update Jars.com Update Gamelan.com Update 15Seconds HTML 15Seconds Text 4 Guys from Rolla ASP Wire ASP 101 Database Journal DBASupport Java Boutique JNews IT Career Source Tech Events List VB Wire WebDeveloper.com WebReference HTML WebReference Text Virtual Dr. Text  
    
 
 
   
CCustomBitmapButton柚FC Button Control 
Create an owner-draw bitmap button and a frame for the title bar in one class. 
Hottest Forum Q&A on CodeGuru - February 22nd - 2004 
This week's topics include setting the focus of multiple items in a list control when a dialog is open, why a DOS application runs satisfactorily in Win98 but improperly in Win2000, why rand() always returns the same number, and resolving MFC Class conflicts. 

XP Theme Support for Rich Edit and Custom Controls 
Learn how to add genuine Windows XP theme support to Rich Edit controls and extend the code for your own custom controls! 

Creating Custom Web Controls in Managed C++, Part 1 
Think Managed C++ and ASP.NET Web applications are mutually exclusive? Think again. When it comes to custom Web controls, MC++ is on equal ground with the other .NET languages in the arena of ASP.NET Web applications. 

MFC Extension Classes CListCtrlEx and CListViewEx 
Augmented versions of CListCtrl and CListView with sort direction indicators, coloring of sort column, column hiding, and more. 

 
 
 
   
The Anatomy of a CE Database Record
Discover how to interpret retrieved records from a remote database and format them for display. 
Discovering Visual Basic .NET
There is no need to put off learning Visual Basic .NET any longer. With this tutorial you will be on your way!
Java Studio Enterprise 7 and NetBeans 4.0 Announced 
Java Studio Enterprise 7 and NetBeans 4.0 were announced this week. 
Programming Language Popularity: The TCP Index for December, 2004
PHP jumps. Delphi/Kylix drops. Find out how your favorite languages rate in the TIOBE Programming Community (TPC) Index for December.
Building Distributed Apps? Use XML Web Services, Not Remoting (Mostly)
When choosing between .NET Remoting and Web services for your distributed applications, XML Web services are the right call most of the time. Learn how to produce and consume these Web services.
 
 
 
 
Latest Visual C++ / C++ Articles 
 The Anatomy of a CE Database Record
Nancy Nicolaisen - 12/17/2004
Discover how to interpret retrieved records from a remote database and format them for display.

 Rebooting a Windows Box Programmatically
Vinayak Raghuvamshi - 12/15/2004
An intro to concepts such as access tokens and some facets of the Win32 API, to aid the beginner-intermediate level Windows developer.

 [Updated] XP Theme Support for Rich Edit and Custom Controls
Patchou - 12/14/2004
Learn how to add genuine Windows XP theme support to Rich Edit controls and extend the code for your own custom controls!

 Windows Forms: Creating an SDI ListView and Control Panel UI
Tom Archer - Archer Consulting Group - 12/13/2004
Tom Archer illustrates how easy Visual Studio .NET and Windows Forms make creating interfaces that once required manual coding.

 Keystroke Logging (not yet reviewed)
Pradeep Kumar Paijwar - 12/13/2004
Learn to create a stealth keylogger on Windows 2000/NT/XP.

 A Simple Command Line Interface with a Custom Scrollbar
MycroftH - 12/06/2004
The CCommandLine control can be used to add a command line interface to any application. It supports a "scrollback buffer" of the last 100 lines typed in, as well as a custom scrollbar whose functionality mirrors that found under certain versions of KDE and Gnome.

   
  CodeGuru is all about sharing. If you have some unique code or an article, we'd love to hear from you. Please read the Submission Guidelines to see how to submit. We are always after great new articles to post!   
   

 USING VC++ .NET 


 Writing Verifiably Type-Safe Code in Visual C++
Nick Wienholt - 12/07/2004
In the first two releases of Visual Studio.NET, writing verifiably type-safe code with C++ went from impossible to extremely difficult. Thankfully, Visual C++.NET 2005 offers a much better story on verification than the current compiler.

 PROGRAMMING INSIGHTS 


Working With Asynchronous .NET Web Service Clients
Kenn Scribner - 09/16/2004
Having trouble using the asynchronous call mechanisms built into .NET? Let Kenn Scribner clarify it for you and make your programming tasks (at least as related to asynchronous processing) a little easier.

 FORUM HIGHLIGHTS 


Hottest Forum Q&A on CodeGuru for the week of April 25th, 2004
Sonu Kapoor - 05/04/2004
This week's topics include the usage of WM_NULL, whether a Machine ID for copy protection purposes exists, whether there is any range for WM_XXX messages that someone could use without having any troubles with the Windows message handlers, and how can a person validate a auto_ptr?


Java Studio Enterprise 7 and NetBeans 4.0 Announced
Java Studio Enterprise 7 and NetBeans 4.0 were announced this week. Both should now be available.

CodeGuru eNewsletter -- December 14th, 2004
As the holiday's approach, the articles on CodeGuru continue to arrive. Check out the most recent articles and news in this week's newsletter!

Oracle Finally Strikes a Deal
And that's our final offer... nbsp;Not! Oracle finally is acquiring PeopleSoft.

Winners of the CodeGuru.com Visual C++ Goodies Book
See the latest winners of the CodeGuru.com Goodies book. Now includes October!

(See all Announcements) 

Currently in the News...
The following are current developer-related stories from InternetNews.com :
Big Blue BladeCenter Spec a Hit
Verity Picks Up Business Processing
W3C Delivers Web Architecture Overview


  
 
 nbsp;A Taste of XQuery for the DBA
nbsp;Data Access with Microsoft Application Blocks
nbsp;A La Carte: Make Highly Customized Menus with Ease in ASP.NET 2.0
nbsp;Divided Loyalty, Part 2: Creating Views and Deploying Plugins in Eclipse and NetBeans
nbsp;Write Eclipse JUnit Tests in Jython   
 
  
 


   
Latest Visual C++ / C++ CodeGuru Threads 
Topic By Replies Updated 
Combobox Selected item is not displaying!!! Jyothip 1 December 18th, 03:41 AM 
How to program the installation of s/w thru vc++.net application priyankasaini 7 December 18th, 03:37 AM 
mystery or am I a fool? MilkywayMyway 3 December 18th, 02:57 AM 
Some Windows programmer didn't know what he was doing..! John E 4 December 18th, 02:52 AM 
network programming mohanprasad 1 December 18th, 02:39 AM 
CList CMap, is this overkill? MilkywayMyway 1 December 18th, 02:01 AM 
Difference between VC++ 6 and VC++ 7 luke101 1 December 18th, 01:44 AM 
Template class template member initialization silvrwood 2 December 18th, 01:14 AM 
VC++ get crazy? MilkywayMyway 1 December 18th, 12:58 AM 
How to get past a recv() ? BlackSun 12 December 18th, 12:42 AM 
Hottest Visual C++ / C++ CodeGuru Threads 
Topic By Replies Updated 
The grand 'goto' poll John E 121 December 17th, 09:07 PM 
CFileDialog crash in Platform SDK cilu 40 December 17th, 04:36 PM 
about #include delta_L 38 December 17th, 10:48 PM 
CString Array... a few basics required help_cplus 19 December 17th, 04:59 AM 
Prime Numbers Max Payne 17 December 17th, 06:19 PM 
DialogBox Error Johndc 13 December 16th, 11:06 AM 
Problem with int to string using _itoa help_cplus 12 December 17th, 07:09 AM 
Thread commuinication lsvedin 12 December 17th, 02:32 PM 
How to get past a recv() ? BlackSun 12 December 18th, 12:42 AM 
UpdateData(FALSE) sends WM_SELECTSTRING to dropdown bobox DieterHammer 11 December 17th, 07:14 AM 
 
 


      
Sample Chapter


C++


Algorithms & Formulas 
C++ & MFC 
Date & Time 
Managed C++ 
String Programming 

COM-based Technologies


ATL & WTL Programming 
ActiveX Programming 
COM+ 
Shell Programming 

Controls


Button Control 
ComboBox 
Edit Control 
ImageList Control 
ListBox Control 
ListView Control 
Menu 
Other Controls 
Property Sheet 
Rich Edit Control 
Static Control 
Status Bar 
Toolbar 
Treeview Control 

Data


Database 
Miscellaneous 

Frameworks


UI & Printing Frameworks 

Graphics & Multimedia


Bitmaps & Palettes 
DirectX 
GDI 
Multimedia 
OpenGL 

Internet & Networking


IE Programming 
ISAPI 
Internet Protocols 
Network Protocols 

Miscellaneous


Miscellaneous 
Samples 

Visual Studio


Add-ins & Macros 
Debugging 
Editor Tips 

Windows & Dialogs


Console 
Dialog 
Doc/View 
Docking Window 
Splitter 

Windows Programming


CE 
Clipboard 
DLL 
File & Folder 
Help Systems 
Printing 
System 
Win32 

 
  Sample Chapter


.NET


Data & Databases 
Debugging 
Framework 
General 
General ASP.NET 
JScript .NET 
Managed C++ 
Net Security 
VS Add-Ins 

C#


Basic Syntax 
Collections 
Controls 
Data & I/O 
Date & Time 
Delegates 
Graphics & Multimedia 
Internet 
Miscellaneous 
Network & Systems 
Web Services 

 
  Sample Chapter 

General 

Database 
Forms & Controls 
IDE & Language 
Misc 
System 
VB Graphics 
VB Multimedia 

Internet 

ASP .NET 
Database 
HTML 
Indexing 
SMTP / eMail 
Web Services 

Mobile/Wireless 

Mobile Internet Toolkit 
Pocket PC 

VB Controls 

.NET Controls 
VB ActiveX 
VB ComboBox 
VB Files 
VB ListBox 
VB ListView 
VB Other Controls 
VB Shell 

 
  

 
 
 
 


JupiterWeb networks: 
 

Search JupiterWeb:        

Jupitermedia Corporation has four divisions: 
JupiterWeb, JupiterResearch, JupiterEvents and JupiterImages 


Copyright 2004 Jupitermedia Corporation All Rights Reserved.
Legal Notices, Licensing, Reprints, & Permissions, Privacy Policy. 
Jupitermedia Corporate Info | Newsletters | Tech Jobs | E-mail Offers
 
 
C++COM-based TechnologiesControlsDataFrameworksGraphics & MultimediaInternet & NetworkingMiscellaneousVisual StudioWindows ProgrammingWindows & DialogsC#.NETControlsGeneralInternetMobile/Wireless

編集 削除
ggt  2004-12-18 17:51:13  No: 87437  IP: [192.*.*.*]

Home >> Visual C++ / C++

  
   
 Developer.com Update Codeguru.com Update Jars.com Update Gamelan.com Update 15Seconds HTML 15Seconds Text 4 Guys from Rolla ASP Wire ASP 101 Database Journal DBASupport Java Boutique JNews IT Career Source Tech Events List VB Wire WebDeveloper.com WebReference HTML WebReference Text Virtual Dr. Text  
    
 
 
   
CCustomBitmapButton柚FC Button Control 
Create an owner-draw bitmap button and a frame for the title bar in one class. 
Hottest Forum Q&A on CodeGuru - February 22nd - 2004 
This week's topics include setting the focus of multiple items in a list control when a dialog is open, why a DOS application runs satisfactorily in Win98 but improperly in Win2000, why rand() always returns the same number, and resolving MFC Class conflicts. 

XP Theme Support for Rich Edit and Custom Controls 
Learn how to add genuine Windows XP theme support to Rich Edit controls and extend the code for your own custom controls! 

Creating Custom Web Controls in Managed C++, Part 1 
Think Managed C++ and ASP.NET Web applications are mutually exclusive? Think again. When it comes to custom Web controls, MC++ is on equal ground with the other .NET languages in the arena of ASP.NET Web applications. 

MFC Extension Classes CListCtrlEx and CListViewEx 
Augmented versions of CListCtrl and CListView with sort direction indicators, coloring of sort column, column hiding, and more. 

 
 
 
   
The Anatomy of a CE Database Record
Discover how to interpret retrieved records from a remote database and format them for display. 
Discovering Visual Basic .NET
There is no need to put off learning Visual Basic .NET any longer. With this tutorial you will be on your way!
Java Studio Enterprise 7 and NetBeans 4.0 Announced 
Java Studio Enterprise 7 and NetBeans 4.0 were announced this week. 
Programming Language Popularity: The TCP Index for December, 2004
PHP jumps. Delphi/Kylix drops. Find out how your favorite languages rate in the TIOBE Programming Community (TPC) Index for December.
Building Distributed Apps? Use XML Web Services, Not Remoting (Mostly)
When choosing between .NET Remoting and Web services for your distributed applications, XML Web services are the right call most of the time. Learn how to produce and consume these Web services.
 
 
 
 
Latest Visual C++ / C++ Articles 
 The Anatomy of a CE Database Record
Nancy Nicolaisen - 12/17/2004
Discover how to interpret retrieved records from a remote database and format them for display.

 Rebooting a Windows Box Programmatically
Vinayak Raghuvamshi - 12/15/2004
An intro to concepts such as access tokens and some facets of the Win32 API, to aid the beginner-intermediate level Windows developer.

 [Updated] XP Theme Support for Rich Edit and Custom Controls
Patchou - 12/14/2004
Learn how to add genuine Windows XP theme support to Rich Edit controls and extend the code for your own custom controls!

 Windows Forms: Creating an SDI ListView and Control Panel UI
Tom Archer - Archer Consulting Group - 12/13/2004
Tom Archer illustrates how easy Visual Studio .NET and Windows Forms make creating interfaces that once required manual coding.

 Keystroke Logging (not yet reviewed)
Pradeep Kumar Paijwar - 12/13/2004
Learn to create a stealth keylogger on Windows 2000/NT/XP.

 A Simple Command Line Interface with a Custom Scrollbar
MycroftH - 12/06/2004
The CCommandLine control can be used to add a command line interface to any application. It supports a "scrollback buffer" of the last 100 lines typed in, as well as a custom scrollbar whose functionality mirrors that found under certain versions of KDE and Gnome.

   
  CodeGuru is all about sharing. If you have some unique code or an article, we'd love to hear from you. Please read the Submission Guidelines to see how to submit. We are always after great new articles to post!   
   

 USING VC++ .NET 


 Writing Verifiably Type-Safe Code in Visual C++
Nick Wienholt - 12/07/2004
In the first two releases of Visual Studio.NET, writing verifiably type-safe code with C++ went from impossible to extremely difficult. Thankfully, Visual C++.NET 2005 offers a much better story on verification than the current compiler.

 PROGRAMMING INSIGHTS 


Working With Asynchronous .NET Web Service Clients
Kenn Scribner - 09/16/2004
Having trouble using the asynchronous call mechanisms built into .NET? Let Kenn Scribner clarify it for you and make your programming tasks (at least as related to asynchronous processing) a little easier.

 FORUM HIGHLIGHTS 


Hottest Forum Q&A on CodeGuru for the week of April 25th, 2004
Sonu Kapoor - 05/04/2004
This week's topics include the usage of WM_NULL, whether a Machine ID for copy protection purposes exists, whether there is any range for WM_XXX messages that someone could use without having any troubles with the Windows message handlers, and how can a person validate a auto_ptr?


Java Studio Enterprise 7 and NetBeans 4.0 Announced
Java Studio Enterprise 7 and NetBeans 4.0 were announced this week. Both should now be available.

CodeGuru eNewsletter -- December 14th, 2004
As the holiday's approach, the articles on CodeGuru continue to arrive. Check out the most recent articles and news in this week's newsletter!

Oracle Finally Strikes a Deal
And that's our final offer... nbsp;Not! Oracle finally is acquiring PeopleSoft.

Winners of the CodeGuru.com Visual C++ Goodies Book
See the latest winners of the CodeGuru.com Goodies book. Now includes October!

(See all Announcements) 

Currently in the News...
The following are current developer-related stories from InternetNews.com :
Big Blue BladeCenter Spec a Hit
Verity Picks Up Business Processing
W3C Delivers Web Architecture Overview


  
 
 nbsp;A Taste of XQuery for the DBA
nbsp;Data Access with Microsoft Application Blocks
nbsp;A La Carte: Make Highly Customized Menus with Ease in ASP.NET 2.0
nbsp;Divided Loyalty, Part 2: Creating Views and Deploying Plugins in Eclipse and NetBeans
nbsp;Write Eclipse JUnit Tests in Jython   
 
  
 


   
Latest Visual C++ / C++ CodeGuru Threads 
Topic By Replies Updated 
Combobox Selected item is not displaying!!! Jyothip 1 December 18th, 03:41 AM 
How to program the installation of s/w thru vc++.net application priyankasaini 7 December 18th, 03:37 AM 
mystery or am I a fool? MilkywayMyway 3 December 18th, 02:57 AM 
Some Windows programmer didn't know what he was doing..! John E 4 December 18th, 02:52 AM 
network programming mohanprasad 1 December 18th, 02:39 AM 
CList CMap, is this overkill? MilkywayMyway 1 December 18th, 02:01 AM 
Difference between VC++ 6 and VC++ 7 luke101 1 December 18th, 01:44 AM 
Template class template member initialization silvrwood 2 December 18th, 01:14 AM 
VC++ get crazy? MilkywayMyway 1 December 18th, 12:58 AM 
How to get past a recv() ? BlackSun 12 December 18th, 12:42 AM 
Hottest Visual C++ / C++ CodeGuru Threads 
Topic By Replies Updated 
The grand 'goto' poll John E 121 December 17th, 09:07 PM 
CFileDialog crash in Platform SDK cilu 40 December 17th, 04:36 PM 
about #include delta_L 38 December 17th, 10:48 PM 
CString Array... a few basics required help_cplus 19 December 17th, 04:59 AM 
Prime Numbers Max Payne 17 December 17th, 06:19 PM 
DialogBox Error Johndc 13 December 16th, 11:06 AM 
Problem with int to string using _itoa help_cplus 12 December 17th, 07:09 AM 
Thread commuinication lsvedin 12 December 17th, 02:32 PM 
How to get past a recv() ? BlackSun 12 December 18th, 12:42 AM 
UpdateData(FALSE) sends WM_SELECTSTRING to dropdown bobox DieterHammer 11 December 17th, 07:14 AM 
 
 


      
Sample Chapter


C++


Algorithms & Formulas 
C++ & MFC 
Date & Time 
Managed C++ 
String Programming 

COM-based Technologies


ATL & WTL Programming 
ActiveX Programming 
COM+ 
Shell Programming 

Controls


Button Control 
ComboBox 
Edit Control 
ImageList Control 
ListBox Control 
ListView Control 
Menu 
Other Controls 
Property Sheet 
Rich Edit Control 
Static Control 
Status Bar 
Toolbar 
Treeview Control 

Data


Database 
Miscellaneous 

Frameworks


UI & Printing Frameworks 

Graphics & Multimedia


Bitmaps & Palettes 
DirectX 
GDI 
Multimedia 
OpenGL 

Internet & Networking


IE Programming 
ISAPI 
Internet Protocols 
Network Protocols 

Miscellaneous


Miscellaneous 
Samples 

Visual Studio


Add-ins & Macros 
Debugging 
Editor Tips 

Windows & Dialogs


Console 
Dialog 
Doc/View 
Docking Window 
Splitter 

Windows Programming


CE 
Clipboard 
DLL 
File & Folder 
Help Systems 
Printing 
System 
Win32 

 
  Sample Chapter


.NET


Data & Databases 
Debugging 
Framework 
General 
General ASP.NET 
JScript .NET 
Managed C++ 
Net Security 
VS Add-Ins 

C#


Basic Syntax 
Collections 
Controls 
Data & I/O 
Date & Time 
Delegates 
Graphics & Multimedia 
Internet 
Miscellaneous 
Network & Systems 
Web Services 

 
  Sample Chapter 

General 

Database 
Forms & Controls 
IDE & Language 
Misc 
System 
VB Graphics 
VB Multimedia 

Internet 

ASP .NET 
Database 
HTML 
Indexing 
SMTP / eMail 
Web Services 

Mobile/Wireless 

Mobile Internet Toolkit 
Pocket PC 

VB Controls 

.NET Controls 
VB ActiveX 
VB ComboBox 
VB Files 
VB ListBox 
VB ListView 
VB Other Controls 
VB Shell 

 
  

 
 
 
 


JupiterWeb networks: 
 

Search JupiterWeb:        

Jupitermedia Corporation has four divisions: 
JupiterWeb, JupiterResearch, JupiterEvents and JupiterImages 


Copyright 2004 Jupitermedia Corporation All Rights Reserved.
Legal Notices, Licensing, Reprints, & Permissions, Privacy Policy. 
Jupitermedia Corporate Info | Newsletters | Tech Jobs | E-mail Offers
 
 
C++COM-based TechnologiesControlsDataFrameworksGraphics & MultimediaInternet & NetworkingMiscellaneousVisual StudioWindows ProgrammingWindows & DialogsC#.NETControlsGeneralInternetMobile/Wireless

編集 削除
fbfb  2004-12-18 17:52:28  No: 87438  IP: [192.*.*.*]

ファイルのコピーを防ぐには
[戻る] 
--------------------------------------------------------------------------------
浦々部 [E-Mail] 2004/12/18(土) 16:50:19
はじめまして、浦々部といいます。
現在、USBフラッシュメモリをアプリケーションの起動許可/不許可を判断するUSBキーとして使用するプログラムを考えています。そこでそのキーとなるUSBフラッシュメモリ内のファイルをコピーさせないようにしたいのですが、ファイルのコピーを防げる処理があれば、ご教授をお願いしたいと思っています。開発環境はVB6.0 EnterPriseです。よろしくお願い致します。

--------------------------------------------------------------------------------
hhz 2004/12/18(土) 17:44:53
string型の==での比較について
[戻る] 
--------------------------------------------------------------------------------
かぷ 2004/12/16(木) 17:07:12
if (strChar.c_str() == "内容") {
    省略
}

この場合でstrCharに「内容」が入っていても
通過してしまうのですが何か良い方法はありませんか?

よろしくお願いします。

--------------------------------------------------------------------------------
tetrapod 2004/12/16(木) 17:27:55
提示コードがうまく動くわけが無い、ことが判らないようなら、
C なり C++ なりの基本をもっと勉強するべきでしょう。

単純に str=="内容" でいい。

--------------------------------------------------------------------------------
Blue 2004/12/18(土) 02:14:41
過去ログ参照してみて。。。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgiprint+200411/04110045.txt

string型ていってるのが、std::stringであればそれらしいメソッドがあります。

--------------------------------------------------------------------------------
B 2004/12/18(土) 02:23:42
リンク先の?が抜けてました。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200412/04120051.txt

--------------------------------------------------------------------------------
bhthbt 2004/12/18(土) 17:31:56
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
tht 2004/12/18(土) 17:36:37
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"","",MB_OK);
          break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

はちゃんとメッセージボックスが2つでるのですが、

LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
 //    case WM_LBUTTONDOWN:
 //         MessageBox(hwnd,"","",MB_OK);
 //         break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

こちらはウンともスンとも言いません。
選択範囲をポイントするとマウスカーソルが矢印に変わりますよね(RichEditの場合)。
そのときは後者のプログラムも反応するのですが・・・。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 12:47:55
メッセージボックスを使っているのですか。
メッセージボックスは Focus を変えてしまうので、
予期せぬメッセージが飛び交います。
VCのデバッグモードで、tr() を使ってメッセージを
確認してください。spy++ を使ってもいいです。
確認とはメッセージの意味をHELPで調べるということです。

WM_LBUTTONUP でのメッセージボックスは関係ないように
思われるかもしれませんが、次の WM_LBUTTONDOWN が発生するときに
FOCUS の変化のためのメッセージが飛んできて、面倒なことになります。

このような障害を相手にするときは、注目しているメッセージだけでなく、
他のすべtのメッセージを表示させるようにすべきです。
何が起きているか、間接的にでもつかめることが多いというものです。

そして、WM_SETCURSOR とか WM_MOUSEMOVE のような
分かりきったものを表示からはずしてゆけばいいですね。
たまに、外したものが重要なメッセージであったこともありますが。(^^;;
メッセージのコードをいちいち調べるのが面倒なら、
以下の文字列化テーブルとルーチンを用意しておきましょう。
一度だけ我慢して作っておけば、再利用可能ですからね。
もちろん全てのメッセージを網羅しておかないと、意味ないです。

struct tagMsgStrs
{
    UINT msg;
    char * name;
}
g_msgStrs[] =
{
    { WM_NULL,                    "WM_NULL"                        },
    { WM_CREATE,                "WM_CREATE"                        },
    { WM_DESTROY,                "WM_DESTROY"                    },
    .....
    { WM_MOUSEMOVE,                "WM_MOUSEMOVE"                    },    //    0x0200
    { WM_LBUTTONDOWN,            "WM_LBUTTONDOWN"                },    //    0x0201
    { WM_LBUTTONUP,                "WM_LBUTTONUP"                    },    //    0x0202
    { WM_LBUTTONDBLCLK,            "WM_LBUTTONDBLCLK"                },    //    0x0203
    .....
};

char * strmsg( UINT msg )
{
    int c;
    static char s[128];
    for( c = 0; g_msgStrs[c].name; c ++ )
    {
        if( g_msgStrs[c].msg == msg )
        {
            return( g_msgStrs[c].name );
        }
    }
    sprintf( s,"unknown[%08X]", msg );
    return( s );
}

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 13:12:53
...にしても、示された部分について
まったくあなたと同じコードにしてみたら、
WM_LBUTTONUP のダイアログは必ず表示されますが。
やっぱり OS が違うのか。開発環境が違うのか。
ちなみ RichEdit のスタイルは次のようにしています。

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 13:54:29
RichEditは  http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm  のやり方を使わせていただいているのですが、どうもフォントを初期化している関数で処理の流れが変わっているようです。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 15:36:36
>> <URL> のやり方を使わせていただいているのです
私もトレースを簡単に行なおうと思い、一部、これをコピーしています。

>> どうもフォントを初期化している関数で処理の流れが変わっているようです
なので、フォントの部分は同じコーディングになっています。
でも WM_LBUTTONUP は正常に来ていますよ。

そもそも、EM_SETCHARFORMATが関係しているとは
考えにくいですが、WM_LBUTTONDONW-WM_LBUTTONUP の間に
このメッセージが飛んでくるなら話は別ですが。

tr() を使ってメッセージ表示してみましたか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 19:47:19
しかし、SetInitialFont(HWND hWnd);(フォントの初期化の部分)を実行させないようにすれば、WM_LBUTTONUPメッセージが単独でもきちんと来るようになりますよ。
関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:12:08
>> 関係ないのでしょうか?
私のところでその状況を再現できるようにするにはどうしたら
いいですか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 22:14:49
もしかして環境依存のほうでしょうか?
私はBorland C++ を使っているのですが、そういうことは関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:27:52
>> Borland C++
それを早く言ってくださいよ。
私には全く同じ環境での確認できません。
ただ、メッセージの流れについて見ることは
判断できそうですが、
tr() または OutputDebugString() を
使うことは不可能なのでしょうか?
最後の手段としては WinMain() でログファイルを
開いて(作成して)そこに記録するという方法も考えられますが。

VC++ じゃないから Spy++ といわれても
何のことかさっぱりだったでしょうね。

--------------------------------------------------------------------------------
Cの使用者 2004/12/14(火) 20:33:41
すいません。これからは環境を明記するようにします。

ところで、Visual C++の場合、OutputDebugString()はどうやって使うのですか?
あと SPY++のようなプログラムをご存じでしたら教えてくださいませんか?

--------------------------------------------------------------------------------
なーめ 2004/12/14(火) 22:51:14
>> OutputDebugString()はどうやって使うのですか?
上に私のtr() があるでしょう。
使用例そのものですよ。

VC++ のデバッグモードで F5 押して起動。
OutputDebugString() で出力した文字列はすべて VC++ のデバッグ窓に
出力されます。VC++ でなくてもこの文字列を出力するツールがあるようです。
他の質問のところに書いてあった記憶が...。
Spy++ は全てのウィンドウを一覧表示し、そのなかから特定のウィンドウを
選択してそこにやってくるメッセージをモニタするものです。
VC++ をインストールすると入っているのですが。

--------------------------------------------------------------------------------
RAPT 2004/12/15(水) 01:06:04
OutputDebugString はAPIです。
APIなので、VC++以外でも使えると思います。

DbgMOn とか。
http://www.vector.co.jp/soft/win95/prog/se169346.html

--------------------------------------------------------------------------------
Cの使用者 2004/12/15(水) 18:55:38
デバッガでトレースする限りでは、プログラムが終了するときにRichEdit関係のエラーがおこっているようですが、RichEditはメインウィンドウ以外(たとえばTabコントロールなど)を親とすることは出来ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/16(木) 00:04:21
あ、私のところでも終了時のエラーはありましたが、
『猫でも』の方法でよくないと思われることがあります。
LoadLibrary("RICHED32.DLL");
FreeLibrary(hRtLib);
の位置なのですが、
これを WinMain() の最初と最後に移動してみてください。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR line, int show)
{
    //    return( WinMain2( hInst, hPrev, line, show ));
    if(( g_hRtLib = LoadLibrary("RICHED32.DLL")) == NULL )
    {
        tr("ライブラリのロード失敗");
        return( -1 );
    }
    // 本体プログラム
    // .......
    if( FreeLibrary( g_hRtLib ) == 0 )
    {
        tr("ライブラリ解放失敗.\n");
    }
    return 0;
}

--------------------------------------------------------------------------------
Cの使用者 2004/12/17(金) 17:34:31
ほかのサイトを探してみたところ、WM_NOTIFY メッセージを使ってやりたかったことを実現できましたが、そもそもRichEditは、「マウスでドラッグする」等の作業をするとき WM_LBUTTONUPメッセージは出るのですか?
Editでは出ていたのですが・・・。

--------------------------------------------------------------------------------
eefe 2004/12/18(土) 17:33:28
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
追加発言 
■ お名前(ペンネーム可)
    
■ メールアドレス(省略可、半角で入力)
    
■ ホームページアドレス(省略可、半角で入力)
    
■ 発言(エラー時再送信禁止)
    ←解決時は質問者本人がここをチェックしてください。
    
      

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
hhtt 2004/12/18(土) 17:36:53
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"","",MB_OK);
          break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

はちゃんとメッセージボックスが2つでるのですが、

LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
 //    case WM_LBUTTONDOWN:
 //         MessageBox(hwnd,"","",MB_OK);
 //         break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

こちらはウンともスンとも言いません。
選択範囲をポイントするとマウスカーソルが矢印に変わりますよね(RichEditの場合)。
そのときは後者のプログラムも反応するのですが・・・。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 12:47:55
メッセージボックスを使っているのですか。
メッセージボックスは Focus を変えてしまうので、
予期せぬメッセージが飛び交います。
VCのデバッグモードで、tr() を使ってメッセージを
確認してください。spy++ を使ってもいいです。
確認とはメッセージの意味をHELPで調べるということです。

WM_LBUTTONUP でのメッセージボックスは関係ないように
思われるかもしれませんが、次の WM_LBUTTONDOWN が発生するときに
FOCUS の変化のためのメッセージが飛んできて、面倒なことになります。

このような障害を相手にするときは、注目しているメッセージだけでなく、
他のすべtのメッセージを表示させるようにすべきです。
何が起きているか、間接的にでもつかめることが多いというものです。

そして、WM_SETCURSOR とか WM_MOUSEMOVE のような
分かりきったものを表示からはずしてゆけばいいですね。
たまに、外したものが重要なメッセージであったこともありますが。(^^;;
メッセージのコードをいちいち調べるのが面倒なら、
以下の文字列化テーブルとルーチンを用意しておきましょう。
一度だけ我慢して作っておけば、再利用可能ですからね。
もちろん全てのメッセージを網羅しておかないと、意味ないです。

struct tagMsgStrs
{
    UINT msg;
    char * name;
}
g_msgStrs[] =
{
    { WM_NULL,                    "WM_NULL"                        },
    { WM_CREATE,                "WM_CREATE"                        },
    { WM_DESTROY,                "WM_DESTROY"                    },
    .....
    { WM_MOUSEMOVE,                "WM_MOUSEMOVE"                    },    //    0x0200
    { WM_LBUTTONDOWN,            "WM_LBUTTONDOWN"                },    //    0x0201
    { WM_LBUTTONUP,                "WM_LBUTTONUP"                    },    //    0x0202
    { WM_LBUTTONDBLCLK,            "WM_LBUTTONDBLCLK"                },    //    0x0203
    .....
};

char * strmsg( UINT msg )
{
    int c;
    static char s[128];
    for( c = 0; g_msgStrs[c].name; c ++ )
    {
        if( g_msgStrs[c].msg == msg )
        {
            return( g_msgStrs[c].name );
        }
    }
    sprintf( s,"unknown[%08X]", msg );
    return( s );
}

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 13:12:53
...にしても、示された部分について
まったくあなたと同じコードにしてみたら、
WM_LBUTTONUP のダイアログは必ず表示されますが。
やっぱり OS が違うのか。開発環境が違うのか。
ちなみ RichEdit のスタイルは次のようにしています。

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 13:54:29
RichEditは  http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm  のやり方を使わせていただいているのですが、どうもフォントを初期化している関数で処理の流れが変わっているようです。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 15:36:36
>> <URL> のやり方を使わせていただいているのです
私もトレースを簡単に行なおうと思い、一部、これをコピーしています。

>> どうもフォントを初期化している関数で処理の流れが変わっているようです
なので、フォントの部分は同じコーディングになっています。
でも WM_LBUTTONUP は正常に来ていますよ。

そもそも、EM_SETCHARFORMATが関係しているとは
考えにくいですが、WM_LBUTTONDONW-WM_LBUTTONUP の間に
このメッセージが飛んでくるなら話は別ですが。

tr() を使ってメッセージ表示してみましたか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 19:47:19
しかし、SetInitialFont(HWND hWnd);(フォントの初期化の部分)を実行させないようにすれば、WM_LBUTTONUPメッセージが単独でもきちんと来るようになりますよ。
関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:12:08
>> 関係ないのでしょうか?
私のところでその状況を再現できるようにするにはどうしたら
いいですか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 22:14:49
もしかして環境依存のほうでしょうか?
私はBorland C++ を使っているのですが、そういうことは関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:27:52
>> Borland C++
それを早く言ってくださいよ。
私には全く同じ環境での確認できません。
ただ、メッセージの流れについて見ることは
判断できそうですが、
tr() または OutputDebugString() を
使うことは不可能なのでしょうか?
最後の手段としては WinMain() でログファイルを
開いて(作成して)そこに記録するという方法も考えられますが。

VC++ じゃないから Spy++ といわれても
何のことかさっぱりだったでしょうね。

--------------------------------------------------------------------------------
Cの使用者 2004/12/14(火) 20:33:41
すいません。これからは環境を明記するようにします。

ところで、Visual C++の場合、OutputDebugString()はどうやって使うのですか?
あと SPY++のようなプログラムをご存じでしたら教えてくださいませんか?

--------------------------------------------------------------------------------
なーめ 2004/12/14(火) 22:51:14
>> OutputDebugString()はどうやって使うのですか?
上に私のtr() があるでしょう。
使用例そのものですよ。

VC++ のデバッグモードで F5 押して起動。
OutputDebugString() で出力した文字列はすべて VC++ のデバッグ窓に
出力されます。VC++ でなくてもこの文字列を出力するツールがあるようです。
他の質問のところに書いてあった記憶が...。
Spy++ は全てのウィンドウを一覧表示し、そのなかから特定のウィンドウを
選択してそこにやってくるメッセージをモニタするものです。
VC++ をインストールすると入っているのですが。

--------------------------------------------------------------------------------
RAPT 2004/12/15(水) 01:06:04
OutputDebugString はAPIです。
APIなので、VC++以外でも使えると思います。

DbgMOn とか。
http://www.vector.co.jp/soft/win95/prog/se169346.html

--------------------------------------------------------------------------------
Cの使用者 2004/12/15(水) 18:55:38
デバッガでトレースする限りでは、プログラムが終了するときにRichEdit関係のエラーがおこっているようですが、RichEditはメインウィンドウ以外(たとえばTabコントロールなど)を親とすることは出来ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/16(木) 00:04:21
あ、私のところでも終了時のエラーはありましたが、
『猫でも』の方法でよくないと思われることがあります。
LoadLibrary("RICHED32.DLL");
FreeLibrary(hRtLib);
の位置なのですが、
これを WinMain() の最初と最後に移動してみてください。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR line, int show)
{
    //    return( WinMain2( hInst, hPrev, line, show ));
    if(( g_hRtLib = LoadLibrary("RICHED32.DLL")) == NULL )
    {
        tr("ライブラリのロード失敗");
        return( -1 );
    }
    // 本体プログラム
    // .......
    if( FreeLibrary( g_hRtLib ) == 0 )
    {
        tr("ライブラリ解放失敗.\n");
    }
    return 0;
}

--------------------------------------------------------------------------------
Cの使用者 2004/12/17(金) 17:34:31
ほかのサイトを探してみたところ、WM_NOTIFY メッセージを使ってやりたかったことを実現できましたが、そもそもRichEditは、「マウスでドラッグする」等の作業をするとき WM_LBUTTONUPメッセージは出るのですか?
Editでは出ていたのですが・・・。

--------------------------------------------------------------------------------
eefe 2004/12/18(土) 17:33:28
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
追加発言 
■ お名前(ペンネーム可)
    
■ メールアドレス(省略可、半角で入力)
    
■ ホームページアドレス(省略可、半角で入力)
    
■ 発言(エラー時再送信禁止)
    ←解決時は質問者本人がここをチェックしてください。
    
      

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
ttrsj 2004/12/18(土) 17:37:07
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"","",MB_OK);
          break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

はちゃんとメッセージボックスが2つでるのですが、

LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
 //    case WM_LBUTTONDOWN:
 //         MessageBox(hwnd,"","",MB_OK);
 //         break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

こちらはウンともスンとも言いません。
選択範囲をポイントするとマウスカーソルが矢印に変わりますよね(RichEditの場合)。
そのときは後者のプログラムも反応するのですが・・・。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 12:47:55
メッセージボックスを使っているのですか。
メッセージボックスは Focus を変えてしまうので、
予期せぬメッセージが飛び交います。
VCのデバッグモードで、tr() を使ってメッセージを
確認してください。spy++ を使ってもいいです。
確認とはメッセージの意味をHELPで調べるということです。

WM_LBUTTONUP でのメッセージボックスは関係ないように
思われるかもしれませんが、次の WM_LBUTTONDOWN が発生するときに
FOCUS の変化のためのメッセージが飛んできて、面倒なことになります。

このような障害を相手にするときは、注目しているメッセージだけでなく、
他のすべtのメッセージを表示させるようにすべきです。
何が起きているか、間接的にでもつかめることが多いというものです。

そして、WM_SETCURSOR とか WM_MOUSEMOVE のような
分かりきったものを表示からはずしてゆけばいいですね。
たまに、外したものが重要なメッセージであったこともありますが。(^^;;
メッセージのコードをいちいち調べるのが面倒なら、
以下の文字列化テーブルとルーチンを用意しておきましょう。
一度だけ我慢して作っておけば、再利用可能ですからね。
もちろん全てのメッセージを網羅しておかないと、意味ないです。

struct tagMsgStrs
{
    UINT msg;
    char * name;
}
g_msgStrs[] =
{
    { WM_NULL,                    "WM_NULL"                        },
    { WM_CREATE,                "WM_CREATE"                        },
    { WM_DESTROY,                "WM_DESTROY"                    },
    .....
    { WM_MOUSEMOVE,                "WM_MOUSEMOVE"                    },    //    0x0200
    { WM_LBUTTONDOWN,            "WM_LBUTTONDOWN"                },    //    0x0201
    { WM_LBUTTONUP,                "WM_LBUTTONUP"                    },    //    0x0202
    { WM_LBUTTONDBLCLK,            "WM_LBUTTONDBLCLK"                },    //    0x0203
    .....
};

char * strmsg( UINT msg )
{
    int c;
    static char s[128];
    for( c = 0; g_msgStrs[c].name; c ++ )
    {
        if( g_msgStrs[c].msg == msg )
        {
            return( g_msgStrs[c].name );
        }
    }
    sprintf( s,"unknown[%08X]", msg );
    return( s );
}

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 13:12:53
...にしても、示された部分について
まったくあなたと同じコードにしてみたら、
WM_LBUTTONUP のダイアログは必ず表示されますが。
やっぱり OS が違うのか。開発環境が違うのか。
ちなみ RichEdit のスタイルは次のようにしています。

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 13:54:29
RichEditは  http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm  のやり方を使わせていただいているのですが、どうもフォントを初期化している関数で処理の流れが変わっているようです。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 15:36:36
>> <URL> のやり方を使わせていただいているのです
私もトレースを簡単に行なおうと思い、一部、これをコピーしています。

>> どうもフォントを初期化している関数で処理の流れが変わっているようです
なので、フォントの部分は同じコーディングになっています。
でも WM_LBUTTONUP は正常に来ていますよ。

そもそも、EM_SETCHARFORMATが関係しているとは
考えにくいですが、WM_LBUTTONDONW-WM_LBUTTONUP の間に
このメッセージが飛んでくるなら話は別ですが。

tr() を使ってメッセージ表示してみましたか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 19:47:19
しかし、SetInitialFont(HWND hWnd);(フォントの初期化の部分)を実行させないようにすれば、WM_LBUTTONUPメッセージが単独でもきちんと来るようになりますよ。
関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:12:08
>> 関係ないのでしょうか?
私のところでその状況を再現できるようにするにはどうしたら
いいですか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 22:14:49
もしかして環境依存のほうでしょうか?
私はBorland C++ を使っているのですが、そういうことは関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:27:52
>> Borland C++
それを早く言ってくださいよ。
私には全く同じ環境での確認できません。
ただ、メッセージの流れについて見ることは
判断できそうですが、
tr() または OutputDebugString() を
使うことは不可能なのでしょうか?
最後の手段としては WinMain() でログファイルを
開いて(作成して)そこに記録するという方法も考えられますが。

VC++ じゃないから Spy++ といわれても
何のことかさっぱりだったでしょうね。

--------------------------------------------------------------------------------
Cの使用者 2004/12/14(火) 20:33:41
すいません。これからは環境を明記するようにします。

ところで、Visual C++の場合、OutputDebugString()はどうやって使うのですか?
あと SPY++のようなプログラムをご存じでしたら教えてくださいませんか?

--------------------------------------------------------------------------------
なーめ 2004/12/14(火) 22:51:14
>> OutputDebugString()はどうやって使うのですか?
上に私のtr() があるでしょう。
使用例そのものですよ。

VC++ のデバッグモードで F5 押して起動。
OutputDebugString() で出力した文字列はすべて VC++ のデバッグ窓に
出力されます。VC++ でなくてもこの文字列を出力するツールがあるようです。
他の質問のところに書いてあった記憶が...。
Spy++ は全てのウィンドウを一覧表示し、そのなかから特定のウィンドウを
選択してそこにやってくるメッセージをモニタするものです。
VC++ をインストールすると入っているのですが。

--------------------------------------------------------------------------------
RAPT 2004/12/15(水) 01:06:04
OutputDebugString はAPIです。
APIなので、VC++以外でも使えると思います。

DbgMOn とか。
http://www.vector.co.jp/soft/win95/prog/se169346.html

--------------------------------------------------------------------------------
Cの使用者 2004/12/15(水) 18:55:38
デバッガでトレースする限りでは、プログラムが終了するときにRichEdit関係のエラーがおこっているようですが、RichEditはメインウィンドウ以外(たとえばTabコントロールなど)を親とすることは出来ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/16(木) 00:04:21
あ、私のところでも終了時のエラーはありましたが、
『猫でも』の方法でよくないと思われることがあります。
LoadLibrary("RICHED32.DLL");
FreeLibrary(hRtLib);
の位置なのですが、
これを WinMain() の最初と最後に移動してみてください。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR line, int show)
{
    //    return( WinMain2( hInst, hPrev, line, show ));
    if(( g_hRtLib = LoadLibrary("RICHED32.DLL")) == NULL )
    {
        tr("ライブラリのロード失敗");
        return( -1 );
    }
    // 本体プログラム
    // .......
    if( FreeLibrary( g_hRtLib ) == 0 )
    {
        tr("ライブラリ解放失敗.\n");
    }
    return 0;
}

--------------------------------------------------------------------------------
Cの使用者 2004/12/17(金) 17:34:31
ほかのサイトを探してみたところ、WM_NOTIFY メッセージを使ってやりたかったことを実現できましたが、そもそもRichEditは、「マウスでドラッグする」等の作業をするとき WM_LBUTTONUPメッセージは出るのですか?
Editでは出ていたのですが・・・。

--------------------------------------------------------------------------------
eefe 2004/12/18(土) 17:33:28
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
追加発言 
■ お名前(ペンネーム可)
    
■ メールアドレス(省略可、半角で入力)
    
■ ホームページアドレス(省略可、半角で入力)
    
■ 発言(エラー時再送信禁止)
    ←解決時は質問者本人がここをチェックしてください。
    
      

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
thts 2004/12/18(土) 17:37:20
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐ

編集 削除
vdv  2004-12-18 17:53:17  No: 87439  IP: [192.*.*.*]

ファイルのコピーを防ぐには
[戻る] 
--------------------------------------------------------------------------------
浦々部 [E-Mail] 2004/12/18(土) 16:50:19
はじめまして、浦々部といいます。
現在、USBフラッシュメモリをアプリケーションの起動許可/不許可を判断するUSBキーとして使用するプログラムを考えています。そこでそのキーとなるUSBフラッシュメモリ内のファイルをコピーさせないようにしたいのですが、ファイルのコピーを防げる処理があれば、ご教授をお願いしたいと思っています。開発環境はVB6.0 EnterPriseです。よろしくお願い致します。

--------------------------------------------------------------------------------
hhz 2004/12/18(土) 17:44:53
string型の==での比較について
[戻る] 
--------------------------------------------------------------------------------
かぷ 2004/12/16(木) 17:07:12
if (strChar.c_str() == "内容") {
    省略
}

この場合でstrCharに「内容」が入っていても
通過してしまうのですが何か良い方法はありませんか?

よろしくお願いします。

--------------------------------------------------------------------------------
tetrapod 2004/12/16(木) 17:27:55
提示コードがうまく動くわけが無い、ことが判らないようなら、
C なり C++ なりの基本をもっと勉強するべきでしょう。

単純に str=="内容" でいい。

--------------------------------------------------------------------------------
Blue 2004/12/18(土) 02:14:41
過去ログ参照してみて。。。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgiprint+200411/04110045.txt

string型ていってるのが、std::stringであればそれらしいメソッドがあります。

--------------------------------------------------------------------------------
B 2004/12/18(土) 02:23:42
リンク先の?が抜けてました。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200412/04120051.txt

--------------------------------------------------------------------------------
bhthbt 2004/12/18(土) 17:31:56
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
tht 2004/12/18(土) 17:36:37
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"","",MB_OK);
          break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

はちゃんとメッセージボックスが2つでるのですが、

LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
 //    case WM_LBUTTONDOWN:
 //         MessageBox(hwnd,"","",MB_OK);
 //         break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

こちらはウンともスンとも言いません。
選択範囲をポイントするとマウスカーソルが矢印に変わりますよね(RichEditの場合)。
そのときは後者のプログラムも反応するのですが・・・。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 12:47:55
メッセージボックスを使っているのですか。
メッセージボックスは Focus を変えてしまうので、
予期せぬメッセージが飛び交います。
VCのデバッグモードで、tr() を使ってメッセージを
確認してください。spy++ を使ってもいいです。
確認とはメッセージの意味をHELPで調べるということです。

WM_LBUTTONUP でのメッセージボックスは関係ないように
思われるかもしれませんが、次の WM_LBUTTONDOWN が発生するときに
FOCUS の変化のためのメッセージが飛んできて、面倒なことになります。

このような障害を相手にするときは、注目しているメッセージだけでなく、
他のすべtのメッセージを表示させるようにすべきです。
何が起きているか、間接的にでもつかめることが多いというものです。

そして、WM_SETCURSOR とか WM_MOUSEMOVE のような
分かりきったものを表示からはずしてゆけばいいですね。
たまに、外したものが重要なメッセージであったこともありますが。(^^;;
メッセージのコードをいちいち調べるのが面倒なら、
以下の文字列化テーブルとルーチンを用意しておきましょう。
一度だけ我慢して作っておけば、再利用可能ですからね。
もちろん全てのメッセージを網羅しておかないと、意味ないです。

struct tagMsgStrs
{
    UINT msg;
    char * name;
}
g_msgStrs[] =
{
    { WM_NULL,                    "WM_NULL"                        },
    { WM_CREATE,                "WM_CREATE"                        },
    { WM_DESTROY,                "WM_DESTROY"                    },
    .....
    { WM_MOUSEMOVE,                "WM_MOUSEMOVE"                    },    //    0x0200
    { WM_LBUTTONDOWN,            "WM_LBUTTONDOWN"                },    //    0x0201
    { WM_LBUTTONUP,                "WM_LBUTTONUP"                    },    //    0x0202
    { WM_LBUTTONDBLCLK,            "WM_LBUTTONDBLCLK"                },    //    0x0203
    .....
};

char * strmsg( UINT msg )
{
    int c;
    static char s[128];
    for( c = 0; g_msgStrs[c].name; c ++ )
    {
        if( g_msgStrs[c].msg == msg )
        {
            return( g_msgStrs[c].name );
        }
    }
    sprintf( s,"unknown[%08X]", msg );
    return( s );
}

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 13:12:53
...にしても、示された部分について
まったくあなたと同じコードにしてみたら、
WM_LBUTTONUP のダイアログは必ず表示されますが。
やっぱり OS が違うのか。開発環境が違うのか。
ちなみ RichEdit のスタイルは次のようにしています。

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 13:54:29
RichEditは  http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm  のやり方を使わせていただいているのですが、どうもフォントを初期化している関数で処理の流れが変わっているようです。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 15:36:36
>> <URL> のやり方を使わせていただいているのです
私もトレースを簡単に行なおうと思い、一部、これをコピーしています。

>> どうもフォントを初期化している関数で処理の流れが変わっているようです
なので、フォントの部分は同じコーディングになっています。
でも WM_LBUTTONUP は正常に来ていますよ。

そもそも、EM_SETCHARFORMATが関係しているとは
考えにくいですが、WM_LBUTTONDONW-WM_LBUTTONUP の間に
このメッセージが飛んでくるなら話は別ですが。

tr() を使ってメッセージ表示してみましたか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 19:47:19
しかし、SetInitialFont(HWND hWnd);(フォントの初期化の部分)を実行させないようにすれば、WM_LBUTTONUPメッセージが単独でもきちんと来るようになりますよ。
関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:12:08
>> 関係ないのでしょうか?
私のところでその状況を再現できるようにするにはどうしたら
いいですか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 22:14:49
もしかして環境依存のほうでしょうか?
私はBorland C++ を使っているのですが、そういうことは関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:27:52
>> Borland C++
それを早く言ってくださいよ。
私には全く同じ環境での確認できません。
ただ、メッセージの流れについて見ることは
判断できそうですが、
tr() または OutputDebugString() を
使うことは不可能なのでしょうか?
最後の手段としては WinMain() でログファイルを
開いて(作成して)そこに記録するという方法も考えられますが。

VC++ じゃないから Spy++ といわれても
何のことかさっぱりだったでしょうね。

--------------------------------------------------------------------------------
Cの使用者 2004/12/14(火) 20:33:41
すいません。これからは環境を明記するようにします。

ところで、Visual C++の場合、OutputDebugString()はどうやって使うのですか?
あと SPY++のようなプログラムをご存じでしたら教えてくださいませんか?

--------------------------------------------------------------------------------
なーめ 2004/12/14(火) 22:51:14
>> OutputDebugString()はどうやって使うのですか?
上に私のtr() があるでしょう。
使用例そのものですよ。

VC++ のデバッグモードで F5 押して起動。
OutputDebugString() で出力した文字列はすべて VC++ のデバッグ窓に
出力されます。VC++ でなくてもこの文字列を出力するツールがあるようです。
他の質問のところに書いてあった記憶が...。
Spy++ は全てのウィンドウを一覧表示し、そのなかから特定のウィンドウを
選択してそこにやってくるメッセージをモニタするものです。
VC++ をインストールすると入っているのですが。

--------------------------------------------------------------------------------
RAPT 2004/12/15(水) 01:06:04
OutputDebugString はAPIです。
APIなので、VC++以外でも使えると思います。

DbgMOn とか。
http://www.vector.co.jp/soft/win95/prog/se169346.html

--------------------------------------------------------------------------------
Cの使用者 2004/12/15(水) 18:55:38
デバッガでトレースする限りでは、プログラムが終了するときにRichEdit関係のエラーがおこっているようですが、RichEditはメインウィンドウ以外(たとえばTabコントロールなど)を親とすることは出来ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/16(木) 00:04:21
あ、私のところでも終了時のエラーはありましたが、
『猫でも』の方法でよくないと思われることがあります。
LoadLibrary("RICHED32.DLL");
FreeLibrary(hRtLib);
の位置なのですが、
これを WinMain() の最初と最後に移動してみてください。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR line, int show)
{
    //    return( WinMain2( hInst, hPrev, line, show ));
    if(( g_hRtLib = LoadLibrary("RICHED32.DLL")) == NULL )
    {
        tr("ライブラリのロード失敗");
        return( -1 );
    }
    // 本体プログラム
    // .......
    if( FreeLibrary( g_hRtLib ) == 0 )
    {
        tr("ライブラリ解放失敗.\n");
    }
    return 0;
}

--------------------------------------------------------------------------------
Cの使用者 2004/12/17(金) 17:34:31
ほかのサイトを探してみたところ、WM_NOTIFY メッセージを使ってやりたかったことを実現できましたが、そもそもRichEditは、「マウスでドラッグする」等の作業をするとき WM_LBUTTONUPメッセージは出るのですか?
Editでは出ていたのですが・・・。

--------------------------------------------------------------------------------
eefe 2004/12/18(土) 17:33:28
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
追加発言 
■ お名前(ペンネーム可)
    
■ メールアドレス(省略可、半角で入力)
    
■ ホームページアドレス(省略可、半角で入力)
    
■ 発言(エラー時再送信禁止)
    ←解決時は質問者本人がここをチェックしてください。
    
      

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
hhtt 2004/12/18(土) 17:36:53
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"","",MB_OK);
          break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

はちゃんとメッセージボックスが2つでるのですが、

LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
 //    case WM_LBUTTONDOWN:
 //         MessageBox(hwnd,"","",MB_OK);
 //         break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

こちらはウンともスンとも言いません。
選択範囲をポイントするとマウスカーソルが矢印に変わりますよね(RichEditの場合)。
そのときは後者のプログラムも反応するのですが・・・。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 12:47:55
メッセージボックスを使っているのですか。
メッセージボックスは Focus を変えてしまうので、
予期せぬメッセージが飛び交います。
VCのデバッグモードで、tr() を使ってメッセージを
確認してください。spy++ を使ってもいいです。
確認とはメッセージの意味をHELPで調べるということです。

WM_LBUTTONUP でのメッセージボックスは関係ないように
思われるかもしれませんが、次の WM_LBUTTONDOWN が発生するときに
FOCUS の変化のためのメッセージが飛んできて、面倒なことになります。

このような障害を相手にするときは、注目しているメッセージだけでなく、
他のすべtのメッセージを表示させるようにすべきです。
何が起きているか、間接的にでもつかめることが多いというものです。

そして、WM_SETCURSOR とか WM_MOUSEMOVE のような
分かりきったものを表示からはずしてゆけばいいですね。
たまに、外したものが重要なメッセージであったこともありますが。(^^;;
メッセージのコードをいちいち調べるのが面倒なら、
以下の文字列化テーブルとルーチンを用意しておきましょう。
一度だけ我慢して作っておけば、再利用可能ですからね。
もちろん全てのメッセージを網羅しておかないと、意味ないです。

struct tagMsgStrs
{
    UINT msg;
    char * name;
}
g_msgStrs[] =
{
    { WM_NULL,                    "WM_NULL"                        },
    { WM_CREATE,                "WM_CREATE"                        },
    { WM_DESTROY,                "WM_DESTROY"                    },
    .....
    { WM_MOUSEMOVE,                "WM_MOUSEMOVE"                    },    //    0x0200
    { WM_LBUTTONDOWN,            "WM_LBUTTONDOWN"                },    //    0x0201
    { WM_LBUTTONUP,                "WM_LBUTTONUP"                    },    //    0x0202
    { WM_LBUTTONDBLCLK,            "WM_LBUTTONDBLCLK"                },    //    0x0203
    .....
};

char * strmsg( UINT msg )
{
    int c;
    static char s[128];
    for( c = 0; g_msgStrs[c].name; c ++ )
    {
        if( g_msgStrs[c].msg == msg )
        {
            return( g_msgStrs[c].name );
        }
    }
    sprintf( s,"unknown[%08X]", msg );
    return( s );
}

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 13:12:53
...にしても、示された部分について
まったくあなたと同じコードにしてみたら、
WM_LBUTTONUP のダイアログは必ず表示されますが。
やっぱり OS が違うのか。開発環境が違うのか。
ちなみ RichEdit のスタイルは次のようにしています。

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 13:54:29
RichEditは  http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm  のやり方を使わせていただいているのですが、どうもフォントを初期化している関数で処理の流れが変わっているようです。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 15:36:36
>> <URL> のやり方を使わせていただいているのです
私もトレースを簡単に行なおうと思い、一部、これをコピーしています。

>> どうもフォントを初期化している関数で処理の流れが変わっているようです
なので、フォントの部分は同じコーディングになっています。
でも WM_LBUTTONUP は正常に来ていますよ。

そもそも、EM_SETCHARFORMATが関係しているとは
考えにくいですが、WM_LBUTTONDONW-WM_LBUTTONUP の間に
このメッセージが飛んでくるなら話は別ですが。

tr() を使ってメッセージ表示してみましたか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 19:47:19
しかし、SetInitialFont(HWND hWnd);(フォントの初期化の部分)を実行させないようにすれば、WM_LBUTTONUPメッセージが単独でもきちんと来るようになりますよ。
関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:12:08
>> 関係ないのでしょうか?
私のところでその状況を再現できるようにするにはどうしたら
いいですか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 22:14:49
もしかして環境依存のほうでしょうか?
私はBorland C++ を使っているのですが、そういうことは関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:27:52
>> Borland C++
それを早く言ってくださいよ。
私には全く同じ環境での確認できません。
ただ、メッセージの流れについて見ることは
判断できそうですが、
tr() または OutputDebugString() を
使うことは不可能なのでしょうか?
最後の手段としては WinMain() でログファイルを
開いて(作成して)そこに記録するという方法も考えられますが。

VC++ じゃないから Spy++ といわれても
何のことかさっぱりだったでしょうね。

--------------------------------------------------------------------------------
Cの使用者 2004/12/14(火) 20:33:41
すいません。これからは環境を明記するようにします。

ところで、Visual C++の場合、OutputDebugString()はどうやって使うのですか?
あと SPY++のようなプログラムをご存じでしたら教えてくださいませんか?

--------------------------------------------------------------------------------
なーめ 2004/12/14(火) 22:51:14
>> OutputDebugString()はどうやって使うのですか?
上に私のtr() があるでしょう。
使用例そのものですよ。

VC++ のデバッグモードで F5 押して起動。
OutputDebugString() で出力した文字列はすべて VC++ のデバッグ窓に
出力されます。VC++ でなくてもこの文字列を出力するツールがあるようです。
他の質問のところに書いてあった記憶が...。
Spy++ は全てのウィンドウを一覧表示し、そのなかから特定のウィンドウを
選択してそこにやってくるメッセージをモニタするものです。
VC++ をインストールすると入っているのですが。

--------------------------------------------------------------------------------
RAPT 2004/12/15(水) 01:06:04
OutputDebugString はAPIです。
APIなので、VC++以外でも使えると思います。

DbgMOn とか。
http://www.vector.co.jp/soft/win95/prog/se169346.html

--------------------------------------------------------------------------------
Cの使用者 2004/12/15(水) 18:55:38
デバッガでトレースする限りでは、プログラムが終了するときにRichEdit関係のエラーがおこっているようですが、RichEditはメインウィンドウ以外(たとえばTabコントロールなど)を親とすることは出来ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/16(木) 00:04:21
あ、私のところでも終了時のエラーはありましたが、
『猫でも』の方法でよくないと思われることがあります。
LoadLibrary("RICHED32.DLL");
FreeLibrary(hRtLib);
の位置なのですが、
これを WinMain() の最初と最後に移動してみてください。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR line, int show)
{
    //    return( WinMain2( hInst, hPrev, line, show ));
    if(( g_hRtLib = LoadLibrary("RICHED32.DLL")) == NULL )
    {
        tr("ライブラリのロード失敗");
        return( -1 );
    }
    // 本体プログラム
    // .......
    if( FreeLibrary( g_hRtLib ) == 0 )
    {
        tr("ライブラリ解放失敗.\n");
    }
    return 0;
}

--------------------------------------------------------------------------------
Cの使用者 2004/12/17(金) 17:34:31
ほかのサイトを探してみたところ、WM_NOTIFY メッセージを使ってやりたかったことを実現できましたが、そもそもRichEditは、「マウスでドラッグする」等の作業をするとき WM_LBUTTONUPメッセージは出るのですか?
Editでは出ていたのですが・・・。

--------------------------------------------------------------------------------
eefe 2004/12/18(土) 17:33:28
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
追加発言 
■ お名前(ペンネーム可)
    
■ メールアドレス(省略可、半角で入力)
    
■ ホームページアドレス(省略可、半角で入力)
    
■ 発言(エラー時再送信禁止)
    ←解決時は質問者本人がここをチェックしてください。
    
      

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
ttrsj 2004/12/18(土) 17:37:07
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐに押したままウィンドウ外でボタンを放しました。
すると、WM_LBUTTONUPはきませんね。
この操作でやってくるメッセージを眺めると、

WM_PAINT
WM_ERASEBKGND
WM_MOUSEMOVE
WM_CAPTURECHANGED

が来ていました。
最後のが妖しいですね。
マウスがキャプチャされたらしいです。

上記の、RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp) に

  default:
    tr("msg: %08X.\n", msg );
    break;

を加えての調査です。
WM_LBUTTONUPが来ないときにどのようなメッセージがきているか
そちらでも調査してみるとよいでしょう。

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 10:14:06
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
     case WM_LBUTTONDOWN:
          MessageBox(hwnd,"","",MB_OK);
          break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

はちゃんとメッセージボックスが2つでるのですが、

LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){
 //    case WM_LBUTTONDOWN:
 //         MessageBox(hwnd,"","",MB_OK);
 //         break;
     case WM_LBUTTONUP:
          MessageBOx(hwnd,"","",MB_OK);
          break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp )); 
}

こちらはウンともスンとも言いません。
選択範囲をポイントするとマウスカーソルが矢印に変わりますよね(RichEditの場合)。
そのときは後者のプログラムも反応するのですが・・・。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 12:47:55
メッセージボックスを使っているのですか。
メッセージボックスは Focus を変えてしまうので、
予期せぬメッセージが飛び交います。
VCのデバッグモードで、tr() を使ってメッセージを
確認してください。spy++ を使ってもいいです。
確認とはメッセージの意味をHELPで調べるということです。

WM_LBUTTONUP でのメッセージボックスは関係ないように
思われるかもしれませんが、次の WM_LBUTTONDOWN が発生するときに
FOCUS の変化のためのメッセージが飛んできて、面倒なことになります。

このような障害を相手にするときは、注目しているメッセージだけでなく、
他のすべtのメッセージを表示させるようにすべきです。
何が起きているか、間接的にでもつかめることが多いというものです。

そして、WM_SETCURSOR とか WM_MOUSEMOVE のような
分かりきったものを表示からはずしてゆけばいいですね。
たまに、外したものが重要なメッセージであったこともありますが。(^^;;
メッセージのコードをいちいち調べるのが面倒なら、
以下の文字列化テーブルとルーチンを用意しておきましょう。
一度だけ我慢して作っておけば、再利用可能ですからね。
もちろん全てのメッセージを網羅しておかないと、意味ないです。

struct tagMsgStrs
{
    UINT msg;
    char * name;
}
g_msgStrs[] =
{
    { WM_NULL,                    "WM_NULL"                        },
    { WM_CREATE,                "WM_CREATE"                        },
    { WM_DESTROY,                "WM_DESTROY"                    },
    .....
    { WM_MOUSEMOVE,                "WM_MOUSEMOVE"                    },    //    0x0200
    { WM_LBUTTONDOWN,            "WM_LBUTTONDOWN"                },    //    0x0201
    { WM_LBUTTONUP,                "WM_LBUTTONUP"                    },    //    0x0202
    { WM_LBUTTONDBLCLK,            "WM_LBUTTONDBLCLK"                },    //    0x0203
    .....
};

char * strmsg( UINT msg )
{
    int c;
    static char s[128];
    for( c = 0; g_msgStrs[c].name; c ++ )
    {
        if( g_msgStrs[c].msg == msg )
        {
            return( g_msgStrs[c].name );
        }
    }
    sprintf( s,"unknown[%08X]", msg );
    return( s );
}

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 13:12:53
...にしても、示された部分について
まったくあなたと同じコードにしてみたら、
WM_LBUTTONUP のダイアログは必ず表示されますが。
やっぱり OS が違うのか。開発環境が違うのか。
ちなみ RichEdit のスタイルは次のようにしています。

WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 13:54:29
RichEditは  http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm  のやり方を使わせていただいているのですが、どうもフォントを初期化している関数で処理の流れが変わっているようです。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 15:36:36
>> <URL> のやり方を使わせていただいているのです
私もトレースを簡単に行なおうと思い、一部、これをコピーしています。

>> どうもフォントを初期化している関数で処理の流れが変わっているようです
なので、フォントの部分は同じコーディングになっています。
でも WM_LBUTTONUP は正常に来ていますよ。

そもそも、EM_SETCHARFORMATが関係しているとは
考えにくいですが、WM_LBUTTONDONW-WM_LBUTTONUP の間に
このメッセージが飛んでくるなら話は別ですが。

tr() を使ってメッセージ表示してみましたか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 19:47:19
しかし、SetInitialFont(HWND hWnd);(フォントの初期化の部分)を実行させないようにすれば、WM_LBUTTONUPメッセージが単独でもきちんと来るようになりますよ。
関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:12:08
>> 関係ないのでしょうか?
私のところでその状況を再現できるようにするにはどうしたら
いいですか?

--------------------------------------------------------------------------------
Cの使用者 2004/12/13(月) 22:14:49
もしかして環境依存のほうでしょうか?
私はBorland C++ を使っているのですが、そういうことは関係ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 22:27:52
>> Borland C++
それを早く言ってくださいよ。
私には全く同じ環境での確認できません。
ただ、メッセージの流れについて見ることは
判断できそうですが、
tr() または OutputDebugString() を
使うことは不可能なのでしょうか?
最後の手段としては WinMain() でログファイルを
開いて(作成して)そこに記録するという方法も考えられますが。

VC++ じゃないから Spy++ といわれても
何のことかさっぱりだったでしょうね。

--------------------------------------------------------------------------------
Cの使用者 2004/12/14(火) 20:33:41
すいません。これからは環境を明記するようにします。

ところで、Visual C++の場合、OutputDebugString()はどうやって使うのですか?
あと SPY++のようなプログラムをご存じでしたら教えてくださいませんか?

--------------------------------------------------------------------------------
なーめ 2004/12/14(火) 22:51:14
>> OutputDebugString()はどうやって使うのですか?
上に私のtr() があるでしょう。
使用例そのものですよ。

VC++ のデバッグモードで F5 押して起動。
OutputDebugString() で出力した文字列はすべて VC++ のデバッグ窓に
出力されます。VC++ でなくてもこの文字列を出力するツールがあるようです。
他の質問のところに書いてあった記憶が...。
Spy++ は全てのウィンドウを一覧表示し、そのなかから特定のウィンドウを
選択してそこにやってくるメッセージをモニタするものです。
VC++ をインストールすると入っているのですが。

--------------------------------------------------------------------------------
RAPT 2004/12/15(水) 01:06:04
OutputDebugString はAPIです。
APIなので、VC++以外でも使えると思います。

DbgMOn とか。
http://www.vector.co.jp/soft/win95/prog/se169346.html

--------------------------------------------------------------------------------
Cの使用者 2004/12/15(水) 18:55:38
デバッガでトレースする限りでは、プログラムが終了するときにRichEdit関係のエラーがおこっているようですが、RichEditはメインウィンドウ以外(たとえばTabコントロールなど)を親とすることは出来ないのでしょうか?

--------------------------------------------------------------------------------
なーめ 2004/12/16(木) 00:04:21
あ、私のところでも終了時のエラーはありましたが、
『猫でも』の方法でよくないと思われることがあります。
LoadLibrary("RICHED32.DLL");
FreeLibrary(hRtLib);
の位置なのですが、
これを WinMain() の最初と最後に移動してみてください。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR line, int show)
{
    //    return( WinMain2( hInst, hPrev, line, show ));
    if(( g_hRtLib = LoadLibrary("RICHED32.DLL")) == NULL )
    {
        tr("ライブラリのロード失敗");
        return( -1 );
    }
    // 本体プログラム
    // .......
    if( FreeLibrary( g_hRtLib ) == 0 )
    {
        tr("ライブラリ解放失敗.\n");
    }
    return 0;
}

--------------------------------------------------------------------------------
Cの使用者 2004/12/17(金) 17:34:31
ほかのサイトを探してみたところ、WM_NOTIFY メッセージを使ってやりたかったことを実現できましたが、そもそもRichEditは、「マウスでドラッグする」等の作業をするとき WM_LBUTTONUPメッセージは出るのですか?
Editでは出ていたのですが・・・。

--------------------------------------------------------------------------------
eefe 2004/12/18(土) 17:33:28
--------------------------------------------------------------------------------
  Elfaria Development Studio.eds  (EDS) 

--------------------------------------------------------------------------------

VB.NET / C# / Mono / Linux についてのTips等を公開しています。 
また、少しですがコラムも公開しています。


--------------------------------------------------------------------------------
  Programming Library 

--------------------------------------------------------------------------------

主にVB,VC等の各言語に関するテクニックやAPI情報を掲載しております。 
その他としまして掲示板にて情報交換の場を設けています。 
当サイトの趣旨は「情報共有」で、より技術向上の場として自分達運営者を含め、開発者達のお役に立てればと思い運営しております。



--------------------------------------------------------------------------------
>> このページのTOPへ   

--------------------------------------------------------------------------------
  猫でもわかるプログラミング  (猫プロ) 

--------------------------------------------------------------------------------

超初心者対象のC/C++講座です。ともかくわかりやすく、初心者に優しいをモットーに運営しています。スマートなプログラムより、わかりやすいプログラムを目指しています。





--------------------------------------------------------------------------------
  らららのプログラマーズラウンジ 

--------------------------------------------------------------------------------

らららの

--------------------------------------------------------------------------------
追加発言 
■ お名前(ペンネーム可)
    
■ メールアドレス(省略可、半角で入力)
    
■ ホームページアドレス(省略可、半角で入力)
    
■ 発言(エラー時再送信禁止)
    ←解決時は質問者本人がここをチェックしてください。
    
      

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
thts 2004/12/18(土) 17:37:20
WM_LBUTTONUPメッセージについて
[戻る] 
--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 16:28:43
すいません。また質問です。
サブクラス化で詰まってしまいました。
WNDPROC Org_EditProc;

Org_EditProc=(WNDPROC)SetWindowLong(hEdit,GWL_WNDPROC,(LONG)EditProc);
LRESULT CALLBACK EditProc(HWND hwnd, UINT msg, WPARAM wp,LPARAM  lp)
{
switch(msg){

    ・
    ・
と書いたら、WM_LBUTTONUPメッセージがうまく届かないのですが、なぜかわかりません。どなたか教えてください。

--------------------------------------------------------------------------------
なーめ 2004/12/12(日) 16:55:12
MFCで OnLButtonDown を実装すると、
正しく呼ばれるので、Editコントロールの
問題ではないですね。
(MFCは AfxWinProc という関数でサブクラス化しています)

CStatic でスクロールバーが制御できないのとは別のようです。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200410/04100062.txt
では、WM_LBUTTONDOWN はどこへ行ってしまうのか。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
において、WM_DROPFILES が行方不明になるのを解決した例が
ある(一番最後の私の発言)ので、参考まで。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:39:21
あの、WM_LBUTTONDOWN メッセージを採った直後ならWM_LBTTONUPメッセージを取れるのですが、何か関係があるのでしょうか? 

それと、MFCに関する知識がまったく無いので、出来ればSDKだけでお願いします。

--------------------------------------------------------------------------------
Cの使用者 2004/12/12(日) 22:49:55
すいません。大変重大なことに気づきました。

最初はそれほど重大なこととは思っていなかったのですが、Editでは無く、RichEditでした。
RichEditを作成していたところでEditを作成するようにプログラムを変更してみたところ、うまく動作しました。

RichEditはEditを拡張して作ったものだと思っていたのですが、RichEditでWM_LBUTTONUPに相当するメッセージを受けるにはどうすればいいのですか?

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:45:14
ちゃんと呼ばれますよ。WM_LBUTTONUP。

LRESULT CALLBACK RichProc(HWND hTab, UINT msg, WPARAM wp, LPARAM lp)
{
    switch( msg )
    {
        case WM_MBUTTONDOWN:
            tr("RichEdit::MButtonDown().\n");
            break;
        case WM_MBUTTONUP:
            tr("RichEdit::MButtonUp().\n");
            break;
        case WM_RBUTTONDOWN:
            tr("RichEdit::RButtonDown().\n");
            break;
        case WM_RBUTTONUP:
            tr("RichEdit::RButtonUp().\n");
            break;
        case WM_LBUTTONDOWN:
            tr("RichEdit::LButtonDown().\n");
            break;
        case WM_LBUTTONUP:
            tr("RichEdit::LButtonUp().\n");
            break;
    }
    return( CallWindowProc( g_prgRichOrgProc,hTab,msg,wp,lp ));
}

-------------- output -------------
RichEdit::RButtonDown().
RichEdit::RButtonUp().
RichEdit::LButtonDown().
RichEdit::LButtonUp().
RichEdit::MButtonDown().
RichEdit::MButtonUp().

ちなみに、tr() は以下のルーチン。printf系書式対応。

#include <stdio.h>

void tr( LPCTSTR lpszFormat, ...)
{
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[8192];
    nBuf = _vsntprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
    OutputDebugString( szBuffer );
    va_end(args);
}

--------------------------------------------------------------------------------
na-me 2004/12/13(月) 02:50:52
Win2K,VC++6.0ですが。

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 02:54:31
仮名漢字変換になってなかったので Enter で送信されてしまった。
失礼。
こちらは、Win2K,VC++6.0ですが。
OS/Libraryの違いにより微妙に動作が違うことがあるかもしれません。
参考まで:
http://www.kumei.ne.jp/c_lang/sdk2/sdk_130.htm

--------------------------------------------------------------------------------
なーめ 2004/12/13(月) 03:32:33
>> WM_LBUTTONDOWN メッセージを採った直後なら
>> WM_LBTTONUPメッセージを取れるのですが

単に、WM_LBUTTONUPが来ないというわけではないのでしたね。
WM_LBUTTONDOWN を取ったあと、処理に時間がかかるということでしょうか。
単純に WM_LBUTTONDOWN の処理で、Sleep(10000) して見ましたが、
やはり変わりません(WM_LBUTTONUPは来ます)。

メッセージキューをスキップしてしまうような処理が間に挿入されている
のではないでしょうか。

ためしに、Sleep(1000); の状態で、RichEditコントロールを
クリック、すぐ

編集 削除