LRESULT CALLBACK WndProc(
HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){

PAINTSTRUCT ps;
HDC hdc;

switch(msg){
case WM_KEYDOWN:
 if( wParam == VK_ESCAPE ){
  hdc = BeginPaint(hWnd, &ps);
  TextOut(hdc,0,0,str,strlen(str));
  EndPaint(hWnd, &ps);
 }
 break;
case WM_PAINT:
 break;

エスケープキーで文字表示をやりたいけど
TextOut( ) が動作していないみたいでした。

switch(msg){
case WM_KEYDOWN:
 if( wParam == VK_ESCAPE ){
  hdc = BeginPaint(hWnd, &ps);
  TextOut(hdc,0,0,str,strlen(str));
  EndPaint(hWnd, &ps);
 }
 break;
case WM_PAINT:
 hdc = BeginPaint(hWnd, &ps);
 TextOut(hdc,0,0,str,strlen(str));
 EndPaint(hWnd, &ps);
 break;

とすると、常に文字が表示されたから、やっぱり
case WM_KEYDOWN: の中の TextOut( ) が
動作していないんだと思いました。
TextOut( ) は case WM_PAINT: からのつながりが
ある場合でないと実行されないんですか?
ソースのおかしいところがあったら教えてください。

A 回答 (3件)

BeginPaint(),EndPaint() が使えるのは WM_PAINT メッセージの時だけですよ。

それ以外の時には GetDC() と ReleaseDC()を使わないとなりません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
そんなことはないだろうと思っていたのに
case WM_PAINT でしか使えなかったんですね。

お礼日時:2001/12/09 00:18

> InvalidateRect(hWnd,NULL,TRUE);


> で、なぜか
> case WM_PAINT:
> が動作しました。

「なぜか」ではなく、InvalidateRect() が、そういう目的で使うために用意されて
いる API だから、です。別の質問であった ValidateRect() の逆ですね。

では、頑張って下さい。
    • good
    • 0
この回答へのお礼

InvalidateRect(hWnd,NULL,TRUE);
UINT に WM_PAINT を代入。

ValidateRect(hWnd,NULL);
UINT から WM_PAINT を消す。

という感じで覚えておくことにしました。
ありがとうございます。

お礼日時:2001/12/10 21:17

> エスケープキーで文字表示をやりたいけど



こういう時には、キーが押されたときに文字表示をするように作るのではなく、
再描画を促すように作る方が良いです。

InvalidateRect() だったかな。

このソースで描画されない理由は、No.1 の回答の通りです。
    • good
    • 0
この回答へのお礼

InvalidateRect(hWnd,NULL,TRUE);
で、なぜか
case WM_PAINT:
が動作しました。
ありがとうございます。

お礼日時:2001/12/09 13:43

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

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

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

Qdc.TextOut(0 ,0 , *str) ;について

環境 WIN98 VC++6.0 MFC にて

パターンBはOKですが、パターンAだと不正な処理で落ちてしまいます。

どうしてなのかお教えください。

void CFffView::OnPaint()
{
CPaintDC dc(this);
//パターンA
CString* str ;
str = (CString*)("999");
dc.TextOut(0 ,0 , *str) ;

//パターンB
CString aaa ;
aaa = (CString)("999");
dc.TextOut(0 ,0 , aaa) ;
}

Aベストアンサー

両方ダメ。
Aのパターンで動くのは、たまたま。

CString aaa ;
aaa = "999";
dc.TextOut(0 ,0 , aaa) ;

これで十分。

あえてキャストするんだったら、
CString aaa ;
aaa = (LPCSTR)"999";
dc.TextOut(0 ,0 , aaa) ;


aaa=のところでは、ただの代入が行われているわけではありません。
オーバーロードされたオペレータが呼ばれています。


>str = (CString*)m_array.GetAt(i) ;

これは、m_arrayの要素にCString*を入れていて、初めて成り立つ式です。
値をいれているところと、m_arrayの宣言を確認してください。

str = (CString*)("999");
も、
aaa = (CString)("999");
も、リテラル文字列をつっこもうとしています。
リテラル文字列とCStringはまったく別物です。

QWM_CHAR or WM_KEYDOWN の「wParam」について

よくわかっていないのですが、

switch (message)
{
case WM_CHAR:
というところで、wParamから、文字の情報取得して、
HDC宣言して、TextOut関数使用…、の途中で、
wParamの文字情報は、どのようにすれば
TextOut関数に渡せるのでしょうか?
Visual C++を勉強したてで、勉強の成果をと思い、
テキストエディタを作ってみたいと思ったのですが、
さて、どうしたらよいのでしょうか?
エラー内容は、unsigned int → const char *
にできません、ということなのですが、
じゃぁ、型の変換の仕方は?という感じです。
初心者なので、簡単な例をつけて説明してくださると助かります。よろしくお願いします。

Aベストアンサー

TextOut(~, (char*)wParam, ~);

と、char*型に型変換すると良い気がします。

--
TextOut関数の宣言、

TextOut(~, (const char*)szText, ~);

のconstキーワードは、
「TextOut関数に渡したwParamの値をTextOut関数の内部で書き換えることはありませんので安心してね。」
という意味ですので、

unsigned int
long double

などの2つの単語で宣言される「型」とは意味合いが異なります。
ヘルプの説明ですと釈然としませんが、参考URLなどを読んでみてください。

プログラマの正体!? - 誰が為にconst
http://www.asahi-net.or.jp/~vx2t-andu/lets/20020203.html

参考URL:http://www.asahi-net.or.jp/~vx2t-andu/lets/20020203.html

QhDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWn

hDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWnd)の違いについて

表題について,お伺いします。
ビットマップをダイアログに表示するソースコードを
書いてますが,参考書やさまざまなHPでは,
ウィンドウハンドルをゲットする際に

hDC=::GetDC(m_hWnd) ○
↑と書かれております。

hDC=GetDC(m_hWnd)  ×
↑はなぜだめなのでしょう。

 ●このスコープ演算子::は何の為につけているのですか?

::が無いとエラーになるので必要みたいですが・・

Aベストアンサー

どういうエラー(リンクエラー、コンパイルエラー)なのかがわからないので、
あくまで憶測ですが、
Windows.hで定義されているGetDC()の他に、
別のスコープに(例えばクラスのメソッドとして)、
GetDC()が定義されているのではないでしょうか?

上記の状態でスコープ演算子がないときには、
同じクラス(スコープ)にあるGetDC()を先に呼ぶことになるので、
目的のWindows.hのGetDC()を呼ぶことができないのだと思います。

参考URL:http://wisdom.sakura.ne.jp/programming/cpp/cpp7.html

QダイアログのWM_KEYDOWNで処理を実行したい

現在、VC++6を用いて、MFC を使わずにアプリケーションを作っている初心者です。
最終的にはWIN_CEハンディーターミナルで動作させる予定です。

ダイアログにフォーカスがある状態で、"↓"キー入力があった場合に処理を行いたいのですが、
ダイアログ及び親ウインドウにWM_KEYDOWNが発生していないみたいなのです。
(SPY++にて確認しました。)

DialogBox、CreateDialogの両方でやってみたのですがうまくいきません。
なにか良い方法はありますか?
よろしくお願いします。

Aベストアンサー

詳しくないのでトッケンハッケンかもです。

IsDialogMessage関数は使ってますか?
この関数、タブキーが押されるとフォーカスを移したり、
[↓]キーが押されると次のコントロールを選択してくれたり
するっぽいんですが。

リンク先はMSDNのIsDialogMessageのところです。

参考URL:http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_isdialogmessage.htm

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む


人気Q&Aランキング

おすすめ情報