MFCでプログラミングをしています。

SDIプログラムで、
メニューを選択すると「ある操作」をするように
作っています。

「ある操作」の中でループを回しており、
各ループ終了毎に更新結果を逐次描画させたいのですが、
うまく行きません。

ループの最後に

Invalidate(TRUE)

を書いてだめだったので、

pView->SetRedraw(TRUE);
pView->RedrawWindow();
pDoc->UpdateAllViews(NULL);

なども併用してみたのですが、
通過するだけで何もされません。

どなたかご教示よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

InvalidateRect(0,0,false); //画面全体に再描画を要求



似たようなプログラムを作っていたところです
HWNDを指定するところに0を渡しています
0はデスクトップ自体のHWNDを示しているので。

これで全てのウィンドウが再描画を開始します。
実証済みです

参考URL:http://www.ne.jp/asahi/nagoya/ahomaro/builder/cp …
    • good
    • 1

これはもしかすると、コマンドハンドラの中にループ処理がかかれているのではないでしょうか。


その場合、コマンドハンドラから抜けなければ Invalidate(TRUE) が発行した再描画メッセージを処理するチャンスがやってきません。

定期的にコマンドハンドラからメッセージループに処理を戻してやるか、別スレッドを作成すると簡単になります。 ユーザー インターフェイス スレッド を検索してみてください。
    • good
    • 0

性懲りも無くまた来ました。



API32では強制全画面アップデートを掛けたい場合、
以下の呪文?を唱えます。

hWnd = 該当ウィンドウのウィンドウハンドル

 InvalidateRect( hWnd, NULL, FALSE );
 UpdateWindow( hWnd );

多少のヒントになれば...

#実は全く意図と違っていたりして...m(_"_;m
    • good
    • 0

UpdateData(TRUE)かUpdateData(FALSE)だったと思います。

この回答への補足

ご回答ありがとうございます。

早速MSDNで検索してみたのですが、
updatedataは
ダイアログボックス用のコマンドのようです。

通常のビューの場合で、お心当たりあればお願いします。

補足日時:2001/08/01 17:39
    • good
    • 0

MFCのクラスだとどうやるのかな...



C(API及びAPI32)の場合では、Redraw用のレクトアングル情報を与え直してからUpdateするようにしていました。
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

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

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

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

Q画面の設定以外で文字の大きさを変更したい場合

こんばんは。WinXPを使っています。
画面のプロパティーから解像度を変更しても、文字の大きさが大きく感じます。WinXPの画面の設定から文字の大きさを変更する場合は解像度を変更しればいいと思うのですが、それでも小さくならない場合はどのようにして文字を小さくする事ができるでしょうか?

Aベストアンサー

解像度以外の手段では
画面のプロパティ→「デザイン」タブ→詳細設定
で、アクティブタイトルバー、パレットタイトル、ヒント、メッセージボックス、メニュー、選択項目、非アクティブタイトルバーの文字の大きさをポイント単位で変更できます。

ブラウザの文字の大きさなら、ブラウズの最中にマウスのスクロールボタンをCtrlボタンを押しながらグリグリすると5段階に変更できます。

ExcelやWordでしたら、ツール→オプション→全般タブから標準の文字の大きさをポイント単位で変更できます。

QMFCでSDIからダイアログの呼び出し

現在MFCでプログラムを作っているのですが、

SDIベースで作成しており、
MENUバーからMENUを選択したときに
新規(リソースに作成済み)のダイアログを
表示したいのですが、どのようにしたら
よろしいのでしょうか?

ヒントだけでもお願いいたします。

DoModal()とか、newを使ったら、良いのではないかという
見当だけはつけてみたのですが。

よろしくお願いいたします。

Aベストアンサー

1.まず作成したダイアログに対応したクラスを作成します。
  これをCSampleDlgとします。
  (クラスウィザードを使えば楽でしょう)
2.メニューが選択されたとき、以下の処理を入れればモーダルで
  ダイアログが表示されます。
  {
    CSampleDlg dlg;
    dlg.DoModal();
  }

Q「新しいウィンドウで開く」で開く画面の大きさの変更の仕方を教えて下さい。

 恐れ入ります。初歩的な質問で済みません。
検索結果などがたくさん出て、それら一つ一つを右クリックで「新しいウィンドウで開く」をクリックし表示される画面の大きさを変更するにはどうしたら良いのでしょうか?
 ちなみに今は画面の中央に小さく表示されるのですが、目一杯の大きさに変更したいのです。
どうか宜しくお願い致します。

Aベストアンサー

>検索結果などがたくさん出て

タブブラウザを使った方がいいかな~と思います。

IEだと仰る様に一つ一つを右クリックで「新しいウィンドウで開く」をクリック
するのも面倒ですし、下におろすのも面倒です。

タブブラウザなら、画面がウインドウだらけになるうっとうしさも無いですし、
ポップアップも制御できます。

画面の切り替えもタブをクリックするだけですし、たくさんひらいた
ページをまとめて閉じることもできます。

ご存知でしたら失礼しました。

QVC++2003SDIでMFCアプリ作成中です。

MFCで自動生成された画面だと、ステータスバーのチェックのON、OFFの切り替えができるようですが、ステータスバーの内容が自動で上書きされます。
ファイルオープンに成功した場合のみ更新したい場合はどうすればよろしいのでしょうか?
どこでステータスバーを更新しているかも教えていただけると嬉しいです。

Aベストアンサー

更新したいところで、

CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();

pMain->SetStatusbarMessage(_T("メッセージ"));

のようにします。CMainFrameが未定義というエラーが出る場合は、

#include "MainFrm.h"

で解消できるはずです。

QOutlookメールで、画面の文字の大きさを変更するには、どうしたらよ

Outlookメールで、画面の文字の大きさを変更するには、どうしたらよいのですか。

Aベストアンサー

画面の文字の大きさは、
[表示] メニュー → [現在のビュー] → [現在のビューの編集] →
[その他の設定] と [自動書式] の項目でそれぞれフォントの大きさが変更できます。
また、送信メールとテキスト形式の受信メールのフォントの大きさは、
[ツール] メニュー → [メール形式] タブ → [ひな形およびフォント] → [ひな形] タブでそれぞれ変更できます。

Qfor( ; ti >= 0; ti--, ci++)

C言語のループの表記のことです

for ( ; ti >= 0; ti- -, ci++)
この意味がわかりません
自分なりに解釈すると「;ti >= 0」から始まって「 ci++ 」を繰り返しながら「 ti- - 」になるまで繰り返す、というような感じです

「;ti >= 0」から始まるとはどういう意味でしょうか?
「 ti- - 」になるまでとは???

このソースが書かれているHPです
http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H12a2/pm11.html
52行目になります


わかる方がいらっしゃったら教えてください、お願いします

Aベストアンサー

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
for (i = 0; x[i] == 0; i++); // x[i] の先頭部分の0の要素を捨てて
for(; x[i] > 0; i++)
s += x[i]; // 「そのあと」の正の部分が継続する間足し込む
という場合、

また、再設定式は、

for(i = 0, j = 10; src[i] != 0; i++, j--)
dest[j] = src[i];
のように、二つ(以上)のものを変化させたい場合。
この例では、初期設定式も、コンマ演算子を使って、2つの初期化を行っています。

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
...続きを読む

Q最初に表示されるIEの画面の大きさは、変更可能?

こんにちは、みなさん。

インターネットを見る時に、最初に表示される、インターネットエクスプローラーの
画面の大きさは変更できますか??

変更できるなら、どんなやり方ですか??

ご存知の方、いらっしゃいましたら、宜しくお願いします。

Aベストアンサー

IEを起動して始めに表示される画面(ホームページ)の状態で操作します。
マウスを使って表示させたい大きさにIEの全体のウィンドウを変更します。
任意の大きさと位置が決まったら「Shiftキー」を押しながら閉じるボタンをクリックしてIEを終了させます。

※Shiftキーでうまくいかない場合はShiftキーの替わりにCtrlキーを使って試してみてください
※大きさを決めるときは、いつも始めに開いたページでウィドウの大きさ・位置を決めるのがコツです
※IEにい限らず、エクスプローラも同じ要領で変更できます

QVC++2003でSDIのMFCアプリ作成中です。

アイコン上にファイルをドロップし、ファイルをオープンする動作を実装し、
正常系は動作確認できました。
しかし、ファイルに読み込み制限などをかけていた場合、こちらのエラー処理に入る前に
Windows内部エラー処理に入ってしまうようで、「○○へのアクセスは拒否されました」と
ダイアログが表示されます。
デバッグで見て云ったところ、ProcessShellCommand(cmdInfo)の内部でエラーが発生し、
強制的におちているようですが、具体的にどこのクラス、メソッドでエラーを受け取って
いるのでしょうか?
オーバーライドしてエラー処理を自分で実装したいと考えています。

Aベストアンサー

ドキュメントクラスのOnOpenDocumentの中で実行する GetFileがNULLを返した場合にそのMesseageBoxを表示しているようです

アプリ側のドキュメントクラスに OnOpenDocumentを作成しておいて

BOOL CXXXDocument::OnOpenDocument( LPCTSTR lpszPathName )
{
  CFileException fe;
  CFile* pFile = NULL;
  pFile = GetFile( lpszPathName, CFile::modeRead, &fe );
  if ( pFile ) {
    // 正常に開けたので CDocumentで開けるようにココでは閉じる
    pFile->Close();
  } else {
    // ここでエラー処理をする
    return FALSE;    
  }
  return CDocument::OnOpenDocument(lpszPathName );
}

といった具合でいいように思います

ドキュメントクラスのOnOpenDocumentの中で実行する GetFileがNULLを返した場合にそのMesseageBoxを表示しているようです

アプリ側のドキュメントクラスに OnOpenDocumentを作成しておいて

BOOL CXXXDocument::OnOpenDocument( LPCTSTR lpszPathName )
{
  CFileException fe;
  CFile* pFile = NULL;
  pFile = GetFile( lpszPathName, CFile::modeRead, &fe );
  if ( pFile ) {
    // 正常に開けたので CDocumentで開けるようにココでは閉じる
    pFile->Close();
  } else {
    //...続きを読む

Qようこそ画面アイコン大きさ変更

ようこそ画面でアイコンの大きさを変更したいのですが、どのようにしたらよいでしょうか、
ちなみに以下のレジストリー変更ではダメでした。
HKE_CURRENT_USER→desktoptop→logpixelsで数値の値を変える

Aベストアンサー

変えられないと思います。

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。


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

人気Q&Aランキング

おすすめ情報