• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VC++,SendMessage()の使い方)

VC++,SendMessage()の使い方

dannerの回答

  • ベストアンサー
  • danner
  • ベストアンサー率72% (8/11)
回答No.1

Dannerです SendMessageの最初の引数は、メッセージIDを指定します。 (ID_ENGAGEはコマンドを識別するためのID) したがって SendMessage(WM_COMMAND, ID_ENGAGE); にすれば、動くと思います。 同じクラス内で呼ぶのなら、直接ハンドラ関数を呼んだ方が簡単です。

hogehogeninja
質問者

お礼

なるほど、そういうことだったのですね。 うまくいき、助かりました。 どうもありがとうございます。

関連するQ&A

  • VC++ ウィンドウの大きさを変えたい

    初歩的なことだと思いますが、メニューからのコマンドメッセージを受け取って、CViewクラスで処理すると同時に、CFrameWndクラスでウィンドウの大きさを変えたいです。 CViewのメッセージハンドラでCFrameWndのオブジェクトのポインタを保持して、直接操作する方法を考えたのですが、CViewからCFrameWndを取得する方法が分かりません。 どのようにすればいいか知りたいです。 また、同じメッセージをCViewとCFrameWndの両方に配信するとか、他に良い方法があれば教えていただきたいです。 よろしくお願いします。

  • 【VBA】 VBAを使ってExcelにSendMessageしてメニューを実行したい

    エクセルにおいて、VBAを使ってExcelに対してSendMessageをおこないメニューを実行したいのですが、メニューのSendMessageの引数WPARAMとLPARAMに 何を渡せば良いのでしょうか?SPY++を使ってメニューを実行したときにExcelに送られるWM_COMMANDを監視していましたがWM_COMMANDが見つかりませんでした。 ご存知の方、ご教授お願いします。 ちなみに、オートシェイプ選択時に「書式」-「オートシェイプ」メニューを実行し、書式設定ダイアログが表示され、オートシェイプの書式設定を変更するのが目的です。(VBAを使って書式設定のダイアログを表示する必要あり) SendKeysステートメントを使ってやってみましたがダメでした。この場合、モードレスダイアログに書式設定するコマンドボタンを配置し、そのボタンをクリックしたときにSendKeysを実行するもので、モードレスダイアログを表示している間はキーがモードレスダイアログに送られると判断してSendKeysの使用はやめました。

  • メニューの表示・非表示について

    1.ツールバーの場合は 以下で、ダブルクリックすると表示されているときには非表示になり、非表示のときには表示することが出来ます。 void CAbcView::OnLButtonDblClk(UINT nFlags, CPoint point) { AfxGetMainWnd()->SendMessage(WM_COMMAND,LOWORD(ID_VIEW_TOOLBAR),0); } 2.メニュー(バー)の場合は、 以下にて非表示となり、 AfxGetMainWnd()->SetMenu(NULL); 以下にて表示されます。 CMenu menu; menu.LoadMenu(IDR_MAINFRAME); AfxGetMainWnd()->SetMenu(&menu); menu.Detach(); 知りたいことは、メニューの場合もツールバーのように表示されているときは非表示となり、非表示の場合は表示されるようにする方法です。 よろしくお願いいたします。

  • デバックモードが終了しません

    VC6(SP5)からADO(Oralce)へアクセスしているのですが、 処理は正常に行えるのですが、終了処理(ウインドウを閉じる又はAfxGetMainWnd()->PostMessage( WM_CLOSE );を行う)をすると、VSがデバックモードのままで終了しません。 これは、ソースが悪いのでしょうか? それとも、何か設定が間違っているのでしょうか? ちなみに、exeを実行し終了すると、問題なく終了します。エラー等は発生しません。 よろしくお願いします。

  • CMainFrameクラスの使い方

    すみませんが教えてください。 これまで左クリックで画面に文字を表示するときには、何も考えずCxxxViewクラスにWM_LBUTTONDOWNをかいていました。ところがCMainFrameクラスにもちゃんとWN_LBUTTONDOWNが用意されているではないですか。 先ほど教えていただいたばかりの左クリックにてウインドウサイズ変更ができると思い以下のようにしましたが、何も起きませんでした。 どうすれば実現できるのでしょうか? CMainFrameクラスのWN_LBUTTONDOWNはどのような時に使うのですか? void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください AfxGetMainWnd()->SetWindowPos(NULL,100,200,300,400,SWP_SHOWWINDOW); CFrameWnd::OnLButtonDown(nFlags, point); }

  • イベントハンドラが取得できない VC++ MFC

    おはようございます(><) VC++.NETで開発を行っています。 MFCを使って開発をしています。 CDialogを継承したCmyDialogでOnLButtonDownのイベントがとれません。 OnLButtonDownのイベントを使いたかったのですが 自動でイベントを設定するプロパティのメニュー(雷のマークみたいなもの)にイベントがなかったので 自分でCmyDialog::と書いたらリストの中に OnLButtonDown( UINT nFlags,CPoint point)がでたので 定義に追加、イベントの記述を追加しました。 雷マークで作ったイベントのコードには // TODO : ここにコントロール通知ハンドラ コードを追加します。 と自動で記述され、ブレイクポイントを設定するとそこで止まるのですが 私が記述したLButtonDownのイベントでは実行してもブレイクポイントで止まりません。 他のイベントと比べて違うのは BEGIN_MESSAGE_MAP(CmyDialog, CDialog)の中に ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnLvnColumnclickList1) のように イベントハンドラ名、リソース名?、イベント名 と自動で記述があります。 ここを追加すればいいのかなと思いましたが 左クリックに対応するイベントハンドラ名が分かりません。 問題解決に有効な情報をお持ちの方 お力をお貸しください。 よろしくお願いします(><)

  • 「送る」について

    任意のファイル右クリックするとポップアップメニューが出ますよね。 その中に「送る」がありますが、この送るを開きますと中に幾つかの実行できるアイテムが出ます。このアイテムの中に不要な物が幾つか含まれているのですがこれを削除する方法を教えて下さい。

  • VC++2005での警告について教えてください

    よろしくお願いします。 vc++2005を使ってコンパイルした時、プログラムの『691行目と、689行目』の所に緑色の(∥チェック)が付いていて、次のような警告が出たのですが、 これは、『記述する場所が間違っている』と解釈して良いでしょうか? ------ ビルド開始: プロジェクト: memo, 構成: Release Win32 ------ コンパイルしています... c:\memo\memo\memo.cpp(691) : warning C4715: 'NewProc' : 値を返さないコントロール パスがあります。 コード生成が終了しました。 マニフェストを埋め込んでいます... ビルドログは "file://c:\Visual Studio 2005\Projects\memo\memo\Release\BuildLog.htm" に保存されました。 memo - エラー 0、警告 21 ========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ========== //サブクラス化後のプロシージャ LRESULT CALLBACK NewProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { POINT pt; static HMENU hMenu; static HMENU hSubMenu; int id; switch (msg){ case WM_RBUTTONDOWN: //ポップアップメニューを作る hMenu = LoadMenu(hInst, "MYMENU2"); hSubMenu = GetSubMenu(hMenu, 0); pt.x = LOWORD(lp); pt.y = HIWORD(lp); ClientToScreen(hWnd, &pt); TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, hWnd, NULL); DestroyMenu(hMenu); break; case WM_COMMAND: switch (LOWORD(wp)){ case IDM_NEW: MyNew(hWnd); break; /*case IDM_SAVE: MySave(hWnd); break;*/ case IDM_SAVEAS: MySaveAs(hWnd); break; case IDM_OPEN: MyOpen(hWnd); break; case IDM_END: if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == FALSE){ id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } } if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == TRUE){ id = MessageBox(hWnd, TEXT("文書が更新されています、\n変更を保存しますか?"), TEXT("メモ帳"), MB_YESNOCANCEL | MB_ICONEXCLAMATION); if(id == IDYES){ MySave(hWnd); //MySaveAs(hWnd); }else if (id == IDCANCEL){ return IDCANCEL; }/*else if (id ==IDNO){ *///ここを記述すると //文書保存ダイアログでキャンセルした時に、『終了しない』 id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } } } break; default: 689行目 return CallWindowProc(OldProc, hWnd, msg, wp, lp); } 691 行目 }

  • キーボードキーでもクリックしたときと同じようにしたい。

    アプリのクリックすると表示が変わるところをキーボードで 特定のボタンを押してもクリックしたのと同じように動作する ようにすこし変更したいと思っています。 アプリでは出題、問題、回答をクリックするとその機能が 使われるようです。その各クリックを Qを押したとき出題、Wのとき問題、Eキーを押したとき回答にも 割り当てたいのですがどうすればいいかわかりません。 処理をしているところはおそらくここだと思うのですが そのプログラムを下のに追加して書いてくれませんか? <!-- メニュー --> <span id='MainMenu' style='left:5;top:0;width:100%;height:24;background-color:#cccccc;padding:3;'> <a id='MainMenu.Item1' onclick='procMenu(1)' class='Menu' href='javascript:void(0)'>[出題]&nbsp;</a> <a id='MainMenu.Item2' onclick='procMenu(2)' class='Menu' href='javascript:void(0)'>[問題]&nbsp;</a> <a id='MainMenu.Item3' onclick='procMenu(3)' class='Menu' href='javascript:void(0)'>[回答]&nbsp;</a> </span>

  • ダブルバッファについて

    スタート画面にBitmapを用いたアニメーションを用いて、次の場面に移動したいのですが 実行すると画面がちかちかしてしまいます。どう直せばよいか教えてもらえると助かります プログラムはVisualStudio2008のMFCでやっています #include "stdafx.h" #include "graph.h" #include "graphDoc.h" #include "graphView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif //全域変数 CDC bkDC; CBitmap bkBMP; #define ID_REDRAW 30 #define TIMER_MS_FPS 1000/30 #define ID_BITMAP 60 #define TIMER_MS_BITMAP 300 #include <math.h> int draw_state = 0; float mouse_x = -1.0, mouse_y = -1.0; // CgraphView IMPLEMENT_DYNCREATE(CgraphView, CView) BEGIN_MESSAGE_MAP(CgraphView, CView) // 標準印刷コマンド ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview) ON_COMMAND(ID_BK_WHITE, &CgraphView::OnBkWhite) ON_COMMAND(ID_BK_BLUE, &CgraphView::OnBkBlue) ON_COMMAND(ID_BK_PINK, &CgraphView::OnBkPink) ON_WM_TIMER() ON_WM_DESTROY() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() // CgraphView コンストラクション/デストラクション CgraphView::CgraphView() : background_color(0) , draw_state(0) , Bmp_ID(0) { // TODO: 構築コードをここに追加します。 background_color = 0; int draw_state = 0; } CgraphView::~CgraphView() { } BOOL CgraphView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを // 修正してください。 return CView::PreCreateWindow(cs); } // CgraphView 描画 void CgraphView::OnDraw(CDC* pDC) { CgraphDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: この場所にネイティブ データ用の描画コードを追加します。 //ダブルバッファに関するコード CRect rc; GetClientRect(&rc); bkDC.CreateCompatibleDC(pDC); bkBMP.CreateCompatibleBitmap(pDC, rc.right, rc.bottom); bkDC.SelectObject(&bkBMP); //描画は、裏画面bkDCにおいて行う bkDC.FillSolidRect(rc, RGB(153, 204, 255)); int x, y, sx, sy; if(draw_state == 0) { bkDC.SetTextColor(RGB(255, 255, 255)); bkDC.TextOut(480, 580, _T("Start")); sx = 128; sy = 128; y = 340; x = 200; draw_school(x, y, sx, sy);//定義は省略 x = 400; draw_health(x, y, sx, sy);//定義は省略 x = 600; draw_environment(x, y, sx, sy);//定義は省略 } else if(draw_state == 1) { CRect myRect; GetClientRect(myRect); pDC->FillSolidRect(myRect, RGB(0, 0, 0)); } //裏画面を表画面に送る //pDC->BitBlt(0, 0, rc.right, rc.bottom, &bkDC, 0, 0, SRCCOPY); //裏画面を消去 bkBMP.DeleteObject(); bkDC.DeleteDC(); //実行画面のプログラムを省略    void CgraphView::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 bitmap[0].LoadBitmap(IDB_BITMAP1); bitmap[1].LoadBitmap(IDB_BITMAP2); bitmap[2].LoadBitmap(IDB_BITMAP3); bitmap[3].LoadBitmap(IDB_BITMAP4); bitmap[4].LoadBitmap(IDB_BITMAP5); bitmap[5].LoadBitmap(IDB_BITMAP6); //タイマーをスタート SetTimer(ID_BITMAP, TIMER_MS_BITMAP, NULL); //画面再描画のタイマーをスタートする SetTimer(ID_REDRAW, TIMER_MS_FPS, NULL); Bmp_ID = 0; } void CgraphView::OnTimer(UINT_PTR nIDEvent) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 if(nIDEvent == ID_BITMAP) Bmp_ID = (Bmp_ID+1) % 2; if(nIDEvent == ID_REDRAW) InvalidateRect(NULL, FALSE); CView::OnTimer(nIDEvent); } void CgraphView::OnDestroy() { CView::OnDestroy(); // TODO: ここにメッセージ ハンドラ コードを追加します。 KillTimer(ID_BITMAP); KillTimer(ID_REDRAW); } void CgraphView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 mouse_x = point.x; mouse_y - point.y; if(draw_state == 0) { if(mouse_x > 420 && mouse_y > 500) { draw_state = 1; } } CView::OnLButtonDown(nFlags, point); } //以下は関数の定義なので省略