SDIでメニュー欄に「チェック」を付けると文字を表示させるものを作成しました。
「チェック」をつけ、画面に文字を表示した後に新規作成ボタンを押すと、画面はクリア
され、メニューのチェックマークも消えます。その後、チェックマークがメニューに付か
なくなってしまいました・・。なぜ?
UPDATE_COMMAND_UI を使い新規作成の場合はチェックマークを消します。
void CVcmenu3View::OnUpdateFileNew(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(flgDog=0);
pCmdUI->SetCheck(flgCat=0);
}
このように新規作成した後、メニューバーにチェックマークが付かなくなりました・・。
チェックマークは付かないものの、文字は表示します・・。どうやったら、新規作成ボタ
ンを押した後もチェックマークがつくのでしょうか?
pCmdUI->SetCheck(flgDog==0);
の間違いですか?
pCmdUI->SetCheck(flgDog=0);
これだと、SetCheck(0)ということなのでチェックはつきません。
引数を0以外にすれば、チェックできるはずです。
ごめんなさい。質問の書き方が悪かったかもしれません。
初期化の際に下記のコマンドを使用しました。
void CVcmenu3View::OnUpdateFileNew(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(flgDog=0);
}
これを行うと新規作成を行った際に文字表示がクリアされると同時にチェックもクリアさ
れます。問題はこの後です。この後、新たにDogやCatを選ぶと文字は表示されるのです
が、メニューにチェックマークが表示されないのです。
> これを行うと新規作成を行った際に文字表示がクリアされると同時にチェックもクリアさ
> れます。問題はこの後です。この後、新たにDogやCatを選ぶと文字は表示されるのです
> が、メニューにチェックマークが表示されないのです。
あなたのソースは常にflgDog(とflgCat)をクリアし、
常にチェックを消すようになっています。
この関数が呼ばれるタイミングはわかりますか?
呼ばれるタイミング・・・?
私あまりにも初心者で、どう説明して良いのかわからないので、コードをおきますね。
申し訳ありません。
void CVcmenu3View::OnMenuitemDog()
{
// TODO: Add your command handler code here
CClientDC mydc(this);
if(flgDog==0)
{
mydc. TextOut(100,200, );
mydc. TextOut(100,100,Won Won);
flgCat=0;
}
else
mydc. TextOut(100,100, );
flgDog = !flgDog;
}
void CVcmenu3View::OnMenuitemCat()
{
CClientDC mydc(this);
if(flgCat==0)
{
mydc. TextOut(100,100, );
mydc. TextOut(100,200,Miao Miao);
flgDog=0;
}
else
mydc. TextOut(100,200, );
flgCat = !flgCat;
}
void CVcmenu3View::OnUpdateMenuitemDog(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(flgDog);
}
void CVcmenu3View::OnUpdateMenuitemCat(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(flgCat);
}
void CVcmenu3View::OnUpdateFileNew(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(flgDog=0);
pCmdUI->SetCheck(flgCat=0);
}
わかりづらくて、ごめんなさい・・。
OnUpdateFileNewは、クラスウィザードでUPDATE_COMMAND_UIを処理する関数を作成させたの
ですよね?
この関数に TRACE(OnUpdateFileNew\n); を追加して、いつ呼ばれているか確認してくださ
い。
プルダウンが表示するたびに呼ばれていると思います。
もしかして、初期化の処理のつもりで書いているなら、書く場所が間違ってます。
次に、この関数が呼ばれたら何が起こるかですが、先ほども書いたように、
flgDogとflgCatに0を代入して、(defaultなら)メニューの「新規作成」を無効にします。
はにほさんの意図とは違うのではありませんか?
とにかく、関数内にTRACEを追加して確認してください。
(TRACEの使い方がわからないならヘルプを見てね)
初期化処理のつもりで書いてました。
ってことは書く場所が違うってことですね。
どこに書けばよいのでしょうか?
私の会社、メモリーをケチってるのでHELPが入ってないんですよ・・。
TRACEの使い方は今探してます。はぁ・・。
SDIなら、CHogeDocument::OnNewDocument()ですかね。
flgDog=0;flgCat=0;だけで結構です。
ヘルプもなしに開発するなど無謀もいいとこ。
ヘルプすら読まずに質問するのも問題です。(言い訳も御詫びも不要です)
http://www.microsoft.com/japan/msdn/library/default.asp