TextOut

[戻る]
初心者娘 [E-Mail] 2005/06/28(火) 13:33:52
前にも質問したのですが また同じ箇所で悩んでしまったので・・・。
 
TCHAR *Msg;

省略

Msg = _T("2番目の文字挿入");
             TextOut(hdc,1,20,Msg,lstrlen(Msg));
Msg = _T("3番目の文字列です");
          SetTextColor(hdc,RGB(255,0,255));
          TextOut(hdc,100,40,Msg,lstrlen(Msg));

エラー  ・・・・・・・・・
C:\Program Files\Microsoft eMbedded C++ 4.0\Common\EVC\MyProjects\string\string.
cpp(196) : error C2065: 'TextOut' : undeclared identifier

環境 Embedded Visual C++4.0
プロジェクトはWCE Pocket PC 2003 Application
WndProc の case WM_PAINTに書いています。

よく pDC-> TextOut(ほにゃらら) の pDC-> っていうのは
他のクラス?から値を持ってくるときだけですよね?
初心者ですいません

YuO [E-Mail] 2005/06/28(火) 14:09:44
Windows CEにTextOutがないだけでは?
http://msdn.microsoft.com/library/en-us/wcefonts/html/ceconfontsfunctions.asp

かわりにExtTextOutが使えるかもしれません。
http://msdn.microsoft.com/library/en-us/wcefonts/html/ceconexttextout.asp


> よく pDC-> TextOut(ほにゃらら) の pDC-> っていうのは
> 他のクラス?から値を持ってくるときだけですよね?

TextOutが,pDCというポインタによって参照される型(静的型)のメンバ関数の場合に利用
します。
# Cの用語「参照型」を使おうと思ったけど,混乱するのでやめた……。

maxwell 2005/06/28(火) 14:11:19
eMbedded Visual C++4.0ではTextOutはサポートされていないはずです。
ExtTextOutやDrawTextを使って文字を書きましょう。

他にも使えない関数は多くあります。
eMbedded VC++4.0のヘルプから"CDC"を検索してみてください。

初心者娘 [E-Mail] 2005/06/28(火) 18:00:38
CDC参照してみました^^
一応少しはわかったのですが
@virtual BOOL ExtTextOut ( 
int x, 
int y, 
UINT nOptions, 
LPCRECT lpRect, 
LPCTSTR lpszString, 
UINT nCount, 
LPINT lpDxWidths );

ABOOL ExtTextOut ( 
int x, 
int y, 
UINT nOptions, 
LPCRECT lpRect, 
const CString& str, 
LPINT lpDxWidths );

@Aの違いはなんでしょうか・・・
できれば例が欲しいです><
もし暇でしたらお願いします。
私もその間勉強してます

初心者娘 [E-Mail] 2005/06/28(火) 18:12:48
一応下のようにしたらできたのですけど 使い方は合ってますか?
ExtTextOut(hdc,0, 40, NULL,&rt,Msg,wcslen(Msg), NULL);

この場合 &rtってなんですか?

あと前のスレで書いた質問も一応お願いします><

YuO [E-Mail] 2005/06/28(火) 18:16:06
CDC::ExtTextOut
http://msdn.microsoft.com/library/en-us/dv_wcemfc4/html/
aflrfcdccolcolexttextout.asp

文字列として,
・TCHAR配列の先頭へのポインタと文字数
・MFCが用意したCString
のどちらを使うか,という違いです。
# って,APIではなかったの?

初心者娘 [E-Mail] 2005/06/28(火) 18:28:13
# って,APIってどういう事ですか?

シャノン 2005/06/28(火) 20:58:14
> # って,APIってどういう事ですか?

一般に、Win32 API のことを指します。
コイツのことです

http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/wcefonts/html/ceconExtTextOut.asp

対して、CDC::ExtTextOut は、Win32 API を使いやすいように加工したライブラリで、
API に対して MFC と言います。

これかな

http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/wcemfc/htm/cdc_23.asp

初心者娘 [E-Mail] 2005/06/28(火) 21:30:05
なるほどー、わかりました。ありがとうございますm(__)m

質問ばかりですいませんが また質問いいですか??

環境はeMbedded Visual C++4.0で 
プログラムに 

case WM_LBUTTONDOWN: 
hdc = GetDC(hWnd); 
Rectangle(hdc,LOWORD(lParam),HIWORD(lParam),LOWORD(lParam)+11,HIWORD(lParam)+11)
; 
ReleaseDC(hWnd,hdc); 

break; 
case WM_RBUTTONDOWN: 
int Ret; 
Ret = MessageBox(hWnd,_T("消す??"),_T("質問"),MB_YESNO); 
if(Ret == IDYES) 
RedrawWindow(hWnd,NULL,NULL,RDW_ERASE | RDW_INVALIDATE); 

break; 

と書いたんです。実行できるんですけど、メッセージボックスを表示して 
消さない(NO)を選択したらメッセージボックスが表示されていた箇所は 
消さないにしていたのに消えてしまうんです。 
どうしたらよいでしょうか。

あとマウスが左クリックして、マウスが動いたらそれによって
Rectangle(hdc,x,y,x2,y2);
の感じで四角の大きさを変えようとしたんですが、
画像が重なってしまって・・・。
最後に左クリックを離した時の大きさだけを表示させたいにの
奇跡(四角の)が全部表示されてしまうのです。
どうしたらよいでしょう。
長々と申し訳ありません。。。

PATIO 2005/06/29(水) 10:49:13
Windowsのプログラミングの入門本を読まれた方が良いように感じます。
特にWin32 APIを使ったプログラミングについて勉強された方がいいでしょう。

ウインドウへの描画は基本的にWM_PAINTメッセージに対する処理として
行わないといけません。
今回のようにウインドウの上に別のウインドウがのっかった時に
下のウインドウの再描画を行うためにOSがそのウインドウにWM_PAINTを送ります。
ウインドウ側はWM_PAINTが来たら、そのときに描画すべきものを全て描画します。
これで上のウインドウが無くなった後のウインドウの復旧が出来るわけです。
WM_PAINTは、そのウインドウが行うべき全ての描画を行えるようにプログラムされている
必要があります。
この辺は、Win32 APIのプログラミングに関する本をじっくり読めば出てきます。
これ以外にもWindowsでプログラミングするためにはウインドウメッセージの流れを
きちんと把握してどんな時にどんなウインドウメッセージが来るのかを理解しておく
必要があります。
一度に覚える事は難しいかもしれませんが、必要な知識ですので少しずつでも勉強して
理解するようにしてください。

PATIO 2005/06/29(水) 10:56:18
追伸

WM_LBUTTONDOWN等で描画してはいけないという意味ではありません。
同じ描画をWM_PAINTでも出来るようにしておかないとウインドウの再描画で
元の状態に戻せないということです。
描画された内容は上に他のウインドウがのったり、最小化してしまったりすれば、
消えてなくなります。
WM_PAINTに書いてあった内容をそっくり書きなおせるだけのコードがあれば
再描画で元に戻す事は出来ますが、再描画できなければ消えてしまうということです。
もう一度再描画しないといけないということは、再描画に必要な情報は全て保持して
おかなくてはならないという事になります。
描画に使った座標点をそのまま捨ててしまっているのであれば、
もう一度同じものを描画する事は不可能ですよね。
そうなると座標点は全て何らかの形で保持する必要があるという事になります。

Windows特有の処理の流れというのがありますから
コンソールプログラムのようにただ流れを追ってプログラムをすれば、
何とかなるというものではありません。
まずはWindows特有の処理の流れを本で勉強すべきですね。

初心者娘 [E-Mail] 2005/06/29(水) 17:35:14
そうですか・・・。
わかりました。
もっと勉強して解決してみせます。
ありがとうございます。

初心者娘 [E-Mail] 2005/07/01(金) 10:08:13
二日程ずっと勉強してたのですが。
流れとしては大体掴めたのですが、実際にどうしたらよいのかが
今一です。
ヒントだけでもいただけませんか?

PATIO 2005/07/06(水) 15:55:29
WM_LBUTTONDOWNで描画してしまうと
クライアント領域を一度塗り潰して消してしまう処理が動きません。
この為、前の描画結果が残ったまま、その上に描画しているだけの状態になっています。

通常の流れでいうなら矩形の描画処理はWM_PAINTで行うようにします。
WM_LBUTTONDOWNでは、WM_PAINTの描画処理でRectangle呼び出すために必要な座標値の
保持を行って、Invalidate関数でウインドウを無効化します。
無効化するとOSからWM_PAINTか飛んできますので、WM_LBUTTONDOWNで保持しておいた
座標値を使って描画を行います。
無効化されたときにデフォルトの処理でクライアント領域を背景色で消すという処理が
勝手に動くのでWM_PAINT内で描画した結果のみがウインドウに表示されるはずです。

描画処理が全てWM_PAINTの中に入っていれば、最小化されても他のウインドウが重なっても
再描画時にWM_PAINTが呼ばれるので表示が再現されます。

ちなみに以下のコードでは目的にしている動作はしないと思います。
Rectangle(hdc,LOWORD(lParam),HIWORD(lParam),LOWORD(lParam)+11,HIWORD(lParam)+11)
;
これだと、高さ11ピクセル、幅11ピクセルの矩形が左クリックした位置に動くだけで
矩形のサイズは変わらないはずです。
矩形のサイズを変えたいのであれば、一点目のクリックと二点目のクリックを判別して
処理しないと出来ないと思うのですけれど。

PATIO 2005/07/06(水) 15:59:22
あと、一言だけ言わせてもらうと一度に全てを解決しようとしないで
一つ一つ別々に解決するようにした方が良いです。
基礎知識が十分あって人に聞かなくてもわかるレベルであれば、
複数の問題を一度に考えることも出来ると思うのですが、
基礎知識の足りない状態ではかえって混乱するだけです。
問題を分離して一つずつ片付けるようにしましょう。

初心者娘 [E-Mail] 2005/07/08(金) 12:04:09
わかりました。
いろいろありがとうございます。
一歩一歩段階を踏んでみます。
頑張ってみます

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