ママのスキンケアのお悩みにおすすめアイテム

親ウィンドウ内に子リストウィンドウを作り
子リストウィンドウを左クリックしたときに
「子リストウィンドウに何かイベントが発生した」
ということを
子リストウィンドウにメッセージを送ってもらうことなく
親ウィンドウが知る方法は有るのでしょうか?

子リストウィンドウのウィンドウ処理関数を作りたくないのでできるだけ子リストウィンドウの処理はデフォルト処理で済ませたいのですが・・・

A 回答 (2件)

WM_COMMANDでLBN_~のメッセージは親ウィンドウに送られてきているはずです。



それ以外のメッセージを取得するにはサブクラス化
するしかないです。

この回答への補足

ありがとうございます。
WM_PARENTNOTIFY
で子リストボックスが左クリックされたという情報は得られるのですが
子リストボックスの選択項目に応じて親ウィンドウに画像を表示させる場合
左クリック時点では選択項目が左クリック前の選択項目なので親ウィンドウに表示される画像が1左クリック分遅れて表示されてしまいます。
それを回避するためにタイマーを使うことしか思い浮かばないのですが他に方法はあるのでしょうか?

補足日時:2003/06/08 21:58
    • good
    • 0

>子リストボックスの選択項目に応じて親ウィンドウに画像を表示させる場合


>左クリック時点では選択項目が左クリック前の選択項目なので親ウィンドウに表示される画像が1左クリック分遅れて表示されてしまいます。

普通はそんな時にマウスメッセージは使用しません。
なぜならリストボックスはキーボードで操作可能だからです。
システムが準備しているコントロールに標準的な動作を期待しているのであれば、自分で特殊なことはしないほうがいいですよ。


なんで、素直にLBN_SELCHANGEを使用しましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。
今まではすべての子ウィンドウのIDをNULLにしていましたがNO1の指摘の通り素直に
リストボックスにID番号を打ちCOMMANDメッセージのそのIDに応答する方法が一番良さそうです。

お礼日時:2003/06/09 06:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCStaticコントロールの静的イメージ描画

はじめまして、質問させてください。

VC++ 2005 MFC で開発しております。

Picture Control(DDX CStasic型)に
イメージ(外部ファイル JPG)を静的に描画させたいのですが
方法がわかりません。

お詳しい方がおられましたら、ご教授お願いいたします。

ちなみに
CImageを使用して描画はできるのですが
その場合、OnPaintをオーバーライドして
描画更新処理を書かないと一度だけ描画されて終わって
しまうと思います。

CStaic変数にロードしたら
再度ロードされるまで
ずっと描画させていたいです。

以上になります。
宜しくお願いいたします。

Aベストアンサー

SelectObjectで選択するとその時まで選択されていたデバイスハンドルを返してきます
そのハンドルを一時変数に保存しておいて描画後に戻してやるのです

CBitmap* pOld = m_dcMem.SelectObject( &m_bmpMem );
といった具合で記憶して描画処理を行います
使用後に
m_dcMem.SelectObject( pOld );
といった具合にして m_bmpMemをDCからはずします
この後
m_ctlImage.SetBitmap( m_bmpMem );
といった具合に選択してやればできると思います

CStaticのTypeはビットマップで無いとSetBitmapでイメージを表示しません

Q親ウィンドウのメッセージを子ウィンドウで処理する

親ウィンドウに入ってくるメッセージを子ウィンドウ(ダイアログ)のメッセージマップで処理したいと思ってますが、どうにもできません。なにかよい方法はないでしょうか?

処理したいメッセージはESCが押されたかどうかだけなので、親で受けたメッセージを子供にSendMessageすればよいのですが、できれば、親で受けたメッセージすべてを子供にそのまま渡すというようなことができたらうれしいです。
ATL/WTLでの書き方だともっとうれしいです。
どうぞよろしくお願いします。

Aベストアンサー

親ウィンドウを弄らずに子ウィンドウでメッセージを取りたいならばHookと言う手があります。ご存知かもしれませんが、プログラムのみならずOS自体にも致命的なダメージを与えかねないので注意して使用してください。

#メモリ確保などを子ウィンドウが行っていたとしても、終了の命令は(拡張時に他のウィンドウなども管理する観点から)明示的に親ウィンドウから行われるべきだと思います。メモリ開放などはそれを受けた子ウィンドウが行い、完了した旨を親ウィンドウに通知してプログラムが終了するのが通例でしょう。ただ、コメントから親ウィンドウを弄らないと言う記述があるので特殊なケースを狙ったものかもしれませんが…

QC#で親にイベントを投げる方法

すごく基本的なことかもしれないのですが、ポインタだけでも良いので教えてください。

あるFormにPictureBoxをはりつけてあります。
PictureBoxをマウスでクリックしたときにpictureBox_Click()イベントが発生しますが、このイベントをそのままスルーして、Formに伝えてあげたいのです。
pictureBox.Parent.OnMouseDown()とでもすればいいのかと思っていたのですが、コンパイルエラーでした。
何かすごい勘違いをしているような気もするのですが、お恥ずかしいことに何が悪いのかよくわかりません。ポインタだけでも良いので、どうすれば親にイベントを投げられるのかを教えてください。

Aベストアンサー

>Formに伝えてあげたいのです
この言葉がなにを意味しているのかはよくわかりませんが。

もし、Formオブジェクト上で定義したメソッドを
呼ぶようにしたいという話なら簡単です。

Formのクラスの中に、
PictureBox1という名前のPictureBox型のメンバー変数があったとします。
Formのクラスの中に、
PictureBox1_Click()というメソッドがあったとします。
初期処理のどこかで、
PictureBox1.OnClick +=
new ○○EventHandler(PictureBox1_Click);
の記述があれば、
PictureBox1からClickイベントが発生した時、
つまり、画面上でクリックされたときに、
Formクラスにある
PictureBox1_Click()メソッドが呼ばれます。
PictureBox1_Click()メソッドはFormクラスの
メソッドなので、その定義の中でのthisは
フォームオブジェクトそのものです。
そうやってフォームオブジェクトにアクセスできます。

なお、この

PictureBox1.OnClick +=
new ○○EventHandler(PictureBox1_Click);

のコードはVisual Studioのデザイナで
PictureBox1のイベントハンドラを登録すると、
InitialComponent()などというメソッドに
(名前ははっきり覚えてません)勝手に追加されます。
本当は別にどこでもよいです。
初期化処理のところで自分で手で追加しても同じことです。


ご質問ないようは、これでよろしかったでしょうか?

ちなみに、
pictureBox.Parent.OnMouseDown()
ですが、
pictureBox.Parentは
コントロールや、コンテナ型のようなものが
返却されるかと、そのオブジェクトは
OnMouseDownというメソッドは保有していないでしょう。
pictureBox.Parentが貴方が定義した
Formクラスの派生クラスということは、
PictureBoxにはわからないことです。


ご質問内容がいまいちよくわからないので、
想像で勝手に回答しましたが、
勘違いしているようであれば、すいません。

以上です。

>Formに伝えてあげたいのです
この言葉がなにを意味しているのかはよくわかりませんが。

もし、Formオブジェクト上で定義したメソッドを
呼ぶようにしたいという話なら簡単です。

Formのクラスの中に、
PictureBox1という名前のPictureBox型のメンバー変数があったとします。
Formのクラスの中に、
PictureBox1_Click()というメソッドがあったとします。
初期処理のどこかで、
PictureBox1.OnClick +=
new ○○EventHandler(PictureBox1_Click);
の記述があれば、
PictureBox1からClickイベントが...続きを読む

Qダイアログ内コントロールの位置取得について

いつもお世話になっております。

ダイアログ内に配置されているコントロールの位置の取得方法について
ご教授頂きたく質問させていただきました。

私が試したところGetWindowRect( コントロールハンドル, &rc );
とするとありえないぐらい大きな座標が帰ってきます。

上記の方法ではうまくいきません。
ご教授よろしくお願いいたします。

Aベストアンサー

>http://msdn.microsoft.com/ja-jp/library/cc364604.aspx
より
>クライアント座標はクライアント領域の左上端からの相対座標なので、左上端の座標は常に (0,0) となります。
となっているため
>GetClientRectでダイアログ内の相対位置を取れます。
は間違っていました。

>もしかしたら便利な関数が存在するのでしょうか?
ないのかなぁと。
かわりにこんな関数を作っておくとか。

BOOL GetDlgItemRect(HWND hDlg, int nIDDlgItem, RECT* rct)
{
  BOOL bRet = FALSE;
  HWND hWnd = GetDlgItem(hDlg, nIDDlgItem);
  if (hWnd != NULL)
  {
    bRet = GetWindowRect(hWnd, rct);
    {
      bRet = ScreenToClient(hDlg, rct);
    }
  }
  return bRet;
}

>http://msdn.microsoft.com/ja-jp/library/cc364604.aspx
より
>クライアント座標はクライアント領域の左上端からの相対座標なので、左上端の座標は常に (0,0) となります。
となっているため
>GetClientRectでダイアログ内の相対位置を取れます。
は間違っていました。

>もしかしたら便利な関数が存在するのでしょうか?
ないのかなぁと。
かわりにこんな関数を作っておくとか。

BOOL GetDlgItemRect(HWND hDlg, int nIDDlgItem, RECT* rct)
{
  BOOL bRet = FALSE;
  HWND hWnd = GetDlgIt...続きを読む

QCString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。
例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです

CString str = _T("ABC");
int siz = str.GetLength()+1;
LPCTSTR pszFName = new TCHAR[siz];
_tcscpy_s( pszFName, siz, str );

で変換するのですが
LPCTSTRからwchar_t*へ変換できませんとエラーがでます
_tcscpy_s()は使用できないのでしょうか

Aベストアンサー

>APIはCStdioFile の Open()でファイル名を与えるところ

APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566.aspx
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。

QCStringからchar*への型変換について教えてください。

以前の質問に

int型 → CString型/char型

がありましたが、

CString型をchar*型に変換する方法を
教えていただければありがたいです。

MSDNで「LPCTSTRキャスト」が説明されていましたが、
例が載ってないのでよくわかりませんでした。

よろしくお願いします。

Aベストアンサー

目的にもよりますが一時的にchar配列として使いたいならCString::GetBuffer()が利用できます。
char配列としての利用が終わったらCString::ReleaseBuffer()する必要がありますが。

直接CString内の文字列を扱う必要があるならCString::operator LPCTSTRで文字列ポインタが得られます。
ただし、CStringオブジェクトをいじると無効ポインタなる可能性があるので気をつけてください。

MSDNのMicrosoft Foundation Classリファレンス→CString→クラスメンバで確認してください。

Qメニューをグレー表示でなく非表示にするには?

環境はVisual C++ .netでリソースで作ったメニューをCMainFrameクラスで表示しないようにしようとしたのですが、なぜか選択できないグレー表示になってしまいます。気持ち悪いので、どなたかご存知の方教えていただけると嬉しいのですが。

CMainFrame::CMainFrame()
{
CMenu *pMainMenu;
CMenu *pSubMenu;
pMainMenu = GetMenu();
pSubMenu->RemoveMenu(ID_SELECT_DATA_FOLDER, MF_BYCOMMAND);
DrawMenuBar();

}

void CMainFrame::OnUpdateSelectDataFolder(CCmdUI *pCmdUI)
{
// TODO : ここにコマンド更新 UI ハンドラ コードを追加します。
pCmdUI->Enable(false);
}

Aベストアンサー

ウインドウが作成されてから削除するのではなく、リソースエディタで削除してしまった方が楽だと思います。


pCmdUI->Enable(false);
は削除するコマンドではなく、灰色にするコマンドです。

CMainFrame::OnCreate()
ここでRemoveMenuをすれば該当するメニューが削除されます。削除されるのはメインフレームのメニューです。
MDIなどでは子ウインドウがある場合は子ウインドウ(子フレーム)のメニューが表示されるので削除されていないように見えるのかもしれません。

子ウインドウのメニューをいじるにはいくつか方法があります。簡単な方法としては
CChildFrame::OnUpdateFrameMenu()
でGetParentFrame()->GetMenu()に対してRemoveMenuをかければ削除できます。

Q子フォームから親フォーム上のコントロールを操作したい

VC++.NET(C++/CLI)にてアプリケーションを開発しております。
親フォーム(FormParent)と子フォーム(FormChild)があり
子フォームから親フォーム上にあるtextBox1を操作したいのですがうまくいきません。

親フォームからはFormChild.hをインクルードすることで
親フォームのインスタンスを得て、子フォームを表示させているのですが
これに加えて子フォームからFormParent.hをインクルードすると循環参照(と言うのですか?)
となる為にエラーになってしまいます。

よろしくお願いします。

Aベストアンサー

VC++は使ってませんのでC/C++一般の問題としての回答です。

子フォームのヘッダファイル内で親ファイルのヘッダをインクルードしてませんか?
それなら、子フォームのソースファイル(*.cpp)内でインクルードするようにすればよいはずです。

ただ、子フォームから親フォームが見えるようにする(親フォームのヘッダをまるまるインクルードする)のはあまり綺麗な設計とは思えません。

子フォームにtextBoxを操作する関数を作り、引数としてtextBoxのポインタなり参照なりを渡すようにすれば、子フォームが親フォームのヘッダをインクルードする必要はなくなりますが。
※子フォームは当然textBoxの型は知っているという前提。

QCStringの中から数字だけの場合と、その他が含まれる場合を識別する方法

VC++6.0 MFCです。

CString についてなのですが、
  
キーボードで入力した文字(数字0~9、少数点.)を使って処理をしたいのですが、
キーボードで入力された文字の中にアルファベットなど、数字以外の文字が入っていた場合を
識別したいのですが、どのような方法がありますでしょうか?

下記のようにCString型 → doubl型にキャストして、数字だった場合は大小判定を
して処理するのですが、アルファベットなどがある場合 double mojiDO = 0 に
なってしまい、処理を初めてしまいます。

(1)数字とアルファベットなど数字以外の文字の混合はNG。(例"100gあ"はNG)
(2)符号付の数字NG("-0.98"はNG)

CString moji;//キーボード入力された文字が入っています。
double mojiDO = atof(moji);//CString型 → double型にキャスト
if (mojiDO >= 0 && mojiDO <= 500 ){
//処理A
}

else if{
//処理B
}

VC++6.0 MFCです。

CString についてなのですが、
  
キーボードで入力した文字(数字0~9、少数点.)を使って処理をしたいのですが、
キーボードで入力された文字の中にアルファベットなど、数字以外の文字が入っていた場合を
識別したいのですが、どのような方法がありますでしょうか?

下記のようにCString型 → doubl型にキャストして、数字だった場合は大小判定を
して処理するのですが、アルファベットなどがある場合 double mojiDO = 0 に
なってしまい、処理を初めてしまいます。

(1)...続きを読む

Aベストアンサー

CString moji;//キーボード入力された文字が入っています。
char *e;
double mojiDO = strtod(moji, &e);//CString型 → double型に変換
if (*e == '\0') {//条件(1)チェック
  if (mojiDO >= 0) {//条件(2)チェック
    if (mojiDO <= 500) {
      //処理A
    } else if(....) {
      //処理B
    }
  }
}

最低限こんな感じで動くのでは?
(2)については、他にも処理の仕方あると思いますけど…。
(先頭がハイフンだったら処理しない、とか)

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strtod.html

Qunsigned long long 型のフォーマット指定子

unsigned long long 型の変数の値を表示したいのですが、
フォーマット指定子は%ldですか?
よろしくおねがいします。

Aベストアンサー

規格上は、%llu のように ll を付けます。(unsigned long longなので、%lld ではなく %llu です。)
ただし、C99に準拠した処理系ではなく、単に独自拡張としてlong long型をサポートしている場合には、%Lu とか %qu とかになる場合もあります。場合によっては、long long型が存在する処理系でも、printf系関数で正しく書式化する方法が存在しないこともあり得ます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング