最小化について

[戻る]
ひろ 2006/10/06(金) 19:44:25
VC6.0 MFCで開発をしています.

初心者です.
コマンドを選択すると自身のダイアログが最小化するようにしたいのですが,上手くいきませ
ん.
初歩的ですが,自分のウインドウハンドルの取得の仕方もいまいち分かりません...

CWnd *pWnd = GetActiveWindow();
pWnd->m_hWnd;
CloseWindow();

としてコンパイルはとおるのですが,
コマンドを選択するとエラーがでます..
(デバックを行うとCloseWindowでひっかかり,m_hWndで式を評価できませんとエラー)

ご教授よろしくお願いします.
できればサンプルソースもお願い致します.

επιστημη 2006/10/06(金) 19:58:02
> pWnd->m_hWnd;

何ですかこれわ?

ひろ 2006/10/06(金) 20:12:23
正直よくわからないです..
サイトから探してサンプルソースをはりました...

自身のウインドウハンドルの取得の仕方を教えていただけないでしょうか?
お願いします.

ひろ 2006/10/06(金) 20:18:15
CWnd *pWnd = GetForegroundWindow();
::CloseWindow(pWnd->m_hWnd);

としたらできました.
でもこれはForegroundWindowを最小化してしまいます...
非アクティブでも自分のダイアログを最小化するために,
自分のウインドウハンドルを取得したいのですが,いまいちわかりません.
お願いします.

tetrapod 2006/10/06(金) 20:31:08
そのコードが書けるのに自分自身のハンドルが取れない?
うーん。多分 MFC の前に C++ の勉強が必要な気のせいがする。

自分自身のクラス内 (自クラスメンバ内) からなら単に m_hWnd
「自分自身のクラス内」って表現が理解できる?
this->m_hWnd の省略形であることが理解できる?
できないのであれば MFC はあとまわしにするほうが近道。

自分自身のクラス外からなら、まずは自分自身を特定する方法をみつけるのが先。

ひろ 2006/10/06(金) 20:54:16
そうだったんですか..
ありがとうございます!!
でも..
::CloseWindow(m_hWnd);

で試してみて,無反応だったのですが...

tetrapod 2006/10/06(金) 21:28:05
だから、そのコードをどこに書いたの?
自分自身って何のことかわかってる?
それを把握してない/できないのなら、先に C++ 自体の勉強が必須。

MFC/DlgBase なら例えば
void CTestDlg::OnMinimize() { ShowWindow(SW_MINIMIZE); }
で最小化ちゃんとされるよ。

強く非推奨だけど { ::CloseWindow(m_hWnd); } でもいくはず。

ひろ 2006/10/09(月) 19:13:34
CTestDlgを最小化したい場合,
CTestDlg::Mini() { ::CloseWindow(m_hWnd);}
とCTestDlg内で関数をつくり,利用したいところ(同じクラス内)でこの関数を用いるように
したのですが,無反応でした.
ShowWindow(SW_MINIMIZE); 
もためしてみたのですが無反応でした....

原因がよくわからないです..

ITO 2006/10/09(月) 19:39:36
> だから、そのコードをどこに書いたの?
> 自分自身って何のことかわかってる?
分っていないみたい。
> ShowWindow(SW_MINIMIZE); 
> もためしてみたのですが無反応でした....
CTestDlg内の「On」がつく関数内で実行するはずだけど、
何処でじっこうしているのかな?

tetrapod 2006/10/10(火) 08:25:32
えーと、とりあえず MFC でどのくらいプログラム経験がありますか?
void CTestDlg::OnMinimize() { ShowWindow(SW_MINIMIZE); }
って書かれたときに
「ああ、新しい[最小化]ボタンを作ってClassWizardするんだな」
と思いますか?思えましたか?やってますか?(してなさそう)

>利用したいところ(同じクラス内)でこの関数を用いるように
だからそれはどこ?まさかコンストラクタ内とか?
コンストラクタ内ではまだ m_hWnd が作られていませんからダメ
CWnd のメンバ関数を使うとそういう状況を検出してくれるけど
API 直接 ::ShowWindow を使うと検出されないのでバグがみつからないよ

・新しい[最小化]ボタンを追加しそのハンドラ内で ShowWindow(SW_MINIMIZE);
・OnInitDialog 内 CDialog::OnInitDialog 呼び出し後に同上
をすると最小化します(後者は最小化状態で起動)

最小化されないのは、最小化呼び出しのタイミングが
・早すぎるか(その後で通常表示に戻っている)
・呼ばれていないか
どっちかしかありえない。

PATIO 2006/10/10(火) 13:46:38
とりあえず、C++言語に関してはちゃんと知識はあると言う前提で良いのですか?
もしないなら、C++言語の勉強からした方が良いと思いますよ。
今使っているウインドウ制御に使っているMFCとライブラリはC++言語のライブラリなので
言語の知識がないと使いこなせません。
また、サンプルを見てウインドウの制御が仮に出来たとしても
恐らく応用が全く利かないと思います。

で、C++言語の知識はありますという話なら
MFCを使ってウインドウを表示したり、色々な制御を書けたりする基本的な方法を
MFCの入門書を使って勉強する事をお勧めします。
あと、何しているか分からないソースをコピーアンドペーストして動いても
実際には単に作業をしているだけで意味がありません。
ステップの一つ一つが何をしているのかを理解できて初めて意味があります。
なので、理解がきちんと進まないうちに先へ先へと進んでしまうのはお勧めできません。
退屈に感じる場合もあるでしょうが、一つ一つ確実に理解していく必要があります。

PATIO 2006/10/10(火) 13:49:33
もとい、

誤)
今使っているウインドウ制御に使っているMFCとライブラリはC++言語のライブラリなので

正)
今使っているウインドウ制御に使っているMFCと言うライブラリはC++言語のライブラリなので

ひろ 2006/10/10(火) 14:01:59
ご指摘ありがとうございます.
MFCの経験ははまだ2ヶ月程度です.
C++の知識もあまりないので,そこから学習していこうと思います.

最小化の件ですが,なんとか解決することができました.
ありがとうございました.

ひろ 2006/10/10(火) 14:12:49
[[解決]]
解決のチェック入れ忘れてました.
がんばって勉強します!

古いスレッドには追加発言できません。