2げっとできた?
5 :
デフォルトの名無しさん :02/08/06 02:33
スレ立てお疲れです。 CAsyncSoketクラスの派生クラスを使って Chatプログラムを作りたいんですが上手くいきません。 具体的には m_SockCreate();//ソケットの作成 if(0==m_Sock.Connect((LPCTSTR)dlg.m_strIP,46820)&&WSAEWOULDBLOCK!=m_Sock.GetLastError()) {//接続エラー MessageBox("接続エラーが発生しました",); return; } 切断ボタン { m_Sock.Close();//ソケットの削除 } //接続した void CConnectSock::OnConnect(int nErrorCode) { m_pWnd->MessageBox("接続しました"); CAsyncSocket::OnConnect(nErrorCode); } //接続された void CConnectSock::OnAccept(int nErrorCode) { m_pWnd->MessageBox("接続されました"); CAsyncSocket::OnAccept(nErrorCode); } //切断された void CConnectSock::OnClose(int nErrorCode) { m_pWnd->MessageBox("切断されました"); } この中でMessageBox("切断されました"); だけがどういじくっても表示されません。 どうやったら切断時にCConnectSock::OnCloseが呼ばれるのでしょうか? ほんと困ってるので教えてもらえないでしょうか。
6 :
デフォルトの名無しさん :02/08/06 02:44
スレ立ておつかれです。 CListCtrlで、アイテムごと、もしくはサブアイテムごとにテキストの色 変えることってできないでしょうか。ライブラリを読む限りじゃ既存の機能 では無理っぽいのはわかりましたが、もし無理に実現するとすればどんな方 法が考えられるでしょうか。どなたかレスお願いいたします。
すんません、某ページで見つかり解決しました。 お邪魔しました
OnCloseって、向こうがCloseしたときに呼ばれるんでなかったかいな?
>8 そのとおりです。 ですが、なぜか切断されても呼ばれなくて困っています。 クライアントのClose()関数が呼ばれたら サーバーのOnCloseが呼ばれるって流れですよね? 呼ばれなくて困ってます。。
10 :
デフォルトの名無しさん :02/08/06 19:16
>>9 その前に接続されてないとおもうぞ
Acceptしてねーし
CStringを元にした(・∀・)イイ!! 派生クラスの紹介キボンヌ。
13 :
デフォルトの名無しさん :02/08/07 02:07
(´-`).。oO(「脱げ」ってどういう意味だろう・・・
)
(´-`).。oO(言うまでもなく脱衣げーむだろう…)
16 :
デフォルトの名無しさん :02/08/07 11:02
LoadBitmapの反対の処理を行なう関数はありませんか? ビットマップハンドルを名前を付けて保存したいのですが。
17 :
デフォルトの名無しさん :02/08/07 14:21
ダイアログベースで作ってるのですが エクスプローラみたいなTreeViewを 表示したいのですがどうやったらいいのでしょうか? SHBrowseForFolderの画面みたいなプログラムです。 それを画面に常に表示させておいて処理の出力先を 選択できる形にしたいのですが。 解凍ツールのLhasaみたいなやつを作りたいんです。 あれは、CTreeViewを使って自前で書くべきなんでしょうか? そう考えると、展開される瞬間にに二つ下の階層を読みに行って、 一つしたのアイテムに挿入するという形しか思い浮かびません。 これだと、重いので根本的に間違ってる気がします。 Lhasaを見てみるとカスタマイズされた SHBrowseForFolderのようにも見えます。 こっちで考えてみると、メインウィンドウが SW_HIDEなウィンドウの子ウィンドウで実装する 形になるのですか? 設計段階から、検討もつかず困ってます。 アドバイスいただきたいのですが。 よろしくお願いします。
18 :
初心者 ◆jXxeRXqw :02/08/07 21:22
ダイアログ形式で ドロップダウン形式のコンボボックスを作ったのですが 右にある「▼」を押してもドロップダウンが表示されません。 項目を選択した状態で↓ボタンを押すと 項目は切り替わるのですが・・・・ 何か、ヒントだけでもお願いします。
>>18 コソボボックスの縦のサイズをもっと大きくしろよヴォケ
>18 コンボボックスはリソースエディタで 配置&サイズを決める時ちょっと他のと違って、 まず、配置する。 これは他のと同じ。 その後、ドロップダウンが表示されている状態の配置を設定。 つまり。1:通常状態 2:開いてる状態 の二つの配置が必要。 て言っても、二つ目は一つ目のやつの高さを ドラッグして、長くするだけなんだけど。 ってわかりにくいだろうから一生懸命書いてたけど、 >19が一言で済ましてくれたw ちょっと悲しい。
>>19 ,20
できました。
どうもありがとうございました。
そりゃよかった。 確かに案外分かりにくいかもしれん。 この勢いのまま、どなたか >17にも愛の手を。。 どうぞよろしくお願いします。
23 :
デフォルトの名無しさん :02/08/07 22:23
えっと、初めての質問なのですが、 CMenuのTrackPopupMenuを用いて別のアプリケーション上にメニューを 表示するのですが、そのアプリケーションがアクティブな場合に メニューへキーボードからの入力できないのですが何とかならないでしょうか? 自分のウィンドウを先にアクティブにすれば一応使えるのですけれど、 閉じたあと元のアプリケーションがアクティブにならないので、できれば アクティブ化しないで入力だけ欲しいのです。
>24 ありがとうございます。 待ったかいがありました。 見るからに私の希望どおりのことが 書いてあると思われる内容です。 ただ、英語なんですね。。 高校当時英語20点という点数を打ち出した私の 頭じゃつらい。。 でもここで「日本語のページでないでしょうか?」 っていうのも甘えてるみたいなんでやめときます。 辞書片手にがんばってみます。 ありがとうござました。
27 :
デフォルトの名無しさん :02/08/08 23:41
プログラム中に音を再生したいとき、どうすればいいのでしょうか? PlaySound("SystemStart", NULL, SND_ALIAS_ID); このように試してみても音が出ないのですが理由がわかりません。 ただwavファイルを再生したいだけなのですが、 普通はplaysound以外の他の方法を使うのでしょうか? よろしくお願いします。
28 :
デフォルトの名無しさん :02/08/09 00:30
ごめん、VCの操作に関してです。 英語のリソース作ったんだけど、うまくリンクできません。 何か特別な設定が必要ですか? 教えてください。 おながいします。
29 :
デフォルトの名無しさん :02/08/09 10:48
MFC拡張DLLを作成しているのですが、 エラーが出てコンパイルできずに困っています。 CString WINAPI GetDirectoryPath(); という関数と class AFX_EXT_CLASS CTest { 〜〜〜〜中略〜〜〜〜〜〜〜 public: CString GetDirectoryPath(); }; この両方の関数をエクスポートしようとするとエラーがでます。 .defファイルのGetDirectoryPath @?というのを コメントアウトすれば大丈夫ですが 前者の関数がエクスポートされません。 両方エクスポートするにはどうすればいいのでしょうか? 名前を変えるしかないのですか?
30 :
デフォルトの名無しさん :02/08/09 11:27
デフォルトライブラリのリスト自体の設定ってどこにありますか?
31 :
デフォルトの名無しさん :02/08/09 13:20
AfxMessageBox AfxGetApp Afxっていったい何を意味するんですか? 自分で Afx????みたいな関数作っても おかしくないですか? 動くとか動かないとかの基準じゃなくて。
はじめまして、プログラム若輩者です。 今、画像処理用のプログラムを勉強しています。 自作の画像処理用ソースファイルとヘッダファイルを MFCに追加して、CViewクラスから追加した自作のクラス内の メンバ関数にアクセスしたいのです。 この時、CViewクラスから自作クラスへのポインタ、もしくは オブジェクトを作ってアクセスしようとするとコンパイルでは エラー0なんですが、実際に実行すると 『内部エラーが発生しました』 と出てしまい、どうしたらよいか悩んでおります。 よろしかったら先輩方のアドバイスを頂けたらと思います。 どうかよろしくお願いします。
34 :
デフォルトの名無しさん :02/08/10 05:35
リストビューで レポート型 LVS_REPORTを指定すると普通は 一番左側の項目しかクリックできないと思いますが、 これを一行丸まるクリック可能にすることは出来ないでしょうか? 1 INTEL 75% 2 AMD 20% 3 VIA 5% . . みたいな感じで左側にはインデックスだけついてるので そこだけクリック可能というのではちょっと変になってしまうんです。 それともこういう場合はリストビューじゃ無い方がいいんですかね? (数字に意味はないです。念のため(^^;)
>34 LVS_EX_FULLROWSELECT
>>31 確か Application Frameworks の略だ。
自分で Afx... は俺はちょっと違和感が。
>>27 >PlaySound("SystemStart", NULL, SND_ALIAS_ID);
うちも鳴らね.なんでだろう...?
(9xはこのフラグに対応していないと MSDNにあるが,2000でも鳴らぬ)
>>31 MFCのグローバル関数.名前がかぶらなければ自作関数にこのプレフィックス
つけてもかまわないが
>>36 の言うように違和感あると思う.
>35 ありがとうございます それで一行選択されるようになりました しかしもう一つ質問してよろしいでしょうか? リストビューの項目がダブルクリックされたときに その選択されたテキストを手に入れるようにしているのですが GetHotItem() だとカーソル位置で判断するようなので 行が反転されていても実際には文字の上にカーソルがないと 正常にどうさしません。 リストビューじゃなくて ListBoxのGetSelCurのような関数があればとおもったのですが・・ どうもそういうのが見当たらないです・・・
>39 ありがとうございます。 なんたかできました。 しかしヘルプがわかりずらいですねこの関数。 最初なにが書いてあるかわからずいろいろ試行錯誤してしまいました。 結局 GetNextItem(-1,LVI_SELECTED); で出来たのですが。
CListCtrl::GetFirstSelectedItemPosition があるが。
>41 なるほどそれでもできそうですね。 ありがとうございます。 しかしこの場合は 戻り値がGetNextSelectedItemで使うPOSITION のようなのでもう少し手間がかかるようです ところでMFC(っていうかC++)でperl風の正規表現 $string =~ /</</g; なんてのを使うときにはどうするのがベストなんでしょうか? (速度的にも手間的にも) Cでポインタをすすませながら一文字づつ文字列を直にいじるか それともperlインタプリタを使ってperl関数を呼び出す・・????
vc++で質問があるれす。私、初心者れす。 プロセスの優先度を変更するためにはどうしたらよろしいのでしょう? プロセス名までは取得できたのですが、変更はどうもうまくイカンのです。 先生方、よろしくどうぞ。
>43 正規表現ライブラリを組み込むのが面倒くさいときは、flex。
46 :
handleないぞ :02/08/12 13:20
C++ Win32 Tips100 という本p29でダイアログで WM_NCHITTEST ハンドルをクラスウィザードで追加するとあったのですが このハンドルはウィザードのどこ探しても見つかりません。 出てこないハンドルをMFCで追加できますか?
47 :
handleないぞ :02/08/12 13:23
ハンドルつうか,メッセージマップにWM_NCHITTEST がないんですよ
なぜ手動でメッセージマップに追加しないかなぁ……
49 :
デフォルトの名無しさん :02/08/12 14:01
>handleないぞ クラスウィザード→クラス情報タブ→詳細設定オプション→メッセージフィルタ が「ウィンドウ」になっていないのでは?
50 :
handleないぞ :02/08/12 14:09
>49 どうもです。メッセジフィルタが「ダイアログ」になってて「ウィンドウ」 ってのは無いんですが(?_?)最上位フレームというのにしてみたら旨く行きました。 >48 ハンドラ手動追加もやってみました。一応動くんですが書きこみは ソース内:BEGIN_MESSAGE_MAP ソース内:メッセージ ハンドラ ヘッダー内:// 生成されたメッセージ マップ関数 の3箇所でいいんですか? グレー表示のところなんかには触っちゃいけないもんだと思ってたんで。
51 :
デフォルトの名無しさん :02/08/12 14:43
メインAppのpublicにメンバ変数を宣言して、グローバル変数として使ってます。 CWinApp* pApp = AfxGetApp(); pApp->メンバ変数名 って別のクラスとかで使ってたんですが、なんか、8個以上になると、 急にわけわかんないエラーがでます。 XXXのメモリがXXXを参照しましたがXXXのメモリがreadになることはありませんでした。 ・・・とかっていうアレ。 最初エラーの原因がわかんなくて、バックアップ取っといた方で、組んでいったら、 どうも、メインAppのメンバが9個を超えると、いきなりそんなふうになるっぽいです。 でも、メンバ変数が増えるとエラーが出るなんてことあるの? 誰かおしえて〜・゚・(ノД`)・゚・。ウワアアアアアン
ヽ(`Д´)ノ
ケティィヽ(`Д´)ノクソゥもうコナィヨ!!
なんか宣言の位置変えたら治ったっぽい! メンバ変数の宣言の順番でエラーが出たり出なかったりするなんて・・・ ふしぎだ。やさしい人なんかおしえてよ〜T_T
>>55 親切なヒト発見!
しょっちゅうビルドしてるけどだめっぽいです。
なんか宣言は大丈夫でもアクセスすると例のエラーでます・・・ナゼダ?
もうネムイ・・ねよ。
ま、こういうのはソース醸せ?
58 :
デフォルトの名無しさん :02/08/13 05:00
finder.FindFile("*.txt"); で拡張子がtxtのファイルを取得できるけど 拡張子がhtmlもしくはtxtみたいにして指定することは出来ないのですか? 2回Findfileを呼び出してぐるぐるさすしかないのかなーー。
60 :
デフォルトの名無しさん :02/08/13 08:25
>>59 finder.FindFile("*.*");
if 拡張子が 'txt' 若しくわ 'html'ならってやれば
61 :
初心者 ◆76EfjdUc :02/08/13 13:59
62 :
デフォルトの名無しさん :02/08/13 15:34
Dialog の枠引っ張って大きさ変えられるようにできます? プロパティにはサイズ可変とか見つかりません。
どおおもです。読んでて気付いたんだが >プロパティにはサイズ可変 モロにあるわけですね。僕って本当にfusianasan.
>>62 単にサイズ変更可にするだけなら、境界線をサイズ変更枠(WS_THICKFRAME)
にすれば OK。右下にハンドル(?)を表示したいとなるとやはりcodeguru
参考にするのがよいと思う。
OnDraw内で、CListCtrlクラスのオブジェクトにSetItemCountで1以上の値を与えると、 デバッグVerでは問題ないのに、リリースVerだとOnDrawの処理を抜けた後、 ソース外で撃沈、異常終了(Access Violation)しちゃうんだけど、 何がいけなさそう? OnDrawが終わる直前にSetItemCountを使ってもダメだった。
>>66 OnDrawで描画以外のことをするなと小以下略
何か適当なメッセージをPostして、そのメッセージのハンドラで処理すれ。
68 :
デフォルトの名無しさん :02/08/14 03:21
オーナードローメニューのOnDrawItemで、 描画しているのですが、アイコンをDrawStateと DrawStateのプロージャ関数内でDrawIcoExを使用して描画しています。 DrawStateのフラグに、DSS_NORMALを指定したときはうまく描画されるのですが、 DSS_DISABLEDを指定した場合に、全く描画されません。 一応DrawIconExは成功しているようなのですが、 この場合どんな原因が考えられるでしょうか? 白く塗りつぶした上に描画しています。
3日悩んでいたのに、投稿後数分で解決しました(^-^;) DrawStateで描画する位置を指定せず(0,0)に、 プロージャ内で位置を指定していたため、位置がズレていたのが原因のようです。 しかし、なんでDSS_NORMALの場合だけ成功するんでしょうか…。
70 :
デフォルトの名無しさん :02/08/14 09:29
非アクティブ時にメニューを表示して、そのメニューをキーボードから操作は できませんか? メニューにSetFocusを使おうと思ってもHWNDの取得の方法がわからなくて、、、 (それ以前にメニューってウィンドウじゃない?)
>70 はっきりいって言ってることが よくわからんが、 >非アクティブ時に フックについて調べるとよい。 >HWNDの取得方法が FindWindowで間にあうならフックしなくてもいい。
>>71 レスthx.フックとか調べてみます。
ところでメニューのクラスって分かります?
クラス × ウィンドウクラス ○
>>72 メニューはウィンドウじゃないよ。
どうしてもメニューを表示したいならシステムフック。
OnPaint の dc(this) のハンドルはどうやって取得できますか? GetSafeHdc(),では「定義されてない」 CDC::GetSafeHdc(),では C:\Program Files\Microsoft Visual Studio\MyProjects\mc4\mc4Dlg.cpp(296) : error C2275: 'CDC' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。 怒られます
>75 質問の意図がよく分からないけど CPaintDC dc(this); HDC mpTest1 = dc.GetSafeHdc(); HDC mpTest2 = dc.m_hDC; とかではだめ?
>>74 メニューはウィンドウだよ。もっとも、ウィンドウハンドルが分かっても
どうしようもないけどね。ちなみに、ウィンドウクラス名は#32768だ。
>HDC mpTest1 = dc.GetSafeHdc(); ありがとう. クラスとメンバについてわかってなかった馬鹿な私でした.
>>67 回答ありがとう。
なるほど、OnDraw内から引っ越したら確かに異常終了はしなくなった。
が、別の症状が出るよーになってまた頭を悩ませることに……。ともかく感謝。
解決シタ━━━(゚∀゚)━━━ !!!と思ったのは何かの間違いだったらしく、 OnDraw外に置いても相変わらず同じパターンにハマる。 ただ、ひとつわかったことがあって、仮想リストビューを使ってるんだけど、 撃沈の直前の処理はOnGetdispinfo****関数が最終のようだということ。 デバッグVerではその後_AfxDispatchCmdMsgに処理が移り、case AfxSig_vNMHDRpl:に飛ぶ。 一方、リリースVerでは次のソースにたどり着く前に力尽きる。 つまり、CListCtrlオブジェクトでSetItemCountを使ってアイテム数を増やすと OnGetdispinfo****が呼び出され、以下撃沈、という図式の模様。
印刷機能を作っています。マップモードを変更したときに、印刷領域を 取得する方法がわかりません。どなたか教えてもらえませんか。 OnPrintの引数pInfoのメンバm_rectDrawが印刷領域を表してるのはわか るのですが、デバイス単位なんですよね・・・。本に書いてあったので OnPrepareDCのなかでSetMapModeとか呼んでみたのですがうまくいきません。 何がおかしいのでしょうか・・・
83 :
まじめな質問者。 :02/08/16 16:47
VC++6.0(MFC)、Win2000。 SDIでアプリを作ります。 モードレスダイアログを一つ表示したいのですが、 なんも考えずにあたりまえに(ヘルプに載ってるよーに)つくると モードレスダイアログはアプリケーション内で ZオーダTop位置固定に表示されちゃいます。 メインフレームのウィンドウがアクティブな時は そっちを上にしたいんですけど。 どうしたらよいのでしょう? 「すれ立てるまでもない質問はここで」で誘導されちゃった。
モードレスダイアログが後ろに行くというのは、 インターフェース設計としていかがなものだろうか。
なにか変ですか? ほかに標準的な実装がある、とか。
CreateDialogのhWndParentをHWND_DESKTOPにするとか。
>>86 ナイス!いけました!
ありがとうございました!!
またしても印刷で悩んでしまいました。 WYSIWYGではない印刷を行うとき、ページ数事前に調べにくいために、 OnPrepareDCでフラグを・・・といった説明をあちこちで読んだのですが、 結局印刷プレビューを正しく表示したり、印刷をするためにはどこか でページ数を設定しなくてはなりませんよね? OnPrintでは必要な情報がそろっているため、ページ数を確定できる のですがOnPrintでSetMaxPageを呼ぶと、印刷時には印刷ステータスダ イアログのページのカウントがキャンセルするまで無限にカウントされ てしまいます。 まったくSetMaxPageを呼ばないとプレビューも印刷も1ページ目のみ になってしまうし・・・。どうするのが一番よいのでしょう。どなたかア ドバイスお願いします。
90 :
デフォルトの名無しさん :02/08/18 15:56
他のアプリのウインドウスタイルを変更して常にトップ表示にすることは 可能ですか?
92 :
デフォルトの名無しさん :02/08/18 19:55
SPY++のウインド検索はどのようになってるのでしょうね〜 だれかご存じですか?
Advanced Windowsでも読めば少しは分るんでないのか
95 :
Melt-D :02/08/19 13:17
長くなると思うのですが、質問です。 ダイアログのエディットボックスから取った文字列を リストに表示する処理を行っています。 ・edit_dlgはCDialogの派生クラスのオブジェクトです。 ・m_listCtrlはCListCtrlクラスの派生クラスのオブジェクトです。 ・bufはchar型配列です <<問題点>> リストが正しく表示されません。 CListCtrl::InsertItemで設定した(LPCTSTR)edit_dlg.m_id_editは表示される。 CListCtrl::SetItemで設定した以下の文字列が表示されない。 既に設定してあるリストを編集する形でCListCtrl::SetItemTextを使った場合 更新はされる。 何か抜けているのがありましたらご指摘お願いします。 if( edit_dlg.DoModal() ) { LV_ITEMmyItem; myItem.mask = LVIF_TEXT; myItem.iItem = m_listCtrl.GetItemCount() + 1; myItem.iSubItem = 0; strcpy( buf, (LPCTSTR)edit_dlg.m_id_edit ); //m_id_editはCString型 myItem.pszText = buf; int iItem = m_listCtrl.InsertItem(&myItem); myItem.iSubItem = 1; myItem.mask = LVIF_TEXT; ZeroMemory( buf, sizeof( buf ) ); strcpy( buf, (LPCTSTR)edit_dlg.m_app_edit );m_app_editはCString型 myItem.pszText = buf; m_listCtrl.SetItem(&myItem); myItem.iSubItem = 2; myItem.mask = LVIF_TEXT; ZeroMemory( buf, sizeof( buf ) ); strcpy( buf, (LPCTSTR)edit_dlg.m_slocal_edit );m_slocal_editはCString型 myItem.pszText = buf; m_listCtrl.SetItem(&myItem); myItem.iSubItem = 3; myItem.mask = LVIF_TEXT; ZeroMemory( buf, sizeof( buf ) ); strcpy( buf, (LPCTSTR)edit_dlg.m_clocal_edit ); myItem.pszText = buf; m_listCtrl.SetItem(&myItem); ///(途中省略・・・)/// m_listCtrl.SetItem(&myItem); m_listCtrl.Update(iItem); }
96 :
デフォルトの名無しさん :02/08/19 13:20
MFCってVS.netで何が変わったの? あんまり情報が見つかんなくてわからないんでけど。 誰か知ってたら教えて
>>95 > int iItem = m_listCtrl.InsertItem(&myItem);
返ってきたiItemと myItem.iItem を比べてみ。
98 :
Melt-D :02/08/20 11:31
>>97 GetItemCount() + 1が余分だったんですね・・・。
iItemは0スタートということをすっかり忘れていました。
感謝します。
エディットボックスの中でEnterキーが押されたことをメッセージとして受け取るにはどうすれば良いでしょうか? クラスウィザードでエディットボックスを選択するとWM_KEYDOWNメッセージが無いのですが・・・
チミはクラスウィザードに頼らな何にもできひんのかいな。
解決しますた
やっとCTreeCtrlの使い方が少し見えてきた 先は長〜い
103 :
デフォルトの名無しさん :02/08/21 02:32
レジストリを変更して .lzhを自分で作ったアプリに関連付けしたのですが、 もとの関連付けに復旧した時に 画面上のアイコンは再描画されません。 レジストリ変更後、すぐにアイコンを 元に戻す(再描画する)にはどうすればいいでしょうか?
あるコントロールで、任意の部分を選択カラーにしたいのですが、 どうすればよいのでしょうか。InvertRectだとそのまま反転してしま うのですが、「選択色」にしたいのです。どなたかレスお願いします
>>104 あるコントロールとは具体的にはどれだ?
とりあえずキーワードはカスタムドローとオーナードロー。
106 :
デフォルトの名無しさん :02/08/21 09:26
VC++の例外処理の実装について詳しいサイトはないでしょうか? 自分で調べてもよく分からんのです。
2進数とか16進数の計算をする時には、どの関数を使えばいいのでしょうか? 教えて下さい。お願いします。
int i = 0x400 + 0x720; //16進数の計算?
>107 すれ違い。
110 :
名無しのデフォルト :02/08/21 20:07
ソケット通信を1台のPcで2EXE間で多発しているプログラムを使用しているの ですが、(OS-XP Vc++6.0で作成)10分ぐらいたつとAEXEでSendで出したもの に対してBEXEがOn関数で受けなくなってAEXEはSENDが成功してからRecieveを 使っているのでAEXEが止まっています。OS-NTの時にはそのような問題にはな らなかったのでXp絡みだと思います。(ちなみにBEXEを強制的に落とすとAEXE は動き出します。XPの基本優先度を上げると起き難くなります。) BEXEが悪いかXPの通信が悪いかだとは思うのですがご存知の方がいたらお願い します。通信を繰り返してるだけなので1回1回には問題なと思うのですが。
111 :
とくめいさん :02/08/21 20:55
.NETでMDI環境の標準スケルトンを作成して 表示に独自のイベントハンドラを挿入しても実行されません。 なぜか教えてください。 VC++.NETはVC++6よりずっと使いにくくなりました。
>>105 さん、レスどうもです。あるコントロールというのは
リストビューのことです。サブアイテムも選択可能にしたの
ですが、選択中の表示を今はカレットを使っているのですが、
点滅がなんかうざいなー、と思いまして。CDCにフォーカス矩形
の表示はあったのですが、選択中の反転(InvertRectじゃない)
もCDCでできないのかなーと思って質問したしだいです。
オーナードローとカスタムドロー、少し調べてみます。
113 :
デフォルトの名無しさん :02/08/21 22:24
教えてくだちい 他のウインドのリージョンを取得しようとして HRGN hRgn = CreateRectRgn(0,0,0,0); int rgntyp = ::GetWindowRgn(hWnd, hRgn); とやったのですがERRORAPIがリターンされます。 どうやったら他のウインドウのリージョンがget出来るのですか?
>>113 対象のウィンドウがリージョンを持っていれば、それで取得できる。
115 :
デフォルトの名無しさん :02/08/21 23:23
>114 どうもです。 つまり自分や誰かがSetWindowRgnした後なら取れるって事ですか? 実は重なり合っているウインドの見えている領域と HWNDのリストを作りたいのですが可能ですか?
>>115 GetWindowRgnがエラーだったら、GetWindowRectしてCreateRectRgnIndirect
すればいいのでは?
117 :
デフォルトの名無しさん :02/08/22 09:06
CControlBar上にコントロール(CTreeCtrl)があります バーもコントロールもCMainFrameのメンバ変数になっています OnSelchangedなどの処理をするにはどうしたらいいでしょうか CTreeViewの宣言、関数をそのままMainFrameにコピーしてみましたが 反応無しでした
118 :
デフォルトの名無しさん :02/08/22 21:23
MFCのコントロールを色々使った例が載ってるような書籍って無いですかね?
>118 新VisualC++入門 シニア編 \4200 著者 林 晴比古 ただし、 >MFCのコントロールを色々使った例 の他はほとんど為にならないので注意。 辞書代わりに使える、初心者ご用達の本。 って俺は思う。 誰か俺の質問教えて。。 足りない言葉あれば補足しますので よろしくお願いします。
>>119 _declspec(dllexport) CString WINAPI GetDirectoryPath();
>120 いけました。 おかげさまでやっと進めます。 その部分がわからなくて放置してたので 助かりました。 ほんと感謝してます。 このスレいまいち盛り上がらないなぁw あんまりみんなMFCって興味ないのかなぁ。
122 :
デフォルトの名無しさん :02/08/23 19:23
質問です。 AppWizardで作成したMDIアプリで、 メニューの ファイル→開くを選択した時 出てくるコモンダイアログのポインタを取得出来ないでしょうか? コモンダイアログで選択中の拡張子が取得したいんです。 それと、コモンダイアログで開けるファイルの種類を増やしたい時 ストリングテーブルをどの様に編集すれば良いですか? Bmpファイル(*.bmp) Jpegファイル(*.jpg) すべてのファイル の様にしたいのです。 VC6.0です。
123 :
デフォルトの名無しさん :02/08/23 21:58
VisualStdio.netでMFCはどう変わったのでしょうか。 知っている人がいたら教えてください。
124 :
デフォルトの名無しさん :02/08/23 23:33
>>122 コモンダイアログのプロパティとイベントに関する部分の
ヘルプをよ〜く読め
125 :
デフォルトの名無しさん :02/08/23 23:35
質問です CScrollBar(というかコモンコントロールのスクロールバー)のメッセージ WM_VSCROLL, WM_HSCROLL は CScrollBar ではなく、その親ウインドウに 送られますよね、それがいやなので次のようなクラスを作ってみました。 class CScrollBar2 : public CWnd { CScrollBar m_sb ; afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar *pScrollBar ) ; DECLARE_MESSAGE_MAP() } ; 以下略(説明用ですので細かい突っ込みはなしです)... m_sb は CScrollBar2 の子ウインドウとして作成されます。 結果、WM_VSCROLL, WM_HSCROLL は CScrollBar2 に送られます。 CScrollBar2 を普通の CScrollBar のように扱います。 で、ビュークラスにつけて、縦スクロールバーのように動作するように してみたんですよ。 まあ、普通に動作しているように見えるんですけど、マウスのホイール に反応しないんです。 スクロールバーの上でホイールを回すとちゃんと動作するんです。 別のウインドウになってしまったので当然ですが、これを普通 (CScrollViewとか)のようにビューの上でホイールが効くようにするには どうしたらよいでしょうか?
つづきです(長文スマソ) たんにビュークラスの WM_MOUSEWHEEL メッセージをスクロールバー (m_sb)にそのまま投げてやればよいのかと思ったのですが、Spy で見た ところ WM_MOUSEWHEEL はビュークラスにきてませんでした。 インストールしているマウスユーティリティがホイールの動作を WM_VSCROLL 等に変換しているのかと思い WM_VSCROLL も見てみたのです がきてませんでした。 で、長くなるので簡単に書くと、 他のアプリで試したところ次のような結果になりました。 ・スクロールバーがついているウインドウには WM_VSCROLL がくる ・ついて無いときはこない ・WM_MOUSEWHEEL は常にこない(多分マウスユーティリティのせい) 作ったビュークラスには、直接関連するスクロールバーはなかったんです 今、使用しているようなマウスユーティリティの有無にかかわらず、 ホイールが効くようにするにはどうしたらよいでしょうか?
127 :
デフォルトの名無しさん :02/08/23 23:38
>>125 WM_MOUSEWHEELみたいなやつ
128 :
デフォルトの名無しさん :02/08/23 23:39
かぶったー
で、ここでしょーも無いことを思い出したんですよ。 CSplitterWnd で分割表示したときは? 2×2で分割表示した場合、左上のビューにスクロールバーはありません ・スクロールバーがついているウインドウには WM_VSCROLL がくる ・ついて無いときはこない の法則からいけばホイールは効かないはずなんです。で、試してみました AppWizardで適当に作って、コンポーネントギャラリーから スプリットバーを追加して Spy で見てみました。すると、左上のビュー にも WM_VSCROLL がきてしまってるんです。 なぞですね。 そもそも、CSplitterWnd で分割表示してないときのスクロールバーの上 または左の(分割表示するための)四角もなぞです。 CScrollView でなく CView でもスクロールバーが表示されるようになる のもなぞです。 四角のほうは、多分あのスクロールバーはウインドウスタイルで WS_VSCROLL を指定したものではなく、CScrollBar を使っているん でしょうけど。 CSplitterWnd を調べればスクロールバーのないビューにも WM_VSCROLL が来るような仕組みがわかるかもしれませんが CSplitterWnd の中なんか 知りたくもありません。 こんな話はどうでもよくて、 ホイールが効くようにするにはどうしたらよいでしょうか?
>で、ここでしょーも無いことを思い出したんですよ 思いついたの間違いだろ、つーか文章長すぎスマソ
131 :
デフォルトの名無しさん :02/08/23 23:55
CStringやCStringArrayを含む構造体を動的に確保したいのですが、 new,deleteでやっていいのでしょうか?
132 :
デフォルトの名無しさん :02/08/23 23:59
133 :
デフォルトの名無しさん :02/08/24 00:47
や、なんか配列増やそうとコピー>deleteしようとするとエラーになるので、 なんかまずいのかな、と。
134 :
デフォルトの名無しさん :02/08/24 01:18
>116 どうもありがとうございます。っていうか遅レスですんまそ。 そうですね。でもウインドウの重なり具合で下の奴のリージョンが上の奴のせいで 欠けるとか、そう言うのを再現したかったモノで。。 例えばリージョンを重ねていって完全に隠れちゃったようなリージョンは NULLリージョンになってくれるとかそういう便利なヤシないですかね?
135 :
デフォルトの名無しさん :02/08/24 01:20
CStringがATLでも使えるようになったよな。 今更使わんけど。
あのー、すみません、 ご存知の方教えてもらえないでしょうか? Lhasaで関連付けしたら 即アイコンが変わったので なんらか方法があるとは思うのですが。。
>>137 勘でレスするけどデスクトップはリストビューだから
そのリストビューに対して再描画を通知すればよいかも
>138 一瞬「ハッ」としたんですが、 つまりデスクトップのウィンドウを 再描画というわけですね。 でもそれだと、 同時に別窓で開いてるエクスプローラが 更新されないですよね。 どうすれば。。
>139 便乗して勘で、 SysListView32と言うクラス名を持つウインドウ全てに WM_PAINT送るとか、、、
>140 正直それをぱっとテストできるスキルは 持ち合わせてないんですが、 そっちの方向で調べながらやってみます。 ありがとうござました。 なんか勘違いしてたら教えてくださいね。
142 :
デフォルトの名無しさん :02/08/24 14:05
勘で答えるスレはここですか?
お前、ここですか?言いたいだけちゃうんかと(以下省略
144 :
デフォルトの名無しさん :02/08/24 14:31
おまいらMFCのリファレンスで何かお勧めはありますか? 開発中はMSDNライブラリで十分だけど 寝る前とかにマターリ読みたいわけだが
エロまんがでも読んどけ
エロ漫画は参考になりますか?
DATA型とPDATA型のちがいはなんですか
なりますよ。知らないんですか?
本とか型とかスレ違いなネタでしかこのスレ延びないんかい(悲
数年前に VIsualC++6.0Pro を買いました。 今店頭に並んでいる奴には PlusPack とか いうモノが付属しているようです。 PlusPack はあった方が便利ですか? MS のサイトで PlusPack 単体売りしているのを 買い逃したので気になってます。
151 :
デフォルトの名無しさん :02/08/25 11:46
めんどくせ〜、キーを打つのもめんどくせ〜
152 :
デフォルトの名無しさん :02/08/25 11:58
>>150 アカデミックのダンピング価格で
買ったのか?
いいねー学生さんは、、、
153 :
デフォルトの名無しさん :02/08/25 13:45
MDIアプリを作っているのですが、メインのウインドウをデフォルトじゃなくて イメージを貼り付けたいのですがどなたかご存知ではないですか? メディアプレーヤーみたいにいくつもイメージを変えたいです。。
>>103 ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST|SHCNF_FLUSH, 0, 0);
>>152 違いますよ。
アカデミック版じゃないです。
156 :
デフォルトの名無しさん :02/08/26 02:05
ウィンドウハンドルからオブジェクトへのポインタを 取得するにはどうすればいいでしょうか? CWnd* ????(HWND hWnd); みたいな関数ってありませんか?
>157 最高です。 感謝します。
159 :
デフォルトの名無しさん :02/08/28 03:38
自分で作ったファイルオープンのダイアログを フレームワークのファイルオープンのダイアログみたいに使うことはできませんか?
>159 みたいに? 代わりにじゃなくて?
ダイアログで取ったファイルのパスをOnOpenDocumentに渡したいんです。
162 :
デフォルトの名無しさん :02/08/28 09:35
基本クラスCEditViewのMFCで一行目だけ読み出すように するには、どうしたらいいですか? 一行目だけ色を変えたいんですけど、やりかたが書いてある 参考書がないので
EditControlに色を変えるような高尚なことができたっけか?
>>159 ID_FILE_OPEN の COMMAND メッセージハンドラを CXxxApp に作る。中身は
void CXxxApp::OnFileOpen()
{
LPCTSTR lpszFileName;
{
// ここで自作のファイルオープンのダイアログから得たパスを
// lpszFileName に格納
}
CWinApp::OpenDocumentFile(lpszFileName);
}
見たいな感じ。
CWndを直接継承したウィンドウを作成しているのですが、 この際ウィンドウのスタイルを WS_CHILD でなおかつ、 WS_EX_CLIENTEDGE (ウィンドウの境界が3D) にしたいと思っています。 CWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) で、 lpCreateStruct->dwExStyle をいじくったりしていますが上手くいきません。 よい方法があれば、或いは不可能であるのならば その旨を教えて下さい。 そもそも、CWndを直接継承してウィンドウを作って良いのか否か も分からないのですが…。
PreCreateWindowを使うのだ、
>>165 よ。
>>166 ありがとうございます。上手くいきました。
また質問なんですが、
CWnd::OnMouseWheel()
のところが上手くいきません。
これもまた、CWndから直接継承されたウィンドウなのですが。
ほかの、OnMouseMove()などはちゃんと反応するのですが…
perlみたいな正規表現は使えませんか
>168 DLLを使用してもよいなら 正規表現 DLL で検索を、、
いくつかのCStaticが重なった時に、その表示順を変えることってできますか? たとえばCStaticのAとBがあります。どちらもビットマップが表示されています。 AがBの上に重なっているとして、マウスでBをクリックすると、 BがAの上にくるように表示しなおすことってできますか? もしできなければ、ほかのコントロールを使ってもいいので、 似たようなことができますか?
>170 SetWindowPos で無理か?
174 :
動画無料サンプル :02/08/31 22:59
175 :
デフォルトの名無しさん :02/09/01 03:30
VC++6.0でMDIのプログラム作りたいんだけど で、子ウィンドウはダイアログベースで作ったものをそのままはめ込む ようにしたいんですが、どのような手順で作ればよいのでしょうか?
176 :
デフォルトの名無しさん :02/09/01 04:11
全ウインドウ(トップレベルウインド、チャイルドウインド)のZオーダーを取るにはどうすればいいですか? ウインドハンドルを渡すとZオーダーを返してくれるとか、そういうのありますか? GetNextWindow以外でお願いします。。
>>176 何で GetNextWindowは不可なのか?
1000とってゴメソ>SITNAM
181 :
デフォルトの名無しさん :02/09/04 14:28
SDIでプリンターの用紙サイズを自動にA3にしようと、 C**View::OnPreparePrintingで DEVMODE* pDev=(DEVMODE*)GlobalLock(pInfo->m_pPD->m_pd.hDevMode); pDev->dmPaperSize=DMPAPER_A3; pDev->dmOrientation=DMORIENT_PORTRAIT ; pDev->dmFields= pDev->dmFields | DM_PAPERSIZE | DM_ORIENTATION ; GlobalUnlock(pDev); とやってるのですが、デフォルトのA4のままです。プリンタの設定の ダイアログを使わずにどうやってA3に出来ますか?
>>181 わからんけどCreateDCでHDCを作り直すんじゃねーの
183 :
デフォルトの名無しさん :02/09/04 21:53
MFCでダイアログアプリ作って実行したらやたらリソース食うんだけど、 これって使ってるコントロールの数とかモロに影響します?
184 :
デフォルトの名無しさん :02/09/04 22:25
Windowsの終了間際に 不特定多数のコピーを行いその後 シャットダウンを続行したいのですが、 うまくいかなくて困ってます。 BOOL CTestDlg::OnQueryEndSession() { if (!CDialog::OnQueryEndSession()) return FALSE; // TODO : ここに特定なクエリの終了セッション コードを追加してください。 CopyFiles();//不特定多数のファイルのコピー処理 return FALSE; } 実際書いてみると、コピー処理が長く、 応答が無いから終了しますか?みたな プログレスバー付きのダイアログが表示されてしまいます。 これはちょっと不自然なので、どうしたらいいでしょうか?
↑書き忘れました。 環境はWinXP VC.NETです。 よろしくお願いします。
>>184 根本的に、終了間際に時間のかかる処理はするなってこった。
適切な対処法は知らんけどさ。とりあえず、OnQueryEndSessionで
FALSEを返しておいて、OnEndSession で CopyFiles() を読んんで処理が
終わった後、ExitWinodowsするとか。
これ。 BOOL exitFlag = FALSE; BOOL CTestDlg::OnQueryEndSession() { return exitFlag; } void CTestDlg::OnEndSession(BOOL bEnding) { if(!bEnding && !exitFlag) { CopyFiles(); exitFlag = TRUE; ::ExitWindows(0,0); } }
レスありがとうございます。 この方法でいけそうです。 ありがとうございました。
189 :
VC初心者 :02/09/07 02:18
処理に長い時間がかかる場合に×ボタンが利かなくなったりするのですが VBでいうDoEvents()にあたる関数を教えていただけませんでしょうか?
>189 おいおい、俺はVB知らんから 教えてやろうにも教えてやれない。 そこで検索してみることにした。 VB DoEvent 見事にヒットした。 代わりに検索して欲しいと言う依頼ですか? 出直してきなさい。
ありますた…スミマセン void DoEvents(void){ MSG msg; if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0){ TranslateMessage(&msg); DispatchMessage(&msg); } }
>189 DoEventsは知らないけどAfxBeginThread辺りを調べてみて。
ありがとうございます。MSDN見てみたのですが 全然わからないので無理っぽいです。(汗 とりあえず、上のDoEvents()でうまくいきました。
入力した数を計算したあと文字として出力したいのですが、 以下のコードではだめなんですが、どこをどうなおせばいいのか、 おしえてください。おながいします。 void CMy1Dlg::OnButton1() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CEdit* e1 = (CEdit*)GetDlgItem(IDC_EDIT1); CListBox* l1 = (CListBox*)GetDlgItem(IDC_LIST1); CString s1; e1 ->GetWindowText(s1); l1 ->InsertString(-1,s1); } void CMy1Dlg::OnButton2() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CEdit* e2 = (CEdit*)GetDlgItem(IDC_EDIT1); CListBox* l2 = (CListBox*)GetDlgItem(IDC_LIST1); CString s2; char buf[50]; double n1; double n2; e2 ->GetWindowText(s2); n1 = atoi(s2); n2 = n1 + 1; sprintf(buf,"%d",n2); l2 ->InsertString(-1,buf); }
特にこの辺がだめぽいんです。 e2 ->GetWindowText(s2); n1 = atoi(s2); n2 = n1 + 1; sprintf(buf,"%d",n2); l2 ->InsertString(-1,buf);
>195 だめっぽいのはわかったけど、 どうだめっぽいの?
リストボックスっていうのはUpdateDataは必要ないのかい?
>198 当たり。 自信なくてUpdateData(FALSE); ありとなしの両方のコード書いてきたら なしじゃ結果が表示されなくて、 UpdateDataしたらいけたよ。 よって解決。
194-195です。
>>196-197 結果は表示されますが、おかしいです。
数字が出力されてほすぃのに、文字が「フ0」とかでます。
>>198 UpdateData。。。なんでしょう。。あたらしい言葉だ。。
調べてきます。
sprintf(buf,"%d",n2); を
sprintf(&buf,"%d",n2); にしました。
Editboxに「1」を入力したら、Listboxに「2」とでてほすいのですが、、
「フ0」(フは半角)
と表示されますた。
editboxが空だと「0」と表示されます。
ウトゥです。
さそーく、やらしてもらいます。 ありがとうございました。
202 :
デフォルトの名無しさん :02/09/07 11:23
>>200 > sprintf(&buf,"%d",n2); にしました。
あほう。
&bufはなおしました。 「あ」さん UPDATEDATAってコードのどこに書き込めばよいのでしょうか? 教えてください。オナガイします。 これで僕の最初のVC++プログラムが動く。。かもです。
atoi関数ってCStringに対応してるのか?
UpdateData(TRUE)でダイアログ上のコントロールの値を対応する変数に代入する UpdateData(FALSE)で変数の内容をコントロールに表示する 普通は変数を処理する前にTRUEで処理した変数の内容を表示する場合にFALSEだから メッセージハンドらの最初にTRUE、最後にFALSEが一般的では?
ありゃ? cahrじゃないとだめですか? 教科書もチャーで書いてあるし、、
それと余談だけどGetDlgItem(IDC_EDIT1)の戻り値をポインタ変数を宣言して代入して e1 ->GetWindowText(s1); l1 ->InsertString(-1,s1); としなくても、戻り値がコントロールのポインタなので戻り値をそのまま利用して GetDlgItem(IDC_EDIT1)->GetWindowText(s1); GetDlgItem(IDC_LIST1)->InsertString(-1,s1); これでOKだよ この方がわかりやすいでしょ?
CStringはクラスですよ
つまり、char でないとだめだと。 文字列の中身をcharに直さないと。 ということですね。
あああぁぁぁぁぁ! わかっているつもりだttが、わかってないことがわかってしまったあぁ! 歩いたら道が伸びていく感じです
211 :
デフォルトの名無しさん :02/09/07 12:18
クラスウィザードでエディットコントロールに変数を割り当てる時にCStringではなくて最初からintを割り当てればいいんじゃない?
>>205 ,207どうもです。やってみました。
>>208 クラス。。クラスってなんか塊みたいなものですよね。代入不可ですか
>>211 僕もとてもそうしたいですが。。
GetWindowText(s1);
InsertString(-1,s1);
とかが使えないと、ファイル入出力ができなくないですか。
テキストファイルからデータを読んで、数値計算をして、
結果をテクストファイルで出力したいんです。
UpdateDataは関係ねーべよ。 e2 ->GetWindowText(s2); n1 = atoi(s2); n2 = n1 + 1; sprintf(buf,"%d",n2); l2 ->InsertString(-1,buf); ここらへんをステップ実行して、s2,n1,n2,buf の値を調べてみれ。 どこで変数の値が化けるのか分かるから。
214 :
デフォルトの名無しさん :02/09/07 13:48
ちゅーか、 e2 ->GetWindowText(s2); n1 = atoi(s2); n2 = n1 + 1; l2 ->SetWindowText( itoa( n2, buf, 10 )); ではダメなん?
215 :
デフォルトの名無しさん :02/09/07 13:49
atoiにCString渡してもVC上では問題ないと思ったが
n1,n2はなんでdoubleなの?
このスレ最近ふわふわしてるな
>>215 VC上っつーか、CString::oprator LPCTSTR()があるんで、
TCHARがcharならば、C++的に問題なし。
219 :
デフォルトの名無しさん :02/09/07 14:30
>>213 ステップ実行なんて高度な技を。。ついに学ぶときが来たのですね!
>>214 おお!atoiがあるならitoaもあるはず!なんで気づかなかったのか!
>>215 どもですー。
>>216 数値計算に使いたいからですー
>>217 僕が地に足の着いてない生き方だからです、すんまそん。
>>218 LPCTSTR()って何の略なのかすらわかりませぬ。とりあえずNO問題?
>>220 > おお!atoiがあるならitoaもあるはず!なんで気づかなかったのか!
C標準関数じゃないから。
222 :
デフォルトの名無しさん :02/09/07 14:43
>LPCTSTR()って何の略なのかすらわかりませぬ。とりあえずNO問題? 略っていうかCSTRINGのメンバ関数だよ
223 :
デフォルトの名無しさん :02/09/07 14:54
>>220 あなたが参考にしてるという教科書にはクラスに関する解説はないの?
まだVC初心者スレに留まっていた方が良かったのかも
221-222>>みなさん、CStringの中とか読んでるんですか? 223-224>>そんなこというなよ、ウワァァァンヽ(`o´)/
226 :
デフォルトの名無しさん :02/09/07 15:27
>>225 君が使ってるVC++が合法的に入手したものであればヘルプ機能が付いてるはず
VCのヘルプであるMSDNは素晴らしいツールだから是非使い方を覚えるべきだね
CStringのメンバについてもその使い方についても全て書いてあるからさ
まずエディタの中でCStringという記述を反転させて(記述がなければ記述してくれ)F1キーを押す
それから「該当するトピック」の中からCStringクラスメンバを選んでクリックする
>> の使い方が、ストリーム演算子みたいになってますよ(w (それなら << か...どうでもいいや。)
CString hoge; int num=12345; hoge.Format("数値は%dですが何か?",num); MessageBox(hoge,"test",MB_OK); //(゚д゚)ウマー?
>>226 >エディタの中でCStringという記述を反転させて
カーソルを CString という文字列のどこかに置くだけで OK。
230 :
デフォルトの名無しさん :02/09/07 16:32
CString strTemp1(_T("変体ねーチャン")); CString strTemp2 = strTemp1; としてもほとんど処理速度に影響ないときいたのですが どういう意味でしょうか?
あっ、偉いスレが伸びてるからびっくりしたよ。 >今田純 別に嫌味で言うわけじゃないけどさ、 はっきりいってMFCやるの早いよ。 クラスのこと分かってなかったら MFCいじっても勉強っていうより 作った気になるだけじゃないかな。 MFCよりまずはクラスがなにか、 継承、カプセル化などについて学び、 その後SDKを学ぶことを強くオススメする。
233 :
デフォルトの名無しさん :02/09/07 16:59
つーかMFCの方が簡単だべ。 C++の基礎とかわかんなくても何となく作れちゃうから。
>>230 >CString strTemp2 = strTemp1;
のときは文字列の内容自体はコピーしなくて、ポインタのコピーと参照回数++しか
しないことがいいたいんだろ
>>232 同定ageすんなよ
235 :
デフォルトの名無しさん :02/09/07 17:27
n1とかはdoubleなのにsprintfで%dつかってる。CString使うんだから いちいち char buf[50]なんてやらんでよろし。DDXとか使わないんだったら CEdit* e2 = (CEdit*)GetDlgItem(IDC_EDIT1); CListBox* l2 = (CListBox*)GetDlgItem(IDC_LIST1); CString s2; int n1; int n2; e2 ->GetWindowText(s2); n1 = atoi(s2); n2 = n1 + 1; s2.Format("%d",n2); l2 ->InsertString(-1,s2); でいいだろ。 こういう処理したかったら普通ClassWizard使ってエディットボックスの 値を反映させるメンバ変数使います。
>>220 >>216 数値計算に使いたいからですー
すまん、doubleが使いたいのね。だったら%dじゃなくて%gとか%f。
atoiはatof使わないと少数切られるよ。
doubleならatofよりもstrtodの方が良いかも知れない。
VisualC++初心者の者です。 アプリケーションを起動した時のみ一度だけ実行したい関数があるのですが、 その関数はCClientDCオブジェクトのアドレスを渡さなければなりません。 それでオブジェクトを作るためにCAppView::CAppView()にCClientDC DC(this)と 記述したのですが、どうも不安定になっていしまいました。(Appはプロジェクト名です) OnDrawに同じコードを書くと問題無いようなのですが、何回も関数が呼び出されるわけには いきません。何か方法ありませんか?
素直にsprintf()ではいかんの?
>>238 CAppView::OnInitialUpdate()に書いとけば?
doubleやfloatなら俺もsprinf使ってしまう罠。
>>238 フラグでも用意してやれば良いんじゃない?
>233 そりゃMFCの方が断然簡単だよ。 =SDKの知識が必要ないとは 別な気がするなぁ。 私はSDK->MFCの流れだけど、 SDKやってるからかなり分かりやすかったよ。 俺の使ってた本には、 船の操作方法はわからなくても 海を航海できるが、 最低限の舵取りなどは覚えておくべき、 みたいな例え方してたと思うけど、 ほんとその通りだと思うなぁ。
MFCやらSDKやら言う前の段階だろ。 単にヘルプとIDEの使い方知らない奴なんだから。
>243 確かに。 根本的なものが抜けてるね。 で、考え直したけど、つまりは できないことじゃなくて、 できることからやってろ。 って言うのが結論ですかね。 頑張れ新人。
245 :
デフォルトの名無しさん :02/09/07 18:40
CAppView::CAppView()の時点ではまだウインドウが作られてないので、
CClientDC DC(this)なんてことしたら実行時にエラーで落ちるでしょうね。
ViewクラスにBOOL型のメンバ変数でも追加して、OnDrawで1回だけ描画
されるようにしたらいいと思いますよ。
>>240 その時点で描画しても多分描画されないと思う。
>>「あ」さん。読んでもわかんないから、聞きながらやります、
なので、生あたたか〜く見守ってください
>>232 いつもくるけど、道程じゃねえっていってるだろ!プンプン!
>>233-237 レスさんくすこ
247 :
デフォルトの名無しさん :02/09/07 18:53
ダイアログベースのソフトで メニュー->オプションで オプション設定画面(ダイアログ)を表示するような コードを書いたのですが、 もう結構進んだ段階なのですが、 オプション設定画面に置くべきコントロールが 増えてきたのでタブ式のオプション設定ダイアログに 変更したいと思ったのですが、 なにかいい方法はないでしょうか。 タブコントロールを使うのが一番早いでしょうが、 あれってリソースエディタ画面がコントロールで ぐちゃぐちゃになりません? 必要に応じてShowWindowで切り替えるので リソースエディタ開いたら1〜?ページぶんの コントロールが表示されてる状態で。。 ページをタブコントロールで切り替える場合 リソースエディタの見た目入り混じって ぐちゃぐちゃになりますが、こういうものなんでしょうか? 実際起動するとShowWindowで制御されてるので 普通に見えます。
>>247 そんなあなたに CPropertySheet
>248 やっぱりそうですよねぇ。 実は私もそう思ったんですが、 CDialogから派生したオプションダイアログなんですが、 これをAddPageするにはCPropertySgeetからの 派生クラスに変更しないといけないんですが、 なんか単純に public:CDialog の部分を変更しただけだとコンパイルすら 通らない状態になってしまって。。 両方ともCDialogの派生クラスだからいけると思ったんですけどね。 なんか間違ってますか??
>>249 余裕で変更できる。
・ダイアログの基本クラスを、CPropertyPage(CPropertySheetではない) にする。
・ダイアログエディタで
[無効] と [タイトル バー] プロパティにチェック
[スタイル]→[チャイルド] 、[境界線]→[細枠]
・CPropertySheet::AddPage() , CPropertySheet::DoModal()
251 :
デフォルトの名無しさん :02/09/07 20:06
今日からVCに再挑戦してるだども、いきなりつまっただよ CClientDC myDC(&m_pict); <====アソコ m_pict.GetWindowRect(&pictSize); ..... ..... myDC.SelectObject(&myRgn); となっとるだどもアソコでは何をしてるんだべか? CClient型のオブジェクトmyDCを作ってるのかと思ったら m_pictというオブジェクトもできてるように思えるんだべが。
タブコントロールでグチャグチャって。。。? タブ分のフォーム作って選ばれたタブによってフォームをSHOW,HIDEしてやれば?
>>251 >CClient型のオブジェクトmyDCを作ってるのかと思ったら
思ったとおり、引数にCWnd*がいるからm_pictはCWnd(または派生クラス)のはず
>m_pictというオブジェクトもできてるように思えるんだべが
まちがい、m_pictはすでに存在しているウインドウのはず
解決したべよ .hファイルというものがあったのでそこ見てたらあったm_pictべ .hファイルをしらなかったのでここから勉強することにするべ いままでひとつのファイルしか使ったことなかったんで 知らなかったんだべよ
>>251 m_pictというウインドウに描画するためのCClientDCのオブジェクトを作ってます。
コンストラクタというものを勉強しましょう。
256 :
デフォルトの名無しさん :02/09/07 20:47
0x100げっと
>>253 書き込んでる間にお返事ありがと
.hに
CStatic m_pictとあったべよ
まだC(not ++しかーもーインタプリタ)はじめてから経験浅いのでつらいべよ
昔買ってぜんぜん使えなかったVC++をちょっと使ってみようかと思うったべよ
>>255 オラがもってるブックにはコンストラクタは
クラス名 オブジェクト名 = new クラス名();
としか乗ってなかったから
引数とることがありえることすらわからなかっただべよ
短時間にものすごい勉強させていただいたべよ
ありがとだべよ
259 :
デフォルトの名無しさん :02/09/07 20:55
ブックに載ってないnewを使わいやり方も学んだべよ
#define nyu new
>>251 >まだC(not ++しかーもーインタプリタ
「しかーもー」は昔やってたクレアラシルのCMの外人口調でよむのか?
>オラがもってるブックにはコンストラクタは
>クラス名 オブジェクト名 = new クラス名();
>としか乗ってなかったから
別の本買ったほうがいいぞ、それはポインタの場合だけだからな
264 :
デフォルトの名無しさん :02/09/07 23:19
ダイアログアプリでタスクバーにボタンを登録されたくないのですが、 非表示の親ウインドの子にしてしまう方法でダイアログアプリのやり方を教えてください。 とりあえず、 1.CWinAppの派生クラスのInitInstanceでダミーウインドを作成 2.CDialogの派生クラスのPreCreateWindowでcs.hwndParentにダミーのハンドルセット で、だめですた。。そもそもPreCreateWindowに来ないです。。 教えてください
ところでCTreeCtrlでアイテムのイメージの抜き色を 表示しないようにするにはどうすれば?(CImageListを使ってます なんか上手くいかなくて (抜き色部分が黒で表示されてしまうなど サンプルソースどこかのサイトにありませんか?
>>264 1の非表示のウインドウってどうやって作ってる?
ダイアログをDoModal()するんじゃなくて、フレームウインドウか自滅型のダイアログを
CreateしてShowWindowするほうがいい。
で、WM_CREATEで表示させるダイアログをDoModalする。
2は意味不明。
>247での説明間違ってました。 リソースエディタ->ダイアログエディタでした。 >250 ありがとうござまいます。 今から言われたとおりにチャレンジしてきます。 また報告にきます。 >252 上で訂正しましたが、 起動画面上での話しではなく、 ダイアログエディタ上の話しでした。
268 :
デフォルトの名無しさん :02/09/08 18:00
VC+6.0なのですが、 unsigned longよりも大きな整数を扱うにはどうすれば よいのでしょうか?
269 :
デフォルトの名無しさん :02/09/08 18:02
>>268 自作 or 64bitのCPUつんだパソコンが出るのを待つ
270 :
デフォルトの名無しさん :02/09/08 18:05
>>269 お前は、多倍長計算と言うものを知らんのか ? 8086 のコンパイラでも、
32bit 整数をサポートしてる奴はいくらでもあるぞ。
>>270 MSDN見てみます。ありがとうございました。
273 :
デフォルトの名無しさん :02/09/08 19:48
VC++6.0です。 タイトルバーの領域を取得して、タイトルバー上でのマウスの操作を無効にしたいです。 ↓を使ってやりたいと思います。 UINT CMainDlg::OnNcHitTest(CPoint point) { return CDialog::OnNcHitTest(point); } CPoint pointに今のマウスの位置が入ってくるみたいなのですが、 タイトルバー上にあるかどうか判定するにはどうしたらいいのでしょうか? と、いうより、タイトルバーの領域の求め方を教えて下さい。
>>273 GetSystemMetricsとかでなんとかならんの?
>>273 SDK ならば DefWindowProc(hwnd, WM_HITTEST, 0, MAKELONG(point.x, point.y) ); で
HTCAPTION が返ってくればそこはタイトルバーやーってことなんだけど
このセンで何とかならんっすか?
276 :
デフォルトの名無しさん :02/09/08 22:11
>>275 ううむ、MFCでやってるのでよくわからないです。
いい加減、まともな文法覚えないといけないんですが。
よく見たらUINT OnNcHitTest(CPoint point)
の戻り値がHTCAPTIONだったらタイトルバー上ってことらしいです。
が、使い方がわかりません。
どこで使ったら(判定)したらいいでしょうか?
SystemMetricsはよくわからなかた。
UINT CxxxDlg::OnNcHitTest(CPoint point) { UINT nHit = CDialog::OnNcHitTest(point); return (nHit == HTCAPTION) ? HTNOWHERE : nHit; } とか。
>>277 ありがとうございます。
大丈夫みたいです。
でも、return〜の行がなにやってるかわからない(汗
?とか:とか。
三項演算子をぐぐれ
>>279 ありがとん!
今日帰ったら調べてみるよ。
281 :
デフォルトの名無しさん :02/09/09 14:32
リストビューのヘッダ上で右クリックしたことを知るにはどうすればよいですか? エクスプローラではカラムのリストがコンテキストメニューとして表示されますが、 ああいうことをやりたいのです。
282 :
デフォルトの名無しさん :02/09/10 09:28
CInternetSession や CHttpConnection 等を使ってWebサイトからファイルをダウンロードするプログラムを作ってます。 複数のスレッドを立ち上げて同じサーバからファイルを同時にダウンロードしたいのですが、 CInternetSession や CHttpConnection クラスのインスタンスは1つでいいのでしょうか? それとも、スレッドごとに作成しなければいけませんか?
>>281 ヘッダに関してはHDN_XXXXXXメッセージを処理。
>>283 実際にやってみそ。メッセージ飛んでこないから。
>>284 あああそういえばそんな話を聞いたことがあったような。スマソ。
OnNotifyオーバーライドするしかないのか?
てか、そもそも右クリックを処理するメッセージがないのね。 重ね重ねゴメン。
>>281 は CodeGuru にありそうな典型例ですな
ゲームの効果音としてWAVファイルを再生したいのですが、いろいろ調べても 適当な方法が分かりません。 細かいところは自分で調べるので、おおまかな手順を教えてください。 お願いします。
>>281 ヘッダコントロールをサブクラス化すればできるんじゃないのかな。
Spy++でメッセージ見てみれば?
>>288 MFCにまるで関係なさげだが…
1.DirectXを使ったラッパライブラリを使う(沢山あるよ)
2.DirectXを自分で使う
3.MMsystemを使う
こんなとこかね…
290 :
デフォルトの名無しさん :02/09/11 13:15
MFC初心者です。 Windowsのエクスプローラのようなプログラムを作ろうと思っています。 この場合、ドキュメント・ビューアーキテクチャーのサポートは する必要があるのでしょうか? データファイルの入出力はないので必要ないと思うのですが、どうでしょう?
>>290 ドキュメント・ビューアーキテクチャーがわかりにくかったら
こういうケースでは特に使う必要は無いと思う
まあ、普通にアップウィザードでSDI,MDIアプリをつくると
勝手にサポートしてしまうけどな
ドキュメント・ビューアーキテクチャーになったらなったで
あまり気にせず作るのもありだと思うがな
292 :
デフォルトの名無しさん :02/09/11 14:08
> ドキュメント・ビューアーキテクチャーになったらなったで > あまり気にせず作るのもありだと思うがな なるほど。 実はプロジェクトの新規作成(SDI)で、分割ウィンドウを作成するには 「ドキュメント・ビューアーキテクチャーのサポート」にチェックを入れないと 駄目みたいだったので、どうしようかな〜と思って質問してみました。 ドキュメント・ビューアーキテクチャーをサポートしても、exeのサイズ がそんなに変わらないのであれば、そうしようと思います。
>>289 3番の方法で音を鳴らすことができました。どうもありがとうございました。
294 :
デフォルトの名無しさん :02/09/11 19:50
age
295 :
デフォルトの名無しさん :02/09/11 19:51
CTreeViewでツリーを表示しているのですが アイコン位置にチェックボックスを出したいのですが どうすれば良いでしょうか?
296 :
デフォルトの名無しさん :02/09/11 22:29
exitを使ってプログラムを終了させると落ちるのですがだめなのでしょうか。
>295 俺は自分でチェックボックスの オンとオフのイメージを用意して 必要に応じてイメージを入れ替える、 という方法で実装できた。 でもなんか間違ってる気がするんだが。。
>>295 CTreeCtrl::SetCheck()っていうのがあるけど、使ったこと無いから知らん
タメシテレポートキボンヌ
299 :
デフォルトの名無しさん :02/09/12 13:34
OnInitDialog() の中でソフトの起動を止めたいときは どうすればいいでしょうか? PostQuitMessage(1) にすると 一瞬メインウィンドウが表示され困ってます。
>TreeViewにチェックボックス TVS_CHECKBOXESというスタイルがある。 (MSDNでTree-View Control Window Stylesを検索すればスタイル一覧がみつかる) ダイアログにツリービューコントロールを貼ってプロパティで スタイルを見ると、チェックボックスをつける項目があるので そういうスタイルがあるんだろうなと予想できる。
300ゲットやねん。 MFCのアップウィザードで作ったダイアログベースアプリやったら CxxxApp::InitInstance() で処理したらど〜や  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ (´´ ,---..、- 、,-、 (´´ .ivvvi:i::'.、. ヽ} (´⌒(´ ⊂j(゚ヮ゚j;;!⊂} }⊃≡≡≡(´⌒;;;≡≡≡  ̄ ̄ ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
,.r''" ̄``ヽ、 /::::;:ハ:::::::::::::::', l:{レム! ';i'、!;:::::::::! |::';‐- -‐-i:::::::| |:::i,! |r‐、| l,!:::::::l 300取られへんかった !l::i;`r'テ'i"i|::::;、:| il、li´''‐--,i/リ;ヾ / |▽▽▽! `、
>301 それもそうですね、今書き換えてきました。 ちなみにCxxDlg::OnInitDlg()関数内部では 無理なんでしょうか? 今後の参考に。
>>303 「OnInitDlg()をオーバーライドする場合、まず基本クラスのOnInitDlg()を呼び出す」
ってとこに答えがあるような...
>304 なるほど、 納得できました。 ありがとうございます。
>299 InitDialog中でEndDialog
>306-308 EndDialog
EndDiabloに見えてきた。鬱だ寝よう
MFCって時代遅れじゃないよね? まだ使えますよね?
>>311 ユーザーに高性能なPCを買わせる(買い替えさせる)ために.NETが推奨される
MFCのコンボボックスで、 編集・選択可能なコントロールを作成して、 aaa,bbb,ccc というアイテムを登録した状態で、 エディトボックスに"ddd"と入力します。 この状態で、↓を下げて、"ccc"を選択すると、 WM_SELCHANGE が来るのですが、 ここで、その処理を中止したいので、 csCombo.SetWindowText( "ddd" ) と書きましたが、 コンボボックスは"ccc"になってしまいます。 何か回避策は無い物でしょうか。 (出来ればTimer等を使用しない方向で・・) よろしくお願いします。
>313 なにをしたいのかよくわからんが、 dddと選択されたくない、と思ってるなら スタイルをドロップダウンリストにすればいけるよ。
>>314 既存で登録されている物はリストに出るんですが、
好きな名前を入れると、その名前で新規登録できるような仕組みです。
ただ、SELCHANGEの時に、本当に変えて良いか確認するのですが、
ここで、『変えない』とされた場合に、元に戻すようにしたいのですが、
それが上手く行かないという状況です。
>>315 入れたい場合はAddStringで追加してやれば?
>>315 |ON_CBN_SELCHANGE
| このメッセージを処理するとき、コンボ ボックスのエディット コントロール
| 内のテキストを取得するには、GetLBText 関数または別の同種の関数を使いま
| す。GetWindowText 関数は使えません。
これ、大丈夫?
↑あ、関係ないか。スマソ。
>>315 CBN_SELENDOKでやったらどうか、と勘で答えてみる。
いずれにせよ、SELCHANGEだと矢印キーで移動するたびに
確認メッセージが出ることになるので良くない気がするもより。
>>316 まだ、それは確定アイテムでは無いので、そういう訳にも。
>>319 よく考えたら、そうですね。
当方、マウスオペレーションしか考えてませんでした(^^;
とりあえず、SELENDOKの方で変えるように、これから変更してみます。
319さんからの ご指摘の通り、SELENDOKの方に移してみましたが、元々のやり方では駄目でした。 (すべて、SELENDOKのハンドラの中で記述し、直後にreturnしてます) (不可A) →全く無視され、変更後のセルの内容が表示されます m_csCombo.SetWindowText( "元に戻したい文字列" ); (不可B) →DeleteString実行時に、エディト内容が心中します。 lIndex = m_csCombo.AddString( "元に戻したい文字列" ); m_csCombo.SetCurSel( lIndex ); m_csCombo.DeleteString( lIndex ); (不可C) →Spyで見たところ、WM_SETTEXT自体が来てませんでした。 ::PostMessage( m_csCombo.m_hWnd, WM_SETTEXT, 0L, (LPARAM)"元に戻したい文字列" ); (悩み続けても生産効率が悪いので。) PostMessage( WM_USER+77, 0, 0 ); WindowProc( ... ) { if( message == WM_USER+77 ){ m_csCombo.SetWindowText( "元に戻したい文字列" ); return 0; } } コードが汚くなってしまったのが口惜しいのですが、 とりあえず、これで目的の動作をしてくれました。 ご助力頂き、ありがとうございました。 もし、もっと良いコードが有れば、是非教えて下さい。
322 :
デフォルトの名無しさん :02/09/14 21:19
CListCtrl (リストビューコントロール) で、レポートビューの時に、ヘッダーと 実際の値で異なるフォーマットを指定したいんですが、できないのでしょうか ? 要は、ヘッダーに「ファイルサイズ」と表示して、各々のファイルサイズを表示 したいんです。実際のファイルサイズは数値なので当然右詰で表示するんだけど ヘッダーは中央揃えの方が美しいと思うので...。 Explorer なんかだと、両方とも右詰で表示されているのでできないのかなぁ...。
>>322 オーナードロー
と「リストビュー」だけ見て条件反射で書き込んでみるテスト。
>>323 う〜〜〜ん、それしかないか...。何で別々に指定できないかなぁ...。
第一、タイトルなんて常に中央揃えで良いと思うし...。
と、愚痴を言ってても始まらないので、とりあえずオーハードローでしこしこ
やってみます。ありがとう。
325 :
デフォルトの名無しさん :02/09/15 01:15
俺もリストビューについて質問。 行の高さを動的に変更したいのですがどうすればよいでしょうか。 1行目は高さ20、2行目は高さ30、、、というふうに各行を任意の高さに 変更したいのです。 オーナードローでWM_MEASUREITEMが送られてくる時点ではまだ高さはわからず、 実行時に任意の高さに変更できるような仕様です。
>322 Header Controlに対してだけ、CustomDrawを仕掛けたら?
つか、HeaderControlにHDM_SETITEMを送れば済むかナ?
便乗気味に質問ですけど、CListCtrlってリサイズ時に凄くちらつきません? CTreeCtrlは全然ちらつかないのに…
329 :
デフォルトの名無しさん :02/09/16 11:56
C++.NETを買ってMFCで使ってみたのですが、ClassWizardが見つかりません。 コントロールに対応する変数を作れないのです。どうすればよいのでしょう。 お願いします。
330 :
デフォルトの名無しさん :02/09/16 12:02
なんと!! C++.NETってのも出たのか。 知らんかった。
>329 コントロールを右クリックして変数の追加
OFFICE XP風のメニューにするにはどのようにすればよいのでしょうか?
初心者ですが この間VC++初めて使ってクイズプログラム作ってみたんだけど テキストに書いてある 「はろ〜わ〜るど」のプログラムからはじめるやつっているの? 意味不明だし..
>333 テキスト?? 学校のテキストか? んなの知るかよ。 俺の初心者時代に使った本に載ってある Hello,World!!には Windowsの仕組みを知る上で大事な ファーストステップだった。 書きたくなきゃ書くなよ。
>>331 ありがとうございます。
普通のボタンなどはうまくきました。
しかし、ラジオボタンはどうしても変数が作れません。
VC6でやっていたようにグループボックスを貼り付け、
ラジオボタンをいくつか貼り付け、
一番上のラジオボタンのIDを変え、そのラジオボタンを
右クリックして「変数の追加」を選んでも、そのIDが
出てこないのです。
どうすればよいのでしょう?
教えて君ですみませんが、よろしくお願いします。
>335 グループ化したいラジオボタンの タブオーダーの一番若いやつを 右クリック->プロパティ Group true にしたらいけると思うよ。 今確認したらいけたから。
>>336 ありがとうございます。
やってみたら、できました。
#言われてみればその通りで、お恥ずかしいです。
>337 そうか、一件落着だな。 そういえばラジオボタンで思い出したけど、 俺のところではなぜか三つ以上のラジオボタンに値を割り当てることが できない。 VC6で確かintに出来たはずなんだけどなぁ。 .NETでGroup true にしてから タイプをValueにして手動で BOOLからintに打ち変えても ちゃんと動かないんだなぁ。 なんでだろ。 仕方ないのでGetDlgItemを使用した SetRadioButton()とGetRadioButtonを自作してるよ。 みんなこうなの?便乗だけど。
>>338 あ、ほんとですね。ラジオボタンをintにできない。ちょっと鬱。
うーん、俺はGetCheckedRadioButtonを使ってみます。
タブオーダーが実は変とか。Ctrl+Dで確認してみては如何か。
俺も便乗なんだけど、ラジオボタンの背景って灰色になっちゃうよね。 別の色にする方法ってあるのかな。
>340 アドバイスはありがたいが違うと思う。 ちなみにそのまま書くが、 俺のCtrl+D押した時のタブコントロールのタブオーダーは 5-6-7 で、5がgroup true になってる。
>VC6で確かintに出来たはず VC6使ってるが、できるの? というか DDXのことを言ってるのだったら、その変数は対応する1つのラジ オボタンの状態しか反映しないので、どのラジオボタンにチェックが入って いるかを調べるには、結局 GetCheckedRadioButton みたいなことやらないと ダメなんじゃないの?(DDXあまり使わんので...)
>343 調べなおしてみたけど CWnd::GetCheckedRadioButton(int nIDFirstButton, int nIDLastButton); 選択されてるラジオボタンを調べるこんな関数もあったのね。 知らなかった。 でもDDXでintに割りあてれなかったかなぁ。 VC6使ってる人レポート求む。
>>344 VC6ではintにしかできなかった(もちろん値の場合)
単にダイアログにラジオボタンを配置しただけではクラスウィザードの
メンバー変数ページにはIDC_RADIO1は表示されなかった。
ダイアログエディタでラジオボタンのプロパティのグループにチェックを入れると
クラスウィザードで表示されるようになった
>345 レポートありがとう。 >ダイアログエディタでラジオボタンのプロパティのグループにチェックを入れると >クラスウィザードで表示されるようになった この状態では多分クラスウィザード内では 型はBOOLだったと思うんだけど、 ここで「int」とか選択できたり 書き返れたりはしない?
>ラジオボタンにint割り当て
VC6。ラジオボタンの一つのグループ属性をオンにするとClassWizardで
int型メンバ変数が割り当てられる。
どのラジオボタンが選択されているかは
UpdateData();
int nCheck = m_int_radio; // m_int_radioはClassWizardで割り当てたint型メンバ変数
とする。nCheckに選択されているラジオボタンの0ベースのインデックスが入る。
つまり、次のようなボタンの配置の場合、
○ 項目1
○ 項目2
◎ 項目3
三番めの項目が選択されているのでnCheckには2が入る。
>>341 OnCtlColorで他のコントロールと同様に変更できるよ。
if(pWnd->GetDlgCtrlID() == IDC_RADIO3){ // IDC_RADIO3はラジオボタンのID
// ここで色変更処理
}
みたいな感じで。
で、
>>325 なんだけど誰かリストビューの各行を別々の高さにする方法知らないかなぁ。
CodeGuruとかCodeProjectに出てるオーナードローの例は全行同じ高さのしか
無いようなんだよねぇ…
上げ忘れたage。
 ってなに?
>>346 >VC6ではintにしかできなかった(もちろん値の場合)
intのみ選択可能、BOOLはなかった
>347 分かりやすい解説ありがと。 結論をまとめると VC6ではラジオボタンを DDXでint型に設定できる、ということですね。 VC.NETではVC6のように BOOL型に割り当てることは可能なのですが、 .NETにてラジオボタンにint型を割り当てる方法を ご存知の型いませんか? それとも出来なくなっちゃったのでしょうか? >325はお力になれそうにありません。 申し訳ないです。
>>346 スマソ。
>>343 はでたらめだった(;´Д`)
VC6では、確かに、ラジオボタンのグループの最初のラジオボタンに int を
割り当てられるようになっていて、
m_radio = 2;
UpdateData( FALSE );
とかやると、グループ3番目のラジオボタンにチェックが入るね。
とかいって
>>347 と内容がモロかぶってるし...鬱だし脳
> .NETにてラジオボタンにint型を割り当てる .NETは持ってないんだけど、手動でDoDataExchange()内に DDX_Radio(pDX, IDC_RADIO1, m_radio_1); と追加できないんだろうか?
dswがあるソースはクリックしてビルドでコンパイラ 出来るけどdswがない場合は空のワークスペースを作って ファイルを挿入するだけでよさそうに思うけどエラー0で コンパイラ出来たためしがありません。どこが間違ってる のでしょうか?
意味がわかりません。
357 :
デフォルトの名無しさん :02/09/17 22:06
358 :
デフォルトの名無しさん :02/09/17 22:29
355じゃないけどcppとhだけのソースをvisualCで コンパイラ(ビルド)はするにはどうやればよい?
>358 プロジェクト作ってコピペでいいんじゃないかなぁ。
360 :
デフォルトの名無しさん :02/09/17 22:37
空のプロジェクト作ってファイルを追加。
>>358 355じゃないと書いてるけど355ちゃうんか。
"コンパイラ"したいんでしょ?
cppがひとつならダブルクリックしてビルドが早い。 あらかじめ空のフォルダに移しておかないと面倒なことになるけど。
ダブルクリックしてVC++を立ち上げてからビルドね。
>361 ほんとだ、するどいねw >355==>358 だね。 ふたりともコンパイラしたいのか。。
>>325 リストビューにはLVS_OWNERDRAWFIXEDしかないみたい。
リストボックスなら高さ可変にできるので、そっちで頑張るというのはいかが。
>363 355=358 ですが、355の文読み直したら 痛い文章だったので他人のふりしましたがばれましたか・・
355じゃないけどasmのファイルをVCで アセンブリするにはどうすればよい?
え、できるの?
え、できないの? アセンブリは無理でもアセンブルならできると思ったんだが。
仕方がないのでリストビューをフォームビューに代えてListBox貼り付けるか・・・
372 :
デフォルトの名無しさん :02/09/18 02:36
単純アプリケーションの実行画面で 横に出るスクロールバーってもっと伸ばせないんでしょうか? 実行結果が最初の方が分からないからどういう動作してるか見たいんですが。
また意味不明な質問が…
オブジェクトを直接宣言する場合と、 CTest oObj(Hoge); 一旦ポインタの形で宣言しnewする場合は、 CTest* pObj; pObj = new CTest(Hoge); どのように使い分ければいいのでしょうか? 具体的にはMDIアプリケーションの作成のところで 下記の記述が有ったのですが、なぜnewを使うのか よく理解できません。 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_TEST88TYPE, RUNTIME_CLASS(CTest88Doc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CTest88View));
スコープを外れても残したい時はnew。 きっとここよりC++スレ向きの質問。
CSplitterWndを使ってプログラムを作成しようとしていま す。 スプリットウィンドウを設定する時、 AAA.CreateView(0, 0, RUNTIME_CLASS(CBBBView), とViewクラスで指定するわけですが、このビュークラスにメッセージを送ったり したい場合、CBBBViewクラスのオブジェクトの実体名が指定してないわけですが、 そういう場合はどういう処理をすればいいのでしょうか?
378 :
デフォルトの名無しさん :02/09/18 10:42
タスクトレイ
>>377 CSplitterWnd::GetPane()でCWnd*が取得できる、CBBBView*にするには
キャストしかないと思う(RTTI,RTCIでも使ってくれ)
MFC的にはドキュメント・ビューアーキテクチャに若干依存しているクラスなので
CDocument::UpdateAllViews()やCView::OnUpdate()をオーバーライドして
使用するのが最も楽な使用方法だと思う。
382 :
デフォルトの名無しさん :02/09/18 23:32
別のスレに書き込んだけどスレ違いだからこっちで質問しろといわれたのでこちらにもう一度書きます。 MFCを使ってダイアログボックスを作る。 dlgをdomodalで作成する。 dlg内でEndDialgが使われる。 制御がdlgのdomodalしたところに戻らずにexeが終了するのは仕様でしょうか? 知っている方がいたらよろしくお願いします。
>>382 {
・・・
CMyDlg dlg ;
dlg.DoModal() ;
・・・ <ここにブレークポイント
}
でブレークしないで終了ということで?
戻ります。
>>383 , 384
一番最初のAppWizardでダイアログを作成したときの話です。
そのときにOnOKなどを押すとdlg.DoModal()の次の行にはいかずに終了しています。
"!"マークでデバッガ走らせてるとか、、、 ほかの場所のブレークは効きますか?
int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: ダイアログが <OK> で消された時のコードを // 記述してください。 TRACE("OK\n"); // ←ここにブレークポイントをおく } else if (nResponse == IDCANCEL) { // TODO: ダイアログが <キャンセル> で消された時のコードを // 記述してください。 } // ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、 // アプリケーションを終了するために FALSE を返してください。 return FALSE; ------------------
デバッガで追ってみたけど、デフォルトのソースで「次の行」に行かないのは本当みたい。 int nResponse = dlg.DoModal(); // ここへブレークポイントを置き、OKで閉じる。 if (nResponse == IDOK) // ここへは行かない。 { : : ただし、以下のようにすればちゃんと「次の行」へ行くことは確認できる。 int nResponse = dlg.DoModal(); // ここへブレークポイントを置き、OKで閉じる。 TRACE("break point\n"); // ここへは行く。 if (nResponse == IDOK) { : :
if (nResponse == IDOK) { //何もしない } だったら、ここはスキップされ、ブレークポイントが自動的に後ろに移動する。 どっちにしろ、どこかでブレークするはずだが。
>>389 デバッグすると普通はステップがif (nResponse == IDOK) に行くけどそこを飛ばして
一気にreturnまで行ってる。
って俺は
>>382 じゃないけど。
まぁ「DoModalの次の行が実行されてない」ってわけじゃないから気にしなくても。>382
ちょっと
>>388 のコメントが誤解を与えるかもしれないので訂正しておくと、
if (nResponse == IDOK) // ここへは行かない。
ってのは、処理が行かない(=if文が判定されない)という意味では無く、
デバッグしたときにステップの矢印がその行をを飛ばすという意味ね。
試してみると分かると思うけど、AppWizardでダイアログベースのアプリを作って
Appクラスの
int nResponse = dlg.DoModal(); //ここにブレークポイントを置いてOKで閉じる
if (nResponse == IDOK)
をデバッグしてみるとそうなる。
自分でCDialogから派生ダイアログ作ってDoModalすると
ちゃんとif文にもステップが行くんだけど。Win2000+SP3、VC6+SP5。
下記にブレークを起き、一旦止めて混合モードで表示して見て。 if、elseとも何の記述も無いので、最適化されてコードが何も無いでしょ。 だからブレークをはれない。 int nResponse = dlg.DoModal(); // ←ここにブレークポイントをおく if (nResponse == IDOK) { // TODO: ダイアログが <OK> で消された時のコードを // 記述してください。 } else if (nResponse == IDCANCEL) { // TODO: ダイアログが <キャンセル> で消された時のコードを // 記述してください。 } // ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、 // アプリケーションを終了するために FALSE を返してください。 return FALSE;
補足、下記みたいにすると最適化されないのでブレークはれるようになる。 int a; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { a=0; } else if (nResponse == IDCANCEL) { a=1; }
394 :
デフォルトの名無しさん :02/09/20 14:18
リストボックスでオーナードローし、 MeasureItem()で lpMeasureItemStruct->itemHeight = 255; とするとアイテムの高さが変えられますが、 この数値が256以上だと高さがおかしくなります。 具体的には256をセットすると表示されず(アイテム高さ0)、 また値を増やして行くとアイテムの高さが増えていきます。 どうやらアイテムの高さが255を超えると0にリセットされているようです。 アイテムの高さを256以上にするにはどうしたらよいのでしょうか?
>>394 >リスト ボックス、コンボ ボックス、またはメニューの各項目の高さを
>指定します。オーナー描画のリスト ボックス、コンボ ボックス、
>またはメニューのオーナーは、メッセージ処理から戻る前にこのメンバに
>値を設定しなければなりません。
>リスト ボックスの項目の最大の高さは 255 です。
ヘルプに書いてる
も う だ め ぽ
397 :
デフォルトの名無しさん :02/09/20 23:35
CHtmlViewで文字列を選択中かどうか判断するのにはどうしたらいいでしょう?
398 :
デフォルトの名無しさん :02/09/20 23:35
399 :
デフォルトの名無しさん :02/09/20 23:44
>>398 それじゃ面接の意味ないじゃん。
実力もないのにあるフリをされると会社としては困るんだよ。
ていうかスレ違い
400 :
デフォルトの名無しさん :02/09/20 23:48
CString cs=_T("の作成に失敗しました"); <- 意味ね−じゃん cs.Insert(0,lpSavePath); lstrcpy((LPTSTR)lpErrorMsg,(LPCTSTR)cs); ff.Close(); return true;
401 :
デフォルトの名無しさん :02/09/20 23:55
>>398 指摘はしない。399の言うとおりだから。でも完全独学でこれだけ書けるんなら、
入社後「ちゃんと指導 and/or 教育してもらえれば」プログラマになれると思う。
現時点ではプログラム「らしきもの」は書けているけど、このコードのおかしな
点に気付かないならプログラマとして即戦力ではないと思う。
402 :
デフォルトの名無しさん :02/09/21 00:02
401はヒッキーです。信じてはいけません。
>399-401 アドバイスありがとうございました。 このスレで質問させていただいた理由は MFCを使って書いたので他のスレだと 余計にスレ違いになると思い、ここに書かせていただきました。 スレ違いと言われるなら素直に反省します。 すみませんでした。 >399 実力のあるフリをするつもりはありませんでした。 私の間違いを指摘していただくて書き込みました。 最後の勉強としてご指摘願いたいと思っておりました。 >400さん _T()の使い方をいまいち分かっておらず 使うべきところで使っていないより書いた方がましかと思って書いていました。 ご指摘ありがとうございます。 >401 即戦力などとは毛頭思っておりません。 現場の意見として重くとらえさせていただきます、ありがとうございました。 続く。。
>399-401 最後に、。 スレ違いにもかかわらず丁寧な指摘、非常に参考になりました。 仕事はすぐに決まるとは思いませんが、 がんばってプログラマになりたいと思います。 なによりPC、プログラムが好きでたまらないので これから精進していきたいと思います。 次お会いする時までによりいっそう腕を磨いておきます。 スレ違い失礼しました、 ずっと人に見てもらう機会などが無かった私には すごくためになりました。 本当にありがとうございました。
406 :
デフォルトの名無しさん :02/09/22 02:10
タブコントロール(CTabCtrl)のタブ位置を横&シングルラインにするとバグりませんか? リサイズ時に縦長にするとタブが途中で消えたり、(コントロールの横幅分だけしか描画されない?) InsertItemで追加していくとタブスクロール用のボタンが効かなかったり、 タブ位置を上→横に変更するとタブスクロール用のボタンが縦長になったり。
407 :
デフォルトの名無しさん :02/09/22 02:27
スライダーコントロールの背景色を指定したいのですが、やり方がわかりません。 システム色ではなく、赤とかピンクとかいろいろな色で作りたいのです。 ご存知の方、教えてください。 よろしくお願いします。
409 :
デフォルトの名無しさん :02/09/22 03:17
LVITEM ListItem; ListItem.mask = LVIF_TEXT; ListItem.pszText = "てきすと"; ListItem.iItem = 0; ListItem.iImage = 0; m_List.InsertItem(&ListItem); でリストにな〜んも表示されない。なんで?
>>409 >ListItem.pszText = "てきすと";
Basicじゃないんだぞ…
こっちのメンバ関数使ったら?
int InsertItem( int nItem, LPCTSTR lpszItem );
411 :
デフォルトの名無しさん :02/09/22 03:33
CListCtrl m_List; ←ClassWizで追加したヤシ こいつにOnInitDialogの中でInsertItemしてるがなんにも表示されない なんで??
>>411 ListItem.iSubItem = 0; //これが足りないよ
初期化について勉強すべし。
LVITEM ListItem;
って宣言しただけじゃ各メンバ変数の値は不定。
0になっているって保証はない。(宣言直後の値を見れば分かる)
ぐはぁ!それだ・・ どうもありがとう。。
414 :
デフォルトの名無しさん :02/09/22 15:15
エクスプローラみたいなのを作りたいんですが リストビューに表示するアイコンはどうやって取ってくるのですか?
>>414 教えて欲しい時は誠意を見せろ!
つーか穴を貸せ
416 :
デフォルトの名無しさん :02/09/22 15:48
ホモ氏ね
>414 ちょっと聞き方悪い、答える方も困るよ。 アイコンはどうやって取ってくるか! と聞かれた5ら 自分で用意しなさい、 と答えるのが普通なんだが それを聞きたいのか?
α 自分で用意する β SHGetFileInfo
MFC使ってソフト作る時 メンバ変数追加する時 どうしてます? private か protected か public の判断がつきません。 privateとpublicは分かるのですが、 普通Appウィザードが作成した クラス (CXXXDlgなど) を派生することってないですよね? とりあえずprotectedにしとくべきでしょうか? それともAppウィザードが作成した クラスを派生することを派生すること自体ありえないので publicにしても問題ないのでしょうか?
>>420 APPウィザード使うかどうかに関わりなく、
サブクラス作んないんならprotectedは不要。
> 普通Appウィザードが作成した
> クラス (CXXXDlgなど) を派生することってないですよね?
あなた自身が、なぜ「普通」と書いたのか、
その理由を考えてみるこった。
>>420 まあ、Wizardで作ったクラスでも、派生することはありえなくもないけど、
普通はアプリケーションに依存したコード書くから、最終的な派生クラスとして、
protectedを無視した決め方してもそれほど実害はないかな。
publicは、コードを少しでも減らしたいとか言う理由じゃなかったら、
セオリー通りにあまり使わないようにした方がいいかと。
publicと( protected || private )は派生するしないで分けるものじゃないし。
(そもそも、MFCもpublicメンバー使いまくりなわけだが。m_hWndとかの重要なものでさえ)
すみません、質問させていただきます。 スタティックテキストに文字色と背景色を設定する事は出来たんですが(OnCtlColorによって) たとえば、ボタンを押して、スタティックテキストの文字色と背景色を 変更するにはどうすればいいんでしょうか
424 :
デフォルトの名無しさん :02/09/22 19:10
エクスプローラ風のファイラーが作りたいんだってば。 ファイルをドラッグしてフォルダにドロップできたり、ダブルクリックでファイルを開いたり 外からファイルをドロップしたりをリストビューでやりたいんだけど、 わかんないことだらけだから手っ取り早くエクスプローラ風のソフトのソースの場所教えてちょ。 たのんま
HOGEみたいなソフトを作りたいけど、 面倒くさいからソースくれ? それって「作る」うちに入るのかナ?
426 :
デフォルトの名無しさん :02/09/22 19:39
作るに入らなくていいからソースくれ
427 :
デフォルトの名無しさん :02/09/22 22:06
あの・・・・・・・・ VC++始めるにあたってよい参考書さがしてるんですけど、 みなさんおすすめ教えてください。 一応初心者向けのでおねがいします。 VC++も使ったことがあるにはあるんですけど、まぁ、オブジェクト指向初心者ってことで。
初心者なら 山本 信雄のプログラミング学習シリーズ VisualC++ っていうのが全三巻ででてる。 俺はそれを使ったがなかなかお勧め。 CとC++の基本が分かってる人にはお勧めだよ。 Cとかよくわかってなかったら駄目だけど。
うぇ〜んくれくれ厨とスレ違いな質問なんてもうやだよう
431 :
デフォルトの名無しさん :02/09/22 22:36
マスタリングTCP/IPはとてもわかりやすくてお勧めです。
433 :
デフォルトの名無しさん :02/09/22 23:09
>>428 基本ってどの程度ですかね?
(分かってないこともないが、分かってるとも断言できないレベルなので)
今日探してみたのですが、あまりにも種類が多くて・・・
しかもこれ系は高いからあれもこれもとはいかないのですよ。
迷ったあげく、経験者の意見を参考にと。
>433 俺の場合は「やさしいC」みたいな本終えてから この本始めたよ。 三巻構成で金かかるけど(1巻2800円) その文わかりやすいと思うなぁ。 二巻は主にC++のクラスについてだから C++がよく理解できてるなら飛ばしてもいかもしれない。 流れとしたら SDK->オブジェクト志向(C++のクラス)->MFC っていう構成。 逆に買って失敗した本は 作って分かる VisualC++6.0 ↑なにもわからなかったよw 前述の三冊してから読んだらまぁ面白かった。 参考に。。
>>433 VisualC++6.0 プログラミング入門
桜田幸嗣/田口景介
この本は俺がVsualC++買ったときに同梱されていた本。
持ってなければこれ辺りが無難だと思う。
436 :
デフォルトの名無しさん :02/09/23 11:16
ダイアログベースのプログラムを書いているのですが、 スケルトンとしてウィザードが作成した メイン画面のダイアログと別に自分で リソースを挿入、からダイアログを作成し、 クラスを割り当てました。 コマンドラインが渡された時はそちらのダイアログを 使用するよう切り替えたいのですが、 ほとんど上手くいってるのですが、 タイトルバー左隅のアイコンの表示の仕方がわかりません。 どうやったらもともと用意されてるダイアログのように タイトルバー上にアイコンを描画できるのでしょうか?
>>436 WM_SETICONを
窓に
投げつけろ!
>>436 OnInitDialogの中で
HICON hIcon=::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
SetIcon(hIcon,TRUE);
SetIcon(hIcon,FALSE);
でいいんじゃないの?違ってたらゴメン
以下のようにしてコンボボックスにA〜Jの選択肢を表示し 例えばAを選択すると num に"1"を渡すようにするには どうすればよいでしょうか? int i; int num; CString select; CString name[]={"A","B","C"...."J"}; void C***Dlg::OnDropdownCombo() { m_combo.ResetContent(); for(i=0; i<=10; i++){ m_combo.InsertString(0,name[i]); } } void C***Dlg::OnSelchangeCombo() { m_combo.GetLBText(0,select); m_combo.SetWindowText(select); }
>434,435 さんくす あす本屋いってみます
>>440 num = m_combo.GetCurSel(); じゃダメなの?
それじゃダメ。
>>443 それじゃ今選ばれてるテキストを取ってきて文字列の配列と比較でもしなさい。
>>443 SetItemData & GetItemData
俺は440じゃないんだが・・・ num = m_combo.GetCurSel() + 1;
ありがとうございます。 num=m_combo.GetCurSel()+1; でうまくいきました。
448 :
デフォルトの名無しさん :02/09/24 03:04
CViewクラスをカスタマイズしたビューをダイアログアプリで使うにはどうすればいいですか? ダイアログのフォームにビューを張り付けることが出来れば最高なんですけど
ViewをActiveXコントロールにしてしまふ。(w
そういうのはCodeGuruやCodeProjectにあったはず
GetWindowTextで受け取った数列をint型の変数に 渡すにはどうすればよいか教えてください。
int i = boost::lexical_cast<int>(s);
どうもすいませんでした。 数列の場合、GetWindowTextなど使わずに メンバ変数を使えばよかっただけでした。
454 :
デフォルトの名無しさん :02/09/24 22:59
lpszHostNameが無効な場合(www.2ch.netttttとか)に例外を捕捉したいんですが。。。 CInternetSession *m_pInternetSession = new CInternetSession(); CHttpConnection *pHttp = NULL; CHttpFile *pFile = NULL; : : pHttp = m_pInternetSession->GetHttpConnection(lpszHostName, INTERNET_DEFAULT_HTTP_PORT); if( pHttp == NULL ) return FALSE; // ホントはもっとちゃんとエラーメッセージ書いてます pFile = pHttp->OpenRequest("GET", (LPCTSTR)strRequestFile, lpszURL); if( pFile == NULL ) return FALSE; // ホントはもっとちゃんとエラーメッセージ書いてます try { pFile->SendRequest(); } catch( CInternetException err ) { AfxMessageBox("エラー"); return FALSE; } 捕捉できない。。。
>>454 例外は発生せず、サーバーから404とかが返ってくるのみ
DWORD dwStatus = NULL;
pFile->QueryInfoStatusCode( dwStatus );
>>455 ファイルがない場合じゃなくて、サーバが見つからない場合のことなんですが。
QueryInfoStatusCodeを実行するのはSendRequestを呼び出した後でしょう?
そのSendRequestを実行中に例外が発生すると思うんです。
>456 スマン、よく見てなかった。 やって見たら数秒後に飛んだけど、 ちなみにキャッチはポインタで捕ってる。 catch ( CInternetException* e )
>>457 ポインタで取ったらいけました!
ありがとう!!
…ひょっとして常識?(T-T)
>478 俺も前に同じハマり方して、試行錯誤で 脱出した事を思い出したので。。。 常識なのかどうかはわかんないけど それ以来 CException 系はポインタで捕るようにはしている。 詳細知っている人いたらキボンヌ。
×>478 ○>458
ExcelをOLEとして組み込んで作りたいけど、 参考になる本とかURL教えてください。 お願いします。 (プログラムに多機能なGridを使いたいだけです。)
462 :
デフォルトの名無しさん :02/09/25 13:11
>>461 質問ならあげたほうがいい
>(プログラムに多機能なGridを使いたいだけです。)
市販のOCXとかを使ったほうがいいかもしれない
それかwww.codeguru.com
463 :
デフォルトの名無しさん :02/09/25 14:14
知人にヘルプファイルを作成してもらったのですが 上手く呼ぶ出せなくて困っています。 Test.exeの横にファイルタイトルが同じ Test.HLPとTest.cntを置いた状態で F1キーを押すと このトピックは存在しません。アプリケーションの製造元に 問い合わせて、新しいヘルプファイルを入手してください。(129) ↑このようなメッセージボックスが表示されます。 ヘルプファイルの横にTest.GIDというファイルが作成されます。 どこが間違っているのでしょうか? また、ヘルプファイルを他の場所に置いた状態で F1を推して見つからないと言われて自分で 場所を指定した場合にも同じように表示されます。 よろしくお願いします。
↑の追記です。 Test.HLP自体を ダブルクリックで起動すると 正常にヘルプが表示されます。 よろしくお願いします。
465 :
デフォルトの名無しさん :02/09/27 04:31
CHtmlViewでマウスの右ボタンに関するイベントを処理するにはどうしたらいいでしょう? OnRButtonDown や OnNcRButtonDown では捕捉できませんでした。 (端っこの枠の部分ではできましたが^^;)
>>465 OnContextMenu()は試してみた?
>>465 CHtmlViewってあんまり情報ないよね。
View.hに
void OnHogeRClick();
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
の3行をを追加して、View.cppに
BEGIN_DISPATCH_MAP(CxxxView, CHtmlView)
DISP_FUNCTION_ID(CxxxView, "oncontextmenu", DISPID_HTMLDOCUMENTEVENTS_ONCONTEXTMENU, OnHogeRClick, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
BEGIN_INTERFACE_MAP(CxxxView, CHtmlView)
INTERFACE_PART(CxxxView, DIID_HTMLDocumentEvents, Dispatch)
END_INTERFACE_MAP()
void CxxxView::OnHogeRClick()
{
// ここで右クリックしたときの処理
}
こんな感じでどうかな。もちろんCxxxViewは自分のViewに書き換えて。
ちと言い方がまずかったですね。すいません。
ポップアプメニュー云々ではなく、単に右ボタンのdown/upを検知したかったのです。
>>466 一応試したのですが無反応ですた
>>467 DISPID_HTMLDOCUMENTEVENTS_ONCONTEXTMENU が見つからないって言われるのはヘッダが古いからでしょうか?
かわりに DISPID_HTMLDOCUMENTEVENTS_ONMOUSEDOWN で試したのですが無反応です。。。なんでだろ。
すいません。ちょっと違うかもしれませんが MFC42.dllを新版に差し替えたいんですが、Win2kのシステムファイル保護機能が 働いて、リブートすると戻されてしまいます この機能の停止方法がMSページに書いてあるのですが、止まってくれません クリーンインストール状態でも駄目なんですが何か対策ご存知の方いらっしゃいませんか? vcインストール、vc sp5インストールと順を追ってやって見ても変化なしでした
ずいぶん前の話で申し訳ないが、
>>428 の本を見たけど分かりやすいね。
おれは
>>435 でMFCから入ったもんで思わず
第1巻買ってしまった。
471 :
名無しさん@Meadow :02/09/29 17:18
タスクバーに表示されず タイトルバーも持たない ウィンドウを作るにはどーしたらいいのでしょう? 今ダイアログベースで作成していてスタイルをポップアップ、 タイトルバーのチェックを外しましたがだめでした。 (タイトルバーは消えたがタスクバーに表示されている) VBでいうBorderStyleを"0-なし"にした状態を希望してます。
472 :
デフォルトの名無しさん :02/09/29 18:11
>>472 回答どうも。
そうか、できないのですか…。
474 :
デフォルトの名無しさん :02/09/29 18:59
ダイアログベースのアプリでコード上から直接コントロールを消したり、新しく生成したりするには どうしたらいいですか?
475 :
デフォルトの名無しさん :02/09/29 19:32
>472 ウソ言うな
477 :
デフォルトの名無しさん :02/09/30 00:38
>465 そそ、普通には取れないんだよな。 おいらはPreTranslateMessageで横取り(?)してまふ。
>476 答えてやれよ− >471 普通のウインドウなら ModiftyStyleEx で WS_EX_TOOLWINDOW を追加すれば良いんだが、 ダイアログでも効くのかな?試してみて。
>474 ダイアログ内のコントロールをコードで作成・破棄するのは技術的には可能だけど、 相当面倒。聞かなければ実現方法が分からないレベルだとかなり苦労すると思う。 (コントロールIDの割り付けやタブオーダーの振り直しなど) どういう理由で作ったり消したりしたいのか分からないけど、 最初から全部リソースで作っといて、(コントロールの座標が重なっていても構わずに) OnInitDialog で初期状態で必要無いコントロールは全て非表示にする。 後は、コードで必要に応じて表示・非表示を切り替えた方が全然楽だ。 細かい調整はリソースファイルを直接書き換えたら良い。 俺ならそうする。
>>477 なるほど。
あんまりスマートじゃないけどそれしかないかな。
481 :
名無しさん@Meadow :02/09/30 11:09
>>478 できました ありがとう!
OnInitDialog() に
ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW, 0);
を書いたら実現できました。
482 :
デフォルトの名無しさん :02/09/30 20:33
リストビュー(レポート)にラージアイコンを表示させることは出来ますか?
できますよ
なにやら白抜きの□が表示され照るみたいですがこれは アイコンを指定しているindexが悪いのですか?
485 :
デフォルトの名無しさん :02/10/01 01:11
MFCのお勧めの本を教えてくださいm(_ _)m
無視しなくてもいいやないですか(#゚Д゚)y-~~
>>454 >>457 >>458 >>459 亀レススマソ、
気になって調べて見たんだけど BOOL CHttpFile::SendRequest の中に
下記の記述があり、
if (!bRet) AfxThrowInternetException(m_dwContext);
AfxThrowInternetException の中に
THROW(pException);
という記述がありました。
pExceptionは、CInternetException* 型なので、キャッチするとき
はポインタで受ける必要があるみたいです。
catch ( CInternetException* e )
489 :
デフォルトの名無しさん :02/10/03 00:45
CDialogを継承したクラスを、templateにすることって可能でしょうか?
490 :
デフォルトの名無しさん :02/10/03 02:58
●●●●●●●●「オセロさえ納期内に作れない=OO役立たず 」祭り●●●●●●● /| | |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ | | | ̄ ̄ ̄ /| || | | | / /|TTTTTT TTTTTTTTTT||TTTTT | /\ | /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^ | / / |// / /| | / / |_|/|/|/|/| | / / |文|/ // / |/ /. _.| ̄|/|/|/ Λ_Λ /|\/ / / |/ / (___) /| / / /ヽ /〔 非OO 〕〕つ | | ̄| | |ヽ/l `/二二ヽ | | |/| |__|/ Λ_Λ / /(_) | |/| |/ ( ´∀`) (_) Λ_Λ | | |/ // / ^ ̄]゚ (` ) | |/ ゚/ ̄ ̄_ヽ ⊂〔〔 非OO 〕
VC+++MFCはあんまりOOじゃないから余所荒らせよ
Gatesに文句言えよ。
教えてください!! MSVCで作ってるアプリから、spawn系関数でイメージビューワを起動していますが、 当然のことながらビューワ起動後のアクティブウィンドウはビューワになります。 ここで、起動もとのアプリを、プログラム側からの制御でアクティブウィンドウに したいのですが、どのようにやったらいいのでしょうか? ちなみに、ビューワ起動。。。。殺す部分は、以下のように作っています。 char CMD[]="C:\\Program Files\\Windows NT\\Accessories\\ImageVue\\kodakimg.exe"; char filename[]="C:\\WINNT\\nwelcome.bmp"; int ProcessHandle = _spawnlp(_P_NOWAIT, CMD, CMD, filename, NULL ); ・ ・ ・ ・ ・ TerminateProcess( (void *)ProcessHandle, 0); ※ 文字列の中身は、変えています。だから、フルパス指定でpは不要だとかいじめないでね。 よろしくおねがいします。
493の続きです。 とりあえず、 this->SetActiveWindow(); this->SetForegroundWindow(); あたりが怪しいと思い、起動直後に入れてみましたが、状況は変わりませんでした。 そこで、タイマーをかまして、0.5秒後にこの二つの命令が動くようにしました。 これで、とりあえず当初の目的は達成されましたが、どうもダサい。。。。。。 もっとスマートな方法はありませんでしょうか?
495 :
デフォルトの名無しさん :02/10/03 11:24
>>488 THROWは、newしたポインタを投げてるので、CATCH(or CATCH_ALL)
で受けてやらないと、メモリリークします。
CATCHの後には、END_CATCH(or END_CATCH_ALL)も忘れずに。
C++の例外はインスタンスで投げて、const&で受けるのが常識だけど、
VC++の例外処理がまともじゃなかった頃から、MFCで例外を使う
苦肉の策として、THROW、CATCHが作られたみたいです。
現在のVC++ならthrow CLASS、catch const CLASS&で問題ないんですが。
>>493 _spawn じゃなくて CreateProcess() 使って、STARTUPINFO で
SW_SHOWNOACTIVATE あたりを指定してみたら?
>>495 なるほど!
んじゃぁ、MFCが勝手に投げる例外はCATCHで受けたほうが無難でいいですね。
どうもですー
>>496 様
アドバイスありがとうございました。
CreateProcessでビューワを起動し、WaitForInputIdleで起動し終わるのを待って
this->SetActiveWindow();
this->SetForegroundWindow();
で元アプリをアクティブにして、
TerminateProcess(PROCESS_INFORMATION.hProcess)
でビューワを殺すことにしました。多少画面がチラチラしますが、
かなりスマートにできました.
STARTUPINFO.wShowWindow = SW_SHOWNOACTIVATE
を指定してみましたが、ビューワがアクティブになるだけでした。。。
このあたり、間違いがあれば、指摘していただけるとありがたいです。
さらに見てみたけど。。。 char CMD[]="C:\\Program Files\\Windows NT\\Accessories\\ImageVue\\kodakimg.exe"; char filename[]="C:\\WINNT\\nwelcome.bmp"; int ProcessHandle = _spawnlp(_P_NOWAIT, CMD, CMD, filename, NULL ); WaitForInputIdle( ProcessHandle, INFINITE ); this->SetActiveWindow(); this->SetForegroundWindow(); でも、結果は同じでした.
>>499 STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW; ←これ
si.wShowWindow = SW_SHOWNOACTIVATE;
ちゃんと指定した? うちでは意図した通りに動いたんだけど。
>>496 様!!
ありがとうございます。そのキーワード、入れていませんでした。
おかげさまでひじょうに麗しい動きを見せてくれるようになりました。
502 :
名無しさん@Meadow :02/10/03 20:39
ポップアップメニューのON_UPDATE_COMMAND_UIについて、 今下のようにポップアップメニューを呼び出しています。 CMenu menu; if (menu.LoadMenu(IDR_MENU_POPUP)){ CMenu* pPopup = menu.GetSubMenu(0); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); PostMessage(WM_NULL, 0L, 0L); } ダイアログベースのアプリケーションなのですが ON_UPDATE_COMMAND_UIでメニューのEnableを制御 しようとしても、うまく呼び出されません。 # 自分としてはポップアップメニューを開いたときに # 呼び出されて欲しいのですが、現状ではそのメニュー項目を # クリックしたときに呼び出されているようです。 どのようにしたらよいのでしょう?
503 :
デフォルトの名無しさん :02/10/03 22:00
お し え て く だ さ い アクロバットリーダーのようにブラウザ上でPDFファイル を読込もうとすると、自動起動してブラウザ内部に アクロバットリーダーが起動しますよね。 そのようなアプリを作りたいのですがどのように作るのですか? おねがいします。
STDでMFCの関数を使うには、なにをインクルードしたらいいのでしょうか? だれか教えて下さい。
505 :
デフォルトの名無しさん :02/10/03 22:20
STDって? 性病?
507 :
デフォルトの名無しさん :02/10/03 22:27
な ん だ か し ら ん が 5 0 4 必 死 だ な 藁
>>509 おまえがわかんねーからってあおってんじゃねーよ!!
氏ね、あふぉ
>504 おいおい、知らない人に質問しておいて えらそうな口聞くじゃないかw いるんだよなぁ、お前みたいな勘違いしてるやつ。 ちなみに俺も含めてここに居る人の大抵はお前の 質問の答えくらいわかってると思うよ。 まぁもっと困って頭を冷やしなさい。
>>502 ダイアログではデフォルトではON_UPDATE_COMMAND_UIは効かないので
OnInitMenuPopup内でチェックする。
別の方法としてアイドル処理でON_UPDATE_COMMAND_UIを捕まえる例が
確かCodeGuruにあった。
>>488 小亀レスですが勉強になりますたありがとう
>>495 catch (CException* pE) {
//例外処理
pE->Delete() ;
}
でもいいらしい。これなら他の例外処理とまとめられる。
>>498 余計なことかもしれないけど…
TerminateProcess使うよりWM_CLOSEをポストした方がよくないかなあ。
517 :
デフォルトの名無しさん :02/10/05 12:32
質問。 CToolBarを動的に作ったときボタンをEnableにする方法がわかりません。 リソースエディタでツールバーを作ったときは、 ビルドして動かすと最初はボタンがDISABLEになっている。 ClassWizardでハンドラを作るとEnableになる。 CToolBarを動的に作ったときはClassWizardでハンドラを 作るということができないのでどうすれば?
>>517 そういう質問何度か出てるけど、ClassWizardで作れないなら自力で書く。
>>518 で、自力で何を書けばいいのかを聞きたいんですけど。
CToolBarを動的に作ったとき、ツールボタンをEnableにするには?
という質問です。
CToolBarCtrlを引っ張り出してEnableButton()してみたのだが反応なし。 なので困ってます。
521 :
アホで御免なさい :02/10/06 01:26
CWinAppクラスのソースを読みたいんですが 何処にあるのか分かりません。ヘルプ!!
522 :
デフォルトの名無しさん :02/10/06 01:30
>>521 VCのファイルの中を検索するやつがあるだろ。
あれでCドライブで、class CWinApp をキーとして検索すれば場所がわかる。
WM_COMMANDだけPreTranslateMessage()でとればいいや、と思っていたのだが あらかじめメッセージマッピングしておかなきゃだめなんだろーか? ボタンをEnableにするためだけに?
正直スマンのですが 検索しても見つからないんですよ。 よろしければファイル名を教えていただけませんか? もしかして、(よく分からんのだが)dllってのに入ってたり!?
>524 最初からソースファイルをインストールしてなかったりしてね。 大体どこを検索してるの? VCのインストールディレクトリの配下全部調べました? ちょっと手元に無いので確実じゃないけど "wincore.cpp"だったかな?
タスクトレイのみのアプリケーションを作る時ってどうするもんなのでしょう。 とりあえずSDIでView/Docを消してMainFrameのみで やってますが皆さんどのようにやってますか?
>526 検索ワードは タスクトレイアプリケーション
>>524 下記が無ければインストールしてないんじゃないかな?
VC98\MFC\Include\AFXWIN.H
VC98\MFC\SRC\APPCORE.CPP
>525,>528 ありがとうございます。 見つかりました。検索のし方が悪かったみたいです。
>>526 前に実験したことあるけど、MFC使うならおっしゃる通り、CMainFrame 派生が一番
いいよ。サイズ 0 で、アイコンや MENU は NULLのウィンドウクラス作ってさ。
メインウィンドウを CDialog にすると CMainFrame よりメモリ食う。
ましてや、設定ダイアログをそのまま非表示にして、メニューで「設定」が
選択されたら this->ShowWindow(SW_SHOW) なんてのはもっての外。
VBアプリじゃないんだから(w
ま軽さを突き詰めたら「MFC使うな」ってことになるんだけどさ...
あ、CMainFrame というか CFrameWnd の派生。
532 :
デフォルトの名無しさん :02/10/06 23:28
だれか > CDialogを継承したクラスを、templateにすることって可能でしょうか? おしえてくだちい・・・
templateって、 temaplte< class T> のtemplate?
何を可変(template)にするのさ?
>>535 template < typename T > class CHoge : public CDialog {
private: const T * m_gehol
};
希望です。
537 :
デフォルトの名無しさん :02/10/06 23:51
>>536 m_gehol は m_geho;
すんまそん。
どうでもいい
539 :
デフォルトの名無しさん :02/10/07 00:09
まぁそういわずに。
>>536 別のアプローチを考えそうな気がする。普通は。
>>532 templateクラスがメッセージマップを持たなければ可能。
メッセージマップがある場合はかなり厄介。
>>541 ですか…
メッセージマップ持ってますわぁ。あきらめます。
>>542 親クラスにメッセージマップを持たせて、そこからtemplateクラスを
派生したらどうかな?
メッセージハンドラをvirtualにしておけば、ちゃんと動くはず。
545 :
デフォルトの名無しさん :02/10/07 17:25
StretchDIBits() SetDIBitsToDevice() DitBlt() の違いを教えてください(゚ー゚*)
DLLからメインの関数って使える?
>>547 メインの関数というのがいまいち意味不明だが、EXEのモジュールにある
関数という意味なら普通にexportして使えるよ。
550 :
デフォルトの名無しさん :02/10/07 23:11
質問です。 時間を設定しておいて、その時間になったらアプリケーションの起動等をさせ るプログラムを作っています。 実際に今の状態で使えているのですが、性質上、複数起動出来てしまうのが気 になっています。 何か、複数起動を禁止する方法は無いのでしょうか。 ご存じの方、教えて下さい。
>>551 レス、ありがとうございます。
早速調べて試してみます。
VS.NETで新規作成、C++プロジェクト、MFCアプリケーションとやって、 SDIで基本クラスCEditViewにして、そのままビルドすると簡単な テキストエディタになるんですが、ファイルに保存するとshift-jisでは 保存されません。どうしたらshift-jisで保存されますか? どこかでコードページでも指定するんでしょうか。
下記の現象が起きて困っています。どのようにすればよいでしょうか? MFC AppliWizard(exe)を選んで新規作成。 ダイアログベースのアプリを選択し、その他はデフォルトのまま。 エディットボックスを追加。 ClassWizardメンバ変数追加でIDC_EDIT1に適当な変数を割り当てる。 上記を行うと確実に下記が発生します。 ClassViewからC***Dlgが消える。 FileViewで***Dlg.cppを編集すると this-> とか書いてもメンバの 補間機能が使えなくなっている。 環境 Win2000 VC6++SP5スタンダードエディション
>>553 VS.NET知らないけど、プロジェクトの設定で
_UNICODEとかをdefineするようになってたらそれはずせば?
>>554 本当にそれしかやってないならバグでしょう。
SP当てたタイミングでそういう現象が出るようになったって事ではない?
なんにせよMSに相談するのがいいでしょう。
とりあえず
> ClassViewからC***Dlgが消える。
> FileViewで***Dlg.cppを編集すると this-> とか書いてもメンバの
を復活するには 一端 ***.CLWを消してからクラスウィザード開いて
そのままOKで出来ると思うけど。
>を復活するには 一端 ***.CLWを消してからクラスウィザード開いて >そのままOKで出来ると思うけど。 うちも ClassView からメンバ関数を削除したりすると、たまにそうなる。 ***Dlg.h に変更を加えるだけで復活する。
>>554 そういえば ウィルスチェックしてたら
そんな現象が起こりやすかったような気がしないでもないような。
今日やっても再現しますね。
ちなみに研究室の
WinMe+VC6CP5プロフェッショナルエディション
では再現しませんでした。
>>555 >一端 ***.CLWを消してからクラスウィザード開いて
>そのままOKで出来ると思うけど。
これではだめでした。
>>556 >***Dlg.h に変更を加えるだけで復活する。
これは上手くいきますね。今後これで対応することにします。
レスくれた方どうもありがとうございました。
559 :
デフォルトの名無しさん :02/10/08 21:01
MFCのAfxBeginThreadに渡す制御関数は、 staticでなければならいないのでしょうか? ご存知の方おながいします。
>>558 VC6sp6 pro 使ってるけど、特定のクラスで、ClassView からメンバ関数を削除したり
すると ClassViewから消える。まぁ (゜ε ゜)キニシナイ ことにしています。
>>559 引数にLPVOIDを持ち、UINTを返すグローバル関数なら何でも
よいのでは?
>>559 「staticでないメンバ関数を渡せるか?」ということかな?
だとしたら多分無理なんじゃないかな...
thisポインタを渡さなくてはいけないので。(という自分もよく分からず)
class Hoge :
{
main();
static UINT Foo(LPVOID ptr);
}
Hoge::main()
{
AfxBeginThread(Hoge::Foo, (LPVOID)this);
}
Hoge::Foo(LPVOID ptr)
{
Hoge* a = (Hoge*)ptr;
a->何か;
}
なら可能でしょう。
Fooを実行中にインスタンスがデストラクトされたらマズいことになるので注意。
>>562 スマソ。sp5の間違いですた。
>559 ヒープでも可
565 :
デフォルトの名無しさん :02/10/08 23:53
VC.NET 買った。が。 Win32 プログラム+MFCというプログラムが作れない・・・・ (↑MFC ベースのプログラムではなく、Win32 プログラムで MFC を使う) コンソール+MFCはできるのに・・・ これってどうしようもないんでしょうか??
あ、実際は
>>563 みたいなのは危険で、ASSERTで怒られるので
thisポインタを直接別スレッドに渡すのは止めたほうがよいらしい。
567 :
デフォルトの名無しさん :02/10/08 23:57
>>565 [Windows アプリケーション]
Win32 プログラムが作成されます。
Win32 プログラムとは C または C++ で記述された実行可能アプリケーション (EXE) であり、
Win32 API を呼び出してグラフィカル ユーザー インターフェイスを作成します。
「Windows アプリケーションには MFC サポートや ATL サポートを追加できません。 」
しょぼ(w
>>563 別に必ずしもthisを渡す必要は無いよ。
>>561 >>560 >>569 ありがd。
グローバル関数の存在を知らず、
メンバ関数を渡そうとしてました。
this渡しと同期化でなんとかなればいいのだけど。
>>559 staticという表現をどういう意味で使用してるかよく分からない。
「宣言の前にstaticをつけなければならないの?」と言う意味なら
別に必要ない。↓こんな感じでもいい。
int gInt = 0;
BOOL gFlag = TRUE;
UINT gTempThread (void* pParam) {
for ( ; gInt<50 ; gInt++) Sleep(100);
gFlag = FALSE;
return 0;
}
class CTemp {
public:
void Func(){
mpThreadList = AfxBeginThread(gTempThread ,(void*)0);
while (gFlag) {
printf("%d\n",gInt);
Sleep(50);
}
}
private:
CWinThread* mpThreadList;
};
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){
CTemp oTemp;
oTemp.Func();
return 0;
}
おっと2分遅れだった。
>>570 >this渡しと同期化でなんとかなればいいのだけど。
独立スレッドのほうでメンバ変数などを使用する場合は、this
を渡せば大丈夫。
571の例では(CTemp*)pParam->とすることでメンバにアクセ
スできる。
スレッドを呼び出す部分より後ろに、もしくは別ファイルに
独立スレッドがある場合は、呼び出すところより前に
extern UINT gTempThread (void* pParam);
などと宣言しておくこと。(スコープの外でね)
574 :
デフォルトの名無しさん :02/10/09 01:33
市販のキーロガーやスパイウェアってタスクマネージャに表示されないように グローバルフック仕込んでいるみたいだけど、あれってどうやるんですか? 例えば、 a.exe がフックをセットするプログラムで、 a.dll がフックプロシージャを含む dll だとします。 Windows開始時に起動される a.exe がデスクトップを表示している explorer.exe に a.dll のフックプロシージャをセットし、 アンフックせずに終了すれば、explorer.exe 内に a.dll が常駐 した状態になるんでしょうか。 ただ試してみたところ、a.exeでアンフックせずに終了しても自動的に アンフックされてしまったみたいでした。 Explorer側に入り込んだフックプロシージャ内で、再度自分自身に フックをかければOKなのでしょうか。 最初にフックをセットするプログラム側では、上記処理が完了するまで 終了を待つことにすればよいかもしれませんが、イマイチ実現方法が かりません。 どなたか実現方法をご存知のかたいらっしゃいませんか?
>>574 作り方も分からないものを作る必要は無いだろ。
576 :
デフォルトの名無しさん :02/10/09 03:25
>>575 >作り方も分からないものを作る必要は無い
その考えに従えば、全ての発明はなくなるなw
577 :
デフォルトの名無しさん :02/10/09 03:30
>575 一度でも自分で何か調べながらモノを作ったことがあるならそんなことはアタマに浮かばないはずだけどな。 すくなくともプログラミングはしたことないだろ。
578 :
IISObject :02/10/09 03:44
多分MFCの範疇じゃないと思うけどちょっと質問。 VC6.0にてWizardでActiveXサーバコンポーネントをそのまま 生成すると、ASPではServer.CreateObject("XXX.Class") で上手くいってたのに、WinXP SP1を入れてから同様のコードで 「オブジェクトを作成できません」のエラーが出るように なってしまいました。 皆さんはどうなっていますか? ADODB.Recordsetなどは上手く作成されるのですが…。 因みに new ActiveXObject("XXX.Class")でも動かなくなりました。
>>577 574がマトモなものを作るとは思えなかったもんでね。
スパイウェアの作り方教えろと言ってるようなもんだろ。
そんなものは自分で作れるようになってから作れってこった。
うぇーん。なんで範疇じゃないのに質問するんだよー。 こんなのもうヤダよー。
>>579 最初からそう書けよ。
>>575 と全然内容が違うだろ。
しょーもないこと書くからこうなるんだ。
582 :
デフォルトの名無しさん :02/10/09 03:53
>>575 >作り方も分からないものを作る必要は無い
>>575 が毎日嫌々単純な肉体労働をしてるってことだな。
CMiniFrameWndって普通どんな用途で使うんでしょ?
584 :
デフォルトの名無しさん :02/10/09 04:05
>>581 >>579 がやり方知ってんならそれでもいいんだけど、知らないんだろ。
知ってんなら答えてみ。
>>578 アクセス権がなかったことが原因でした。
無事解決しました。
どっとはれ。
>>584 ちょっと検索したら腐るほど出てきたぞ。
そのうち95%くらいは本当に腐ってるだろうがな
588 :
デフォルトの名無しさん :02/10/10 00:22
590 :
デフォルトの名無しさん :02/10/10 14:19
258,000,000万件もでてきたw
Edit Controlを使ったテキストエディタを作ってます。 行番号をつけたいんですがどうすればいいでしょうか
592 :
デフォルトの名無しさん :02/10/15 18:40
C++.net&MFCを使っています。 二つのListBoxがあってタブキーを押すと交互に二つのListBox のフォーカスが入れ替わるようにしたいのですが、 その下にOKボタン等もあって普通にタブオーダーを決めたのでは 二つのウインドウ間だけを行き来させることができません。 これを解決する方法はありますでしょうか? またどちらかのListBoxにフォーカスがあるということを よりよくわからせたい(ListBoxの周りが太字になったり浮き上がったりするような方法で) のですがこのような方法はあるのでしょうか? ご存知のかた 宜しくお願いいたします。
前者:OKボタンのプロパティでタブストップのチェックをはずす。 後者:GetFocusでListBoxにフォーカスがあるときにスタイルを変更したり色変えたり 好きなように
594 :
ひよっこプログラマー :02/10/15 23:34
VCです。 テキストファイルを読み込みたいのですが、 fp = fopen("ifile","r"); if(fp==NULL){ printf("失敗\n"); exit(1);} として、よみこもうとしたのですが、 失敗 としか、でません。ファイルをどこに置けばいいのでしょうか? ちなみに今はデバッグなどのファイルがある場所に置いてます。
>594 >デバッグなどのファイルがある場所 これってDebugビルドしたファイルが出力される ディレクトリのことだよね? /Debug/のこと。 そこでいいよ。 ただしVC上からCtrl+F5とかで起動した時は プロジェクトファイルの置いてあるディレクトリ、 つまりDebugのひとつ上のディレクトリがカレントディレクトリと 見なされるので注意。 作ったプログラムの横において ダブルクリックにてプログラムを起動するなら 横に置くだけでいい。 またはfopenの第一引数にファイル名のような相対パスで 指定するのではなく"C:\test\ifile" などと絶対パスで指定したらどこから起動しようが関係ないので 取り合えずにはお勧め。
>564 >595 あ、ほんとだ、気付かなかった。 こういうミスはプログラム以前に人格を問われるので 次から気をつけてね。
598 :
ひよっこプログラマー :02/10/15 23:48
気をつけます。
>597 こういうミスもプログラム以前に性格を問われるので 次から気をつけてね。
600 :
デフォルトの名無しさん :02/10/16 03:26
ListBoxの見出し部分を二つみっつに切ってる場合 ウインドウサイズを変えても見出し部分のサイズは変わらないですよね。 あれをウインドウのサイズに合わせて比率で動かすようにスルにはどうしたらよいのでしょう?
>>600 ListViewコントロールの間違いだと思うけど、自分で計算してSetColumnWidthじゃないかな。
また質問に来てしまいました。 CD-ROMドライブがEドライブだとして。。。。。 struct stat fstat; stat( Dir1, &fstat); if( ( fstat.st_mode & _S_IWRITE ) == _S_IWRITE ) { ・・・・・ というソースで、Dir1で指定されたフォルダが書き込み可か否かを 調べようとしました。 ここで、Dir1="E:\folder1"とした場合、書き込み可のビットは立っていませんが、 Dir1="E:\"とした場合、書き込み可のフラグが立ってしまいます。 んで、仕方が無いのでE:\はCDドライブだよ(HDDじゃないよ、で充分)、 という情報を取りたいと思うのですが、どのようにしたらいいのでしょう? ご存知の方、ご教授ください。
603 :
デフォルトの名無しさん :02/10/16 11:04
>>602 GetDriveType とか GetVolumeInformation とかじゃないのかなー。
>>603 様
ありがとうございます。
GetDriveTypeで目的が果たせそうです。
感謝感謝。
すんません、、、 バブルソートを行いたいのですが、2つの文字列を比較したときの 文字コードの老若を知るヒントを教えていただけないでしょうか?
書き忘れました。2つの文字列はCString型です。
Ageで書くべきでした…よろしくお願いします。
せめてMSDNでCStringのメンバ関数見ようよ Compare
>608 MSDN見てみましたが、メンバ関数がたくさんありすぎて… どうもありがとうございました。
610 :
デフォルトの名無しさん :02/10/17 15:13
印刷プレビュー画面をカスタマイズするには CPreviewViewクラスの派生クラスと、自前のダイアログバーを作って CxxxView::OnFilePrintPreview()でDoPrintPreview()を呼び出すのが 普通の方法ですか? ほかに楽な方法とかありますか?
611 :
デフォルトの名無しさん :02/10/20 16:14
MFC難すぃ〜んですけどいい勉強法教えてください。 オブジェクト指向は憂鬱本を読んだからたぶん 大丈夫だと思うんだけど・・・。
>>611 使いまくれ。
そして、MFCのクラス一覧表みたいのを部屋の壁に貼っとけ。
613 :
デフォルトの名無しさん :02/10/24 16:16
助けて頂きたいのですが、エディットボックスコントロールから文字列を取得してくるコードで悩んでいます。 (m_edit1及びm_edit2はエディットボックスコントロール,m_overwriteはチェックボックスコントロールです。) char filename_in[200]; char filename_out[200]; int ret1,ret2; //ファイル名入力チェック ret1=m_edit1.GetLine(0,filename_in); ret2=m_edit2.GetLine(0,filename_out); if(ret1==0 || (ret2==0 && !m_overwrite.GetCheck())){ return; } AfxMessageBox(filename_in); AfxMessageBox(filename_out); このコードで、DEBUGモードでビルドすると各エディットボックスに入力した文字がメッセージ表示されますが、 Releaseモードだと、文字を入力してもret1が0になってしまいます。 どなたか対処法をご教授願いたいと思います。
>>613 MSDNに
>コピーされる行には、終わりを示す NULL 文字は含まれません
とあるけど、文字列の終わりにヌル文字はある?
>>613 よく読んでないけどGetDlgItemText()じゃだめなん?
>>613 GetLineの3つ目の引数を入れる。
>614-616 早速のご回答有り難うございます。 >614 確かにMSDNにはそう書いてありますねー しかし実際ブレークさせてみると、ヌル文字入っているのですが..(謎 >615 GetDlgItemText()で出来ました! 有り難うございます。 >616 3つ目の引数入れると出来ました! 有り難うございます。 引数2つのGetLineプロトタイプは何なのか、 何故デバッグビルドでは動いたのかまだまだ不明点はありますが、 お陰様で動かす事が出来ました。
C サイコー!
┏━━━━━━━━━━━━━━━━━┓ ┣━━━━━━━━━━━━━━━━━┫ ┃新・開・保・印刷 ┃ ┣━━━┳━━━━━━━━━━━━━┫ ┃ ┃ ┃ ┃ ┣━━━━━━━━━━━━━┫ ┃ ┃ ┃ ┗━━━┻━━━━━━━━━━━━━┛ SDI形式で↑のような分割したウインドウを作製したいのですが どのように実装すればいいのでしょうか? 現在、まずメインフレームを CSplitterWnd で左右に分け その右側にCFrameWndを貼り付けてそこでまた分割するように してみたのですが、右側のペインがくぼんだように見えます。 メインフレーム:OnCreateClient m_wndSplitter.CreateStatic(this, 1, 2); m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(左側のビュークラス), CSize(150, 100), pContext); m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(右側のCFrameWndクラス), CSize(100, 100), pContext); 右側のCFrameWndクラス:OnCreateClient m_wndSplitter.CreateStatic(this, 2, 1); m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(右上のビュークラス), CSize(150, 100), pContext); m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(右下のビュークラス), CSize(100, 100), pContext); 環境は VC++6.0です。よろしくお願いします。
620 :
デフォルトの名無しさん :02/11/03 02:14
俺最強
>>619 わざわざCFrameWnd貼る必要なんてなし。
//真中の区分け
m_wndSpCenter.CreateStatic( this, 1, 2, WS_CHILD|WS_VISIBLE, AFX_IDW_PANE_FIRST );
// 右側を上下に
m_wndSpRight.CreateStatic( &m_wndSpcenter, 2, 1, WS_CHILD|WS_VISIBLE|WS_BORBER,
m_wndSpCenter.IdFromRowCol( 0, 1) );
// 左側のビュー
m_wndSpCenter.CreateView( 0, 0, 略);
// 右上
m_wndSpRight.CreateView( 0, 0, 略 );
// 右下
m_wndSpRight.CreateView( 1, 0, 略 );
623 :
デフォルトの名無しさん :02/11/04 10:17
plug-in をつかったプログラムを作りたいのですが、 なにか、参考になるアドレスなどがあれば教えてください。
624 :
デフォルトの名無しさん :02/11/04 20:07
Windows XPで画面テーマをXPにしていると、CFrameWnd::GetClientRect()が返すクライアント領域が小さい気がします。 そのため、クライアント領域いっぱいにコントロールを作ろうと思っても 隙間が開きます。 FrameWndのスタイルはMAXIMIZEBOX | MINIMIZEBOX | SYSMENU | THICKFRAMEを落としたものです。 回避法をご存知の方はいらっしゃませんか?
625 :
デフォルトの名無しさん :02/11/04 20:13
VC++ 6.0です Accept()した後のCSocketのポインタをAfxBeginThreadの引数として 渡しているのですが、そのThreadの中でCSocketをCloseすると Closeの中のASSERTで引っかかります。 スレッドを開始する前にCloseを呼ぶと成功します。 これって何故なんでしょうか? わかる方いらっしゃいましたら教えてください。 よろしくお願いします。
CSocketには、不可視のWindowが隠されているから。 CSocketはステ。
マルチスレッドでソケットを使う場合は void SocketThreadInit() { #ifndef _AFXDLL #define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE #define _afxSockThreadState AfxGetModuleThreadState() _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState; if (pState->m_pmapSocketHandle == NULL) pState->m_pmapSocketHandle = new CMapPtrToPtr; if (pState->m_pmapDeadSockets == NULL) pState->m_pmapDeadSockets = new CMapPtrToPtr; if (pState->m_plistSocketNotifications == NULL) pState->m_plistSocketNotifications = new CPtrList; #endif } っていうグローバル関数を書いてCSocketインスタンスを生成する前に呼び出す とMSのどっかのページに書いてたはず。
>>624 逆に必要なクライアント領域のサイズから必要なウィンドウの大きさをきめるのは?
CWnd::CalcWindowRect()か::AdjustWindowRectEx()とか使って。
なんか的外れな回答したかな。でもXPは前のバージョンよりも タイトルバーの高さとかも若干大きくなってるはずだから、今までと 同じウィンドウの大きさだと相対的にクライアント領域は小さくなるぞ。 その辺は考慮してるのか?
>>629 ,630
CFrameWndいっぱいのCListBoxを作ろうと思ってGetClientRectし、その大きさで
CListBoxをCreateしていたわけです。で、今まではうまくいっていたんですが、
XPのスタイルXPだけクライアント領域いっぱいにならず、
下の方に隙間が開いてしまうわけです。ちょうどTHICKFRAMEの下の辺の幅くらい足りません。
スタイルはTHICKFRAMEを外してあります。
XPのバグなのでしょうか?
クライアントいっぱいにするならViewでGetWindowRect?
>>632 あ、Viewは作ってないんです。Frameの下にいきなりCListBox。
Dialogにすべきなんでしょうか?オーバーライドするメソッドか何かの関係で、
CFrameWndを使わざるをえなかったような記憶が…
ListBoxならFormViewに貼り付けるかなぁ。 俺ならListView使ってるかなぁ。 どうしてもListBoxなら独自にListBoxを使ったコントロールビュー作るか。 MFCスレ的にはこの辺が定番な回答かも。 つーかXPもってないので試せま千円。
リストボックスだと、LBS_NOINTEGRALHEIGHTが付いていなかったら 項目の高さの整数倍になるように調整されてしまうわけだが。
>>635 ソレダ!
お恥ずかしいです。今までが偶然ぴったりいっぱいにおさまってたんですね。
お騒がせしました。
637 :
デフォルトの名無しさん :02/11/06 03:53
MFCのCHttpを使用してサーバにファイルをアップロードしたいんですけど データ自体は転送されるのですが サーバ側のcgiでformをうまく解析できず ファイルの転送が完了しません ちなみにindex.htmlでformを書いてcgiを動かせば正常に作動します 以下のデータは全て直接(CString strData, CHttpFile *pFile) pFile->WriteString( strData )で書き込んでいます msize= 230653 ----------------------------- Content-Disposition: form-data; name="author" who ----------------------------- Content-Disposition: form-data; name="fname"; filename="C:\0.ppm" Content-Type: text/plain P6 320 240 255 :JF:JF8LG9MH<LH<LH@LE?KDBJGBJGFKEHMGKKJKKJHMGIN HSFDQGCPFGPIGPIEQJFRKCUJEWLGSLGSLJSLLUNOULMSJL ...続く
Content-Lengthはキチンと送っているか? そのあたりの手を抜いているCGIは多いぞ。
>>638 msize= 230653というのがContent-Lengthの値に対応しています
サーバ側では
u_long msize = atol(getenv("CONTENT_LENGTH"));
if( msize > MAX_MEMORY ){
printf("Too large data to recieve.\n");
exit(1);
}
で読み込んでいます
637のデータ自体は標準入力から得られたものをファイルにも書き込んでいるので
「データそのもの」は送信されています...
ちなみにこのプログラムはいまサンプルとして製作中のため
strData += "-----------------------------\r\n";
strData += "Content-Disposition: form-data; name=\"author\"\r\n\r\n";
strData += "who\r\n";
strData += "-----------------------------\r\n";
strData += "Content-Disposition: form-data; name=\"fname\"; filename=\"C:\\0.ppm\"\r\n";
strData += "Content-Type: text/plain\r\n\r\n";
strData += "P6 320 240 255";
strData += data;
としていますが,ここがまずいとかありませんか?
>>638 ちなみにヘッダーは
const TCHAR szHeaders[] =
_T("Accept: */*\r\n User-Agent: HogeSampleCode\r\n");
です
WriteStringはWrite( pstr, lstrlen(pstr) );だけど、\0含んでたりしないか? それでもダメなら、間にデバッグ系のプロキシ噛ませて、 何吐いているか確認したら?
>>641 えとですね
最後に書かれているデータ
P6 320 240 255
:JF:JF8LG9MH<LH<LH@LE?KDBJGBJGFKEHMGKKJKKJHMGIN
HSFDQGCPFGPIGPIEQJFRKCUJEWLGSLGSLJSLLUNOULMSJL
...続く
の部分は画像でありまして
このデータだけをマニュアルで切り出せば
途中で切られることなく転送前の画像と全く同じになっていることから
データ長は正しいと思われます
あ,それと一応ですが
サーバ側cgiの標準出力で読んだデータは解析にかける前に
テンプデータとして別に保存しています
といっても解析されないので転送されたファイルは作成されないのですが...
>>641 参考に正しく動いているindex.html版の結果を載せます
-----------------------------7d22972e2a70122
Content-Disposition: form-data; name="author"
who
-----------------------------7d22972e2a70122
Content-Disposition: form-data; name="fname"; filename="C:\0.ppm"
Content-Type: text/plain
P6 320 240 255
(ここには巨大なデータが改行なしで書かれています)
-----------------------------7d22972e2a70122--
Recieved [author] = [who]
Recieved file C:\0.ppm
最後の2行はサーバが解析した結果です
すみませんねレスしていただいて...
POSTについては,もう2週間以上かかってるんです...
自分では最後の大詰めだと思っているんですが甘いですかね?
>WriteStringはWrite( pstr, lstrlen(pstr) );だけど、\0含んでたりしないか?
これについての回答ですが
pFile->SendRequestEx( strData.GetLength());
pFile->WriteString( strData );
のように記述しています
Content-Type: multipart/formdata; boundary=----------------------------- はつけてるだろうな、、、
まちがえた。boundaryに--が先行するわけだから、 Content-Type: multipart/formdata; boundary=--------------------------- だな。 そして、postの最後に-------------------------------の追加。 でよかったかな。詳しくは、MIME Multipartを。
>>644 書いてませんでした
後,ヘッダーにですか?データの中にですか?
共に試しましたが変化はありませんでした...
とりあえずは
const TCHAR szHeaders[] =
_T("Accept: */*\r\n User-Agent: UMTPSampleCode\r\n Content-Type: multipart/formdata; boundary=-----------------------------\r\n");
で保存しました
実行時の返り値が
Status Code is 3435973836
となっています
確か200が正常終了なので...
>>645 むむっ...
postの後にですか...
pFile = pServer->OpenRequest( CHttpConnection::HTTP_VERB_POST,
strObject, NULL, 1, NULL, NULL, dwHttpRequestFlags );
なので...後ろに追加する方法が...
実はMSDNのTEARというサンプル(サンプルはGET)を参考にしています
ざっくり説明すると、 ヘッダ部 Content-Type: multipart/formdata; boundary=<BOUNDARY> <BOUNDARY>は任意の、ぶつからなさそうな任意の文字列とする。 ボディ部 各パートの区切り <改行> + "--" + <BOUNDARY> + <改行> MIMEの最後 <改行> + "--" + <BOUNDARY> + "--" + <改行> となる。 ブラウザの出力と見比べてみるよーに。 >467 POSTの後、というかPOSTするデータの末尾(最後)という意味
>>645 あ あ あ あ あ
あ り が と う ご ざ い ま す !!
うまく動作しました
最終行に-------------------------------を追加しろということだったんですね
もうなんと言っていいのやら
本当に感謝します
ここ数週間自分で悩み続けて
今日,他人を頼ったわけですが
解決できて何よりです
>>648 なるほど,確かに自分の送信したデータと比較すると
違いがわかります
651 :
デフォルトの名無しさん :02/11/06 23:56
MFC超初心者です。これから勉強したいと考えているのですか、 どこ良いサイトが有りましたら教えって下さい
652 :
デフォルトの名無しさん :02/11/08 15:42
「スタートボタン>>Windowsの終了」の時に呼び出される ダイアログを呼び出す方法教えてくだせー
PGM形式のファイルを表示させたいのですが、可能なのでしょうか?
654 :
デフォルトの名無しさん :02/11/08 23:32
現在、CPropertySheetとCPropertyPageを使って作成したモードレスのプロパティシートにおいて 特定ページ内に、入れ子でプロパティシートを配置しようと考えています。 これを実装する上で、参考となる情報、または情報へのポインタがありましたら教えてください。
CodeGuru、CodeProject。 ダイアログにプロパティシートを貼り付けるサンプルがあったはず。
656 :
デフォルトの名無しさん :02/11/09 01:32
>>655 CodeGuruで見つかりました&実装できました。ありがとうです。
657 :
デフォルトの名無しさん :02/11/09 16:16
デバッガが 例外処理 (初回) は hoge.exe (ATOK15W.IME) にあります: 0xE06D7363: Microsoft C++ Exception。 シリアライズしてるときにでてくるんですけど やっぱり悪いのはATOKじゃなくておれですか?
658 :
デフォルトの名無しさん :02/11/09 17:29
WinInetで、FTPでレスポンスを取得したいのですが、 pFtp->Command("SITE DEVICE 00 00 00", CFtpConnection::CmdRespNone); だと、問題ないのですが(レスポンスは取得できません:正常) pFtp->Command("SITE DEVICE 00 00 00", CFtpConnection::CmdRespRead); だと、そのままフリーズしてしまいます。 どなたか、アドバイスお願いします。 MFC7.0 IE6.0SP1
659 :
デフォルトの名無しさん :02/11/09 22:22
一度リリースモードでexeファイルを出力してから 再度ワークスペースを開いて 新しくメンバを追加しようとしたら、 「新規メンバを追加できません」というダイアログがでてできません。 もしかして一度リテールで出力したらそのクラスでは もういじれなくなるんでしょうか?
>659 VC6.0?内部データがぶっこわれると、発生する。 ソースとプロジェクト以外の内部ファイルを全て削除すれば、復活するかも。
661 :
デフォルトの名無しさん :02/11/10 04:41
>>652 PostMessage(FindWindow(...), WM_CLOSE, 0, 0);
FindWindowの中身は、Spyで確認してね。
>657 他のIMEではどうなるの?
664 :
デフォルトの名無しさん :02/11/14 10:27
VIsualC++.net + MFCでプログラムを書いています。 IMEで入力フォーカスのある状態 (たとえば「へんかん」と入力してスペースを押す前の 下線がついている状態) の文字列を取得したいのですが、そういう方法はありますでしょうか? 文字を入力してスペースを押す前にF11あたりを押したら その文字列がポップアップされるみたいなイメージです。 またIMEで漢字変換の候補が出現するボックスのような ウインドウを作るのはどのような方法がベストなのでしょうか? どうもIME周りは情報が少なく良くわからなくて困っています。 ご存知の方ご教授をお願いします。
665 :
デフォルトの名無しさん :02/11/14 23:55
一つ聞きたいことがあるのですが、 整数があって、特定の桁数にそろえて文字列(CString) に代入するにはどうすればいいでしょうか? 例: int i = 20; CString s; 5桁にそろえるとき、 sに00020という値が欲しいわけです。
>>665 ヘルプでCStringのメンバ関数見てみ。
Format()つーのがあるから。
べつにsprintf()で整形してから代入してもええけどな。
667 :
デフォルトの名無しさん :02/11/15 00:07
はい、見たのですが、Formatは%dなどでint変数を取り込んだりしますが、 桁数が、最小になりますよね? 5桁など指定桁数に揃えたいわけです。
>>667 format指定でどうにか出来たかな?%0.5dかな?
まあ前に"00000"を継ぎ足してRightメソッドでもいいだろうけど。
>665 Format っていってるだろ 頭悪いのか? マルチしね。
>>667 format文字列の桁指定くらい理解しておかないといつまでたっても初心者だぞ。
ヘルプにちゃんと載ってるだろ?
671 :
デフォルトの名無しさん :02/11/16 00:00
あの、COLORREFというものについてなのですが、 これに格納した色データを各要素に分解する方法はあるのでしょうか? RGB()の逆をしたいわけです。
Get[R|G|B]Value MSDNぐらい、持ってないの?
>どうもIME周りは情報が少なく良くわからなくて困っています。 MSDN,PlatformSDK,DDKのドキュメントをまず、読みましょう。
674 :
夢を見る人 :02/11/16 10:02
CSplitterWndのCreateViewで窓を分割したんですが、 分割した小窓のハンドル(HWND)を取得するにはどうすればいいんですか?
小窓.GetSafeHwnd()
676 :
デフォルトの名無しさん :02/11/16 13:42
CWnd* GetPane( int row, int col );
AppWizardでSDIのフレームを作りました。それで、生成されたCView派生クラスの OnInitialUpdate関数でCComboBoxオブジェクトを建築して、Create関数で コンボボックスを貼り付けました。貼り付けたコンボボックスは、正常に 動作するのですが、コンボボックスの文字が異常に大きくなってしまいました。 文字の大きさを指定するにはどうしたらよいのでしょうか。 おおまかな方法を教えていただければ、後は自分で調べるので、アドバイスよろしく おねがいします。
CComboBoxオブジェクト.SetFont( )
679 :
デフォルトの名無しさん :02/11/18 00:29
■謎の現象■ スレッドを作成し、そのスレッドプロシージャから指定ウインドのDCに描画するプログラムを書きました ウインドはダイアログに乗っけたStaticで、そのウインドへのポインタは初期化の時に一回だけ GetDlgItemで取得し、グローバル変数に保持させます その後スレッド関数はそのグローバルなポインタg_pWndを使って 都度、g_pWnd->GetDC()でDCを取得し、そこに絵を描く寸法です。 しばらくはおとなしくウインドに描画するのですが突然(9990回めの呼び出し)で ウインドでも何でもないデスクトップに描画に行ってしまうのです・・ さらにいろいろ調べると突然アクセスバイオレーションになったりすることもあるようです。 原因はGetDCしたもののm_hDCがNULLだったからでした。突然そうなるのです。 なぜこのような事が起こるのですか??
>>679 CWnd::GetDlgItem() →「返されるポインタは、一時的なポインタです」とMSDN
にある。9989回は“たまたま”エラーにならなかったということだと思われる。
Cwndオブジェクトを他のスレッドに持っていくのは危険だ、と MFCの ASSERTに怒られる
こともあるから、そんなときは CWnd* でなく、HWND をグローバルにする。
なるほど、そうでしたか。どうもありがとうございます HWNDでトライしてみます。ではでは。
>673 いろいろ試行錯誤したらわかってきました。 HWND hWnd = this->m_hWnd; HIMC hImc = ImmGetContext(hWnd); char str[256]; memset(str,'\0',256); ImmGetCompositionString(hImc,GCS_COMPREADSTR,str,256) でこのようにするとstrにIMEへの入力文字列が取れることがわかったのですが、 "テスト"のように半角カナなってしまいます。 これを"tesuto"として取得したいのですが、そのためには、 IMEを起動させてからのキー入力を取ったほうがよいのでしょうか? しかしその場合バックスペース等の処理が・・ もしくは半角カナからローマ字へとも思うのですが、 C++の正規表現ってわけわかんなすぎる・・・
C++で、GUI環境の脳波分析プログラムを作ろうと思っています。 一晩中のデータを見たいのでエクセルなどでは全体を見ることができないんです。 グラフを表示させてそれをページとばしでみていけるようなプログラムを作れるでしょうか? アドバイス等お願いします
VC.netのMFCで、ダイアログベースで、タブコントロールを用いて、タブが9つ (上段に5タブ、下段に4タブ)というようなダイアログを作りたいのですが、 SetItemSizeを用いてすべてのタブの幅・高さを同じに設定する方法はわかったのですが、それでは 上段5段の合計幅と下段4段の合計幅が、違ってしまい、ブサイクになってしまうので、 上段の合計幅と下段の合計幅を同じにしたいので、タブ1つずつについて幅を 設定する方法を調べてみたのですがわかりませんでした。 タブごとに、幅を変える方法がわからないので知っている方がいましたら、 ご教授お願いします。 誠に初心者質問で申し訳ないです。
とりあえずマルチポストはどうかと思ふ。
とりあえず正規表現を使って日本語を無理やり ローマ字にすることで解決しました。 ですが、IMEの変換候補ボックス風ウインドウを作る方法がどうしてもわかりません。 IME専用のクラスなどがあるのでしょうか???・
687 :
デフォルトの名無しさん :02/11/20 01:38
MFCでひとつのフレームにViewが複数(仮にViewA,ViewB)あったとき あるクラスからViewBのエディットボックスのポインタを手に入れたいときなどは どうしたらよいのでしょう? ようするにViewBへのポインタが手に入ればそこからGetDlgItem すればよいのかとは思うのですが。
688 :
デフォルトの名無しさん :02/11/20 15:59
おっぱい (ρ_;)ノ
>>687 何がどうなってるのか良くわからんが、
普通フレームがViewへのポインタ持ってるだろうから、
そこからもらうんじゃないか?
691 :
デフォルトの名無しさん :02/11/20 17:18
Viewというよりはメインフレームでは CSplitterWnd w2; CSplitterWnd w1; このようにしてCSplitterWndを使って分割してそれぞれの ウインドウに対してViewを設定しているという状態なんですね。 そうするとまったく別のクラスからどうやって Viewのポインタを手に入れるかがわからなくて・・・
693 :
デフォルトの名無しさん :02/11/20 20:05
Viewのポインタを取得してメンバを操作するのもよいが、 わしは、SendMessageで処理しているぞ。 任意のViewにOnInitialUpdateを追加して、 // Appのメンバにハンドルをつくり、保持する CxxApp*pApp = (CxxApp*)AfxGetApp(); pApp->m_hxxViewWnd = GetSafeHwnd(); あとは、DocからでもMainFrameからでも SendMessage( pApp->m_hxxViewWnd, UMSG_xx, NULL, NULL ); とする。 スプリッターウインドに対しても別々に処理できる。
レスありがとうございます。 >692 ただGetPaneは CSplitterWndの関数ですよね。 CMainFrameには class CMainFrame : public CFrameWnd { // CSplitterWnd w2; CSplitterWnd w1; このように二つのウインドウの変数があるのですが、 w1かw2のどちらかを手に入れることができません。 ただw1かw2のどちらかが手に入ればGetPaneもいらない気がしますが・・・・ >693 つまりそれはOnInitialUpdate以外で使う場合は メッセージを自作しなければならないということですね・・・ WM_****見たいなのをちょっと難しそうですが試してみたいと思います。 ただこのような形で CxxApp*pApp = (CxxApp*)AfxGetApp(); pApp->m_hxxViewWnd = GetSafeHwnd(); どうやって二つのCSplitterWndを区別するのでしょうか?
695 :
デフォルトの名無しさん :02/11/20 20:59
CSplitterWnd w2; CSplitterWnd w1 としているのは、3分割するためだと推測しまして、 w1.CreateStatic(this,1,2); w2.CreateStatic(&w1,2,1,WS_CHILD | W・・・ w2.CreateView(0,0,RUNTIME_CLASS( CTopView)・・・ w2.CreateView(1,0,RUNTIME_CLASS( CBtmView )・・・ w1.CreateView(0, 0, RUNTIME_CLASS (CLeftView)・・・ となると思います。 で、CTopViewとCBtmViewと CLeftViewのハンドルはそれぞれで、 取得しておくと、それぞれ、Viewのメンバを操作できます。 おそらく、この手の操作は、ネット上でもっと良い方法が公開されていると思われます。
>>694 ((CMainFrame*)AfxGetMainWnd())->w2.GetPane( ・・・ );
MFCの売り物はドキュメント・ビューアーキテクチャらしいのですが、 私は直接DBMSにアクセスすることが多いので、ドキュメントの方を 使ったことがありません。 なにか間違ってます?
age忘れ
>>697 問題ない。
別に必要ない物を無理に使わんでもよい。
>>697 VBでフォームにロジックとか全部書くような感じか?
701 :
デフォルトの名無しさん :02/11/20 23:45
質問なのですが、VC++.netでタブ一つ一つを違う幅に設定することは不可能 なのでしょうか? すべてのタブを同幅に設定するのは、SetItemSizeを使うことによってできましたが・・・
>>699 ありがとうございます。
>>700 ロジック部は別モジュールに切り分けております。
フレームワークからドキュメントを切り離す(捨てる)ことは出来るのでしょうか?
>>702 MFC AppWizardで「ドキュメントビューアーキテクチュアをサポートする」に
チェックを入れた場合のこと?その場合はできないよ。
>>701 まず、.NETは持ってないので参考まで。
MSDNのCTabCtrl::Createより
>TCS_RAGGEDRIGHT コントロールの全体幅に合わせるようにタブを伸縮しません。
>このスタイルはデフォルトです。
なのでこのスタイルをはずしてみては。
そこら中にマルチするのはどうかと思う。
706 :
デフォルトの名無しさん :02/11/21 11:46
VC++.NETでMFCプロジェクトを新規作成。 CMainFrame::CMainFrame()を以下のように書き換える。 CMainFrame::CMainFrame() try { // TODO: メンバ初期化コードをここに追加してください。 } catch(...) { } コンパイルエラーが出まつ。なんで? ちなみにcatchブロックの最後に ; をつけると通る。
>MFCの売り物はドキュメント・ビューアーキテクチャらしいのですが、 >なにか間違ってます? 使いたいように使うのが良いと思います。 本当の考え方的には、 ドキュメント → データの保持・操作・入出力に徹する ビュー → ユーザインターフェース(操作など)・ドキュメントのレンダリング(ドキュメントの視覚化)に徹する と言うのが、設計思想の様です。
708 :
デフォルトの名無しさん :02/11/21 17:47
VC++.netでの質問です。 あるダイアログがListBoxを一つもつプログラムを作っています。 ListBox内の項目を上下キーで移動して、 項目をリターンで決定するようにするのが目的です。 そこでリターンキーが押されたことを取得するために ListBoxのプロパティでWantKeyInputの欄をtrueにし ダイアログの派生クラスで OnVKeyToItem(UINT nKey, CListBox* pListBox, UINT nIndex); をオーバーライドし if (nKey == VK_RETURN){ // } としているのですが、 うまく動作していません。 変数の推移を見るとnKeyは229となっており きちんとしたキーコードが帰ってきていないようです。 これにはどのような原因が考えられますでしょうか?
709 :
デフォルトの名無しさん :02/11/21 18:07
>705 情報ありがとうございます。 タブの数に関わらずタブアイテムの合計幅を上段・下段ともに同じくするのは、 プロパティのstyleをright justifyにすることで解決しました。 (VC6で言えば、プロパティのスタイルの配置を「右に揃える」にするに当たる、、かな?) これにより705さんの教えてくれた、TCS_RAGGEDRIGHTのデフォルトをはずす事に なったのだと思います。 しかし、個々のタブ幅を設定する方法は結局わからずなので、現状では、タブに 設定する名前の前後にスペースを入れることでムチャ技で対応しようと思います。 >マルチに関して 質問した時に回答がないままに、レスが流れてしまったので3つほどのスレに 書き込み&2回書き込みしてしまいました。 以後気をつけます。
>>709 幅というか、CTabCtrl::SetMinTabWidth で、最小幅を指定してやれば
いいんじゃないかな? 試してないから分かんないけど。
711 :
デフォルトの名無しさん :02/11/22 01:08
ビュー/ドキュメントアプリで一ちゃん最初にクラスを作って アプリケーションが終了したときに破棄したい場合 どこに書くのが普通でしょうか? C***Appクラスのコンストラクタ、デコンストラクタ?
712 :
デフォルトの名無しさん :02/11/22 01:44
MFCでマウスカーソルの位置でなくて テキスト入力用カーソルの座標を取得する方法ってないでしょうか? EditBoxなんかでカーソル入力を行う際に カーソルの位置(何文字目か)とかではなくて座標が わかればコマンド入力時の ヒントボックス見たいなものが作れて便利なのですが。 マウスカーソルのそばにヒントボックスをポップアップするのは簡単そうですが・・・・ テキストカーソルとなるとちょっと難しくて困っています。
713 :
デフォルトの名無しさん :02/11/22 02:46
InternetExplorerで、サイト上から特定の拡張子のファイルを ダウンロードしたときに、InternetExplorerのクライアント窓上に 自動起動するようなアプリケーション(*.pdfに対するAcrobatReaderのような感じ)を VisualC++6 で作成したいのですが、 どこか、良い解説(またはサンプル等がある)サイトなどは無いものでしょうか。
>>706 ま、VC++でfunction-try blockは使うなってことよ。
ちゃんと答えろよクズども
>>706 CMainFrame::CMainFrame(){
try{
// TODO: メンバ初期化コードをここに追加してください。
}catch(...){
}
}
なら通ったぜ。
(´-`).。oO(functionごとtry領域に入れるにはどうすればよかったんだっけ?)
結局なぜnkeyがきちんと帰ってこないかわからなかったので プロパティじゃなく手動でLBS_WANTKEYINPUT を指定することにしました。 そこでCListBoxクラスのOnCreate関数をオーバーライドして cs.style |= LBS_WANTKEYINPUT すればよいということはわかったのですが、 しかし現在 CDialogの派生クラスであるCMydlg がCListBoxを持っているという関係にあります。 この場合 CListBoxの中の関数をオーバーライドするにはどうしたらよいのでしょうか? CMydlgの中の関数をオーバーライドする方法はわかるのですが、 その所持するクラスを変更したい場合 CListBoxを派生したクラスを作ってそれを所持する必要があるのでしょうか?
>>719 リストボックスに Enterキーの処理をさせるんじゃなくて、ダイアログの OnOK()
とかをオーバーライドしたほうが超簡単だと思うのだが、だめ?
>>711 クラスを作る/破棄する?
デコンストラクタ?
人にわかる言葉で説明しましょう。
>>712 あれはキャレットと言いまつ。
GetCaretPosで座標は求められるけど、
どのウィンドウがキャレットを持っているか自分で把握してるのが条件。
>723 どうもです そのようにやってみます。 MFCの場合は基本的なスタイルみたいなのがわからなくて・・ >722 すみません。職業プログラマなもので ちょっとわかりずらい書き方だったかもしれませんね。 ごめんなさい。
ポインタの指すオブジェクトをコピーしたいんだけど いい方法ないですか?
727 :
デフォルトの名無しさん :02/11/23 03:01
>>711 デコンストラクタじゃなくて
デストラクタ
そう言いたいだけちゃうんかと。
>>726 CHogeDoc* pDoc = (CHogeDoc*)AfxGetMainWnd()->GetActiveDocment();
CString str;
str = pDoc->m_str;
>721 onOkのオーバーロードがうまくいかないので、 (OKボタンをもう消してしまっていたので、 関数を作れない・・・・プロパティにもWM_OKみたいなのがないので・・(^-^;) そこでOnKeyDownをオーバーロードしてみました。 が、リストボックスのなかにフォーカスがある場合、 ダイアログにはOnKeyDownが返らないんですね・・
CListBoxを拡張するクラスを@@ClassWizardで@@つくる CMyLstBoxをメンバ変数(コントロール同期)にする
>>729 適当にボタン作ってIDをIDOKにしてハンドラ作った後にボタンを消せばハンドラだけ有効になる
>>729 virtual void CDialog::OnOK( ) なんだから、普通に手動でヘッダに
void OnOK();
って書いてオーバーライドできるよ。IDOKボタンが無くても、Enterを押したときは
既定で呼ばれる。
>731,732 ありがとうございます。 その方法でできました。
734 :
デフォルトの名無しさん :02/11/23 19:36
CEditBox内の文字列に文字を挿入し、 カーソル位置をその部分にもって行くプログラムを作りたいです。 GetWindowTextした文字列を編集して SetWindowTextすれば 挿入はできると思うのですが、 カーソル位置を移動させることがうまくいきません。 CEdit *CE = (CEdit*)GetDlgItem(IDC_EDIT1); CE->SetFocus(); POINT p; p.x = 10; p.y = 0; CE->SetCaretPos (p); SetCaretPosの使い方がまずいのでしょうか?
>>734 CE->SetFocus();
CE->SetSel(3, 3);
736 :
デフォルトの名無しさん :02/11/23 21:35
ダイアログにコンボボックスAとコンボボックスBがあります。 A,Bとも最初は何も選択していない状態なので、GetCurSel() == -1となってます。 コンボAで何かを選択したときに選択した項目番号に応じて コンボBの項目内容を決定したいとします。 Aを選択するとダイアログが以下のイベントメッセージを受け取るんで OnSelchangeComboA()、OnSelendokComboA() これらの関数内でBの項目を初期化しようとしたんですが GetCurSel()すると、新しく選択された値ではなく-1のまま・・・ どうすればよいでしょうか?DDXとか使わないとだめっすか?
>>736 GetDlgItemでもDDXでもできたけど。<OnSelchangeComboA()
ぐえっ!バグチンですた・・・ AのイベントでまずAのGetCurSel()してからBに項目入れなきゃいけないのに BのGetCurSel()してからBに項目入れようとしてた。 そりゃ-1だわ(´・ω・`)
static でポインタ宣言するってのは有り?
グローバル変数を介してポインタのやりとりをする のとあんまり変わらんな
741 :
デフォルトの名無しさん :02/11/24 15:54
WINAPI WinMainのHINSTANCE hInstanceをMFCプログラムの中で取得できますか? DialogBox()から読み込んだときに生成されるhWndは、MFCでダイアログその他を DialogBox()を使わずにつくったときに、取得できますか? 享受ください。
CWinApp(theApp)のメンバ変数にm_hInstanceって無い?
享受・・・・
AfxGetInstanceHandle()だろう。
二番目の問はGetSafeHwnd()のことだろうか
746 :
デフォルトの名無しさん :02/11/24 17:18
有難うございます。 ただ、GetSafeHwnd は、CWndのメンバなので、Dlgではどうすればいいでしょうか?
748 :
デフォルトの名無しさん :02/11/24 17:44
そうですね。有難うございます。
749 :
デフォルトの名無しさん :02/11/24 18:05
エクスプローラなどのある別のウィンドウでのマウスのダブルクリックを感知して 動くようなプログラムを作りたいんですがどこかにヒントみたいなものは無いでしょうか。 SnapItでしたっけ、エクスプローラの空白部分をクリックしてフォルダを上の階層に上るような、 そういう処理がしたいんですがどうすればいいでしょうか?
750 :
デフォルトの名無しさん :02/11/24 18:44
たびたびですが、 メンバ関数をCALLBACK関数にし、 DialogBox()のような形で呼び出せないでしょうか?
>>750 DialogBoxのような形ってのがいまいち何のことを言いたいのかわかりませぬ。
752 :
デフォルトの名無しさん :02/11/24 18:52
>>750 CALLBACK関数にしたいメンバ関数をstaticにする。
>>751 に同意だが、MessageBoxのことか?
> DialogBox()のような形で呼び出せないでしょうか? ↓翻訳↓ DialogBox() のようなAPI に渡す、CALLBACK関数として使えないでしょうか?
それじゃなんのためにMFC使ってるんだよ・・・
まぁCALLBACK関数は
>>752 のようにstaticなメンバ関数にすればよい。
755 :
デフォルトの名無しさん :02/11/24 19:42
static にすると(ヘッダーのほうだけstatic にしたのですが) エラーが出ます。 どのように書き換えればいいのでしょうか?
756 :
デフォルトの名無しさん :02/11/24 19:55
>755 書き忘れました。static にすると、 メンバ変数が使用できないので困っています。
なんかHINSTANCEが欲しいとかHWNDが欲しいとかCALLBACK関数を渡すとか、 もしかしてMFCアプリでDialogBox()APIを使いたいってだけのことか? なんでMFCアプリなのにCDialogを使いたくないのかが激しく謎なのだけど とりあえずエラーが出たならその内容を書くなりソースを提示するなりしる。 つーか無理してMFCにこだわらずにプロシージャをグローバルに宣言して 普通のWin32APIアプリみたくしたら。
C++の勉強をする。
759 :
デフォルトの名無しさん :02/11/24 20:25
いえ、CALLBACKで返す関数を使用したいのです。 (その関数以外は、MFCでないととうてい処理できません)
だからエラーならそのエラー内容を
761 :
デフォルトの名無しさん :02/11/24 20:52
メンバ変数が使用できない わけです。
thisポインタ渡してコールバック関数内で CHoge* pWnd = (CHoge*)this; pWnd->m_hoge; // メンバ変数にアクセス
763 :
デフォルトの名無しさん :02/11/24 21:01
掻き忘れましたので掻いてきます。
764 :
デフォルトの名無しさん :02/11/24 21:11
静的メンバ内では、this は使えないのではないでしょうか?
だから間接的に渡すんだってば。 例えばフォント列挙でEnumfontFamiliesの第三引数にコールバック関数、 第四引数(LPARAM)にthisを渡すのと同じ。
あーそうか
>>762 はこうだった。
CHoge* pWnd = (CHoge*)lParam;
pWnd->m_hoge; // メンバ変数にアクセス
>>766 のlParamがEnumFontFamiliesで渡したthisってことね。
ぐだぐだになってきたけど言いたいことわかるだろ!な!な!
768 :
デフォルトの名無しさん :02/11/24 21:42
>>767 ちょっとよく分かりません。もう少し詳細お願いします。
がーん ってかそのコールバック関数て何?自作?
770 :
デフォルトの名無しさん :02/11/24 21:51
引数が無かったりLPVOIDが使えなかったりする CALLBACK関数もあるからな。そのコールバック関数 の宣言晒してみぃ。
そのコールバック関数て自作?
772 :
デフォルトの名無しさん :02/11/24 21:54
自作と言えば自作ですが、 BOOL CALLBACK CTestDlg::MainDialogProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) デバッグでlParamの値が0になっていて実行中にエラーが出ることが 判明しました。
773 :
デフォルトの名無しさん :02/11/24 21:56
CTestDlgはMFC使ってCDialogの派生か?
>>772 DialogBoxParamでちゃんとthisを渡せ。以上。
# つーか、API 呼ばずにMFCのCDialog使えってばさ。
775 :
デフォルトの名無しさん :02/11/24 22:42
dialog を表示するのが目的でなく、CALLBACK関数を実行するのが 目的。
776 :
デフォルトの名無しさん :02/11/24 22:46
>>776 thunkを間に挟めばできる。
意味がわからないなら諦めろ。
というかもう解決済みのはず。
779 :
デフォルトの名無しさん :02/11/24 23:46
ViewクラスのPreTranslateMessageを使用して 以下のようにしてスペースキーの入力を得ています。 BOOL MyView::PreTranslateMessage(MSG* pMsg) {// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください if (pMsg->message == WM_KEYDOWN){ case VK_SPACE: //ここで処理 return TRUE; break; このときIMEがONならば別の処理をするようにしたいのですが、 たしかにその処理はできるのですが、 同時にIMEにもスペースキーの入力が伝わってしまって 変換ウインドウが出てしまいます。 これをIMEがONのときもスペースキーの入力がIMEにいかないようにしたいのですが、 そのようにする方法ってありますでしょうか?
780 :
デフォルトの名無しさん :02/11/25 00:51
bmp、jpeg等のヘッダ情報を取得する方法を教えて下さい。 サンプルソース等載せていただけると助かります。 よろしくお願いします。
探したんですが見つからないんです。。。 調べ方が悪いのでしょうか?
783 :
デフォルトの名無しさん :02/11/25 10:31
VC++で最近使ったファイルと最近使ったワークスペースを クリアしたいのですが、どこを削除すれば良いでしょうか?
>>779 pMsg->message = WM_NULL;
785 :
デフォルトの名無しさん :02/11/25 11:19
ツール→オプション→ワークススペースで 最近使った一覧の項目を0で初期化する。 もしくはレジストリの HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Recent File List をいじる。モノによっては\DevStudio\6.0は違うかも。
787 :
デフォルトの名無しさん :02/11/25 15:34
┏━━━┳━━━━━━━━┓ ┃ ツ ┃ リストビュー ┃ ┃ リ ┣━━━━━━━━┫ ┃ | ┃ ┃ ┃ ビ ┃ HTMLビュー ┃ ┃ ュ ┃ ┃ ┃ | ┃ ┃ ┗━━━┻━━━━━━━━┛ MFCでこういうWindowを作りたいのですが、 どうすればいいのでしょうか?
そーいうのはdelphiが楽
>>787 スプリッタウィンドウ(CSplitterWnd)を入れ子にする。
定番だからサンプルはWEBで探せばいくらでもあると思われ。
>784 ありがとうございます。 しかし試してみたのですが、だめなようでした。 おそらくPreTranslateMessage(MSG* pMsg) よりも先にIMEにキー情報が行ってしまっているような気がします。
>>791 WM_IME_XXX系のメッセージでなんとかなるかも。
WM_IME_KEYDOWNとかね。
はずしてたらゴメン。
>792 ヒントどうもありがとうございます。 WM_IME_****には気づきませんでした それでちょっと試行錯誤してみます。
794 :
デフォルトの名無しさん :02/11/27 12:26
CのAPIが要求するコールバック関数に C++のクラスメソッドを登録できますがこれは合法ですか? またこれはポータブルですか? #include <windows.h> typedef void (CALLBACK MyCallback)(const char *message); void callcallback(MyCallback callback){ if(callback != 0) callback("hello,world\n"); } class CallbackTest { private: static void CALLBACK Callback(const char *message) { OutputDebugString("CallbackCaller:"); } public: void Execute() { callcallback(Callback); } }; int main() { CallbackTest ct; ct.Execute(); return 0; }
>>794 合法でかつポータブルです。
クラスメソッドという用語はそんなにポータブルじゃないけど。
796 :
------------------さん :02/11/27 15:55
これどうしたらいーの??文字データを数値に変換するってところでこんなのでてきた -------------------構成: gpibsdi - Win32 Debug-------------------- コンパイル中... gpibsdiView.cpp C:\Windows\デスクトップ\gpibsdi\gpibsdiView.cpp(169) : error C2065: 'f' : 定義されていない識別子です。 C:\Windows\デスクトップ\gpibsdi\gpibsdiView.cpp(169) : error C2440: 'initializing' : 'int' から 'char [256]' に変換することはできません。(新しい動作 ; ヘルプを参照) 配列型への変換はありませんが、参照またはポインタから配列への変換があります。 C:\Windows\デスクトップ\gpibsdi\gpibsdiView.cpp(173) : error C2440: '=' : 'unsigned char [256]' から 'double' に変換することはできません。(新しい動作 ; ヘルプを参照) この変換が可能なコンテキストはありません。 C:\Windows\デスクトップ\gpibsdi\gpibsdiView.cpp(174) : error C2664: 'GpCnvStrToDbl' : 1 番目の引数を 'char [256]' から 'unsigned char *' に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。 cl.exe の実行エラー gpibsdi.exe - エラー 4、警告 0
>>796 fの型は?
ソース張ったら796の文より多いの?
798 :
デフォルトの名無しさん :02/11/27 21:16
>>797 長いです・・
えっと用は文字charデータをdoubleに変換する「atof」ってやつです。
これを実行すると上記のエラーがでます。
キャストというのがわからないのですが、これが関係あるようです
799 :
デフォルトの名無しさん :02/11/27 21:34
>>797 とりあえず、 f は宣言されているの?
「定義されていない識別子です」って言われてんじゃん
>>798 じゃあとりあえずatofを使ってる部分とそこで使ってる変数の宣言だけ載せればいいじゃん
StretchBltやBitBltでちょっと大きめの画像を扱っていますが、 処理中は重くてマウスカーソルが止まったりします (memdc→memdc、memdc→hdcどちらでも起こります) マウスカーソルに影響を与えずに処理するにはどうしたらいいでしょうか
>>802 別スレッドで(memdc→memdc)の処理させる。
>>796 C言語を勉強しなおしたほうがいいな。
最初の2つのエラーはfが宣言されていないから。
3つ目は論外。
4つ目は型変換ミス。
'GpCnvStrToDbl' はコンテックのGPIBボードについてるライブラリか?
ソース、恥ずかしくて貼り付けられないだろうな。
たったこれだけのソースでほとんど同じエラーが出るぞ。
char s[256] = f; /* fは宣言されていない */
double d = s;
GpCnvStrToDbl(s, &d);
DWORD GpCnvStrToDbl(unsigned char *str, double *dbldata); ね。ちなみに。
805 :
デフォルトの名無しさん :02/11/28 07:38
>>804 すげぇw
初歩の初歩だな。
VB厨が書きそうなコードだ。
>>804 ディスアセンブルじゃなくてディスエラーコメントの
称号を与えよう。
正直、こんな感動の仕方をしたのは初めてだ。
>>803 AfxBeginThread(SkipBitmap,this,THREAD_PRIORITY_IDLE);
のようにして別スレッドで呼び出していますが症状がおさまりません
上の別スレッドはさらにCxxxViewクラスのメンバ関数を呼び出し、
StretchBltは実際にはそこで使っていますが、これが関係あるでしょうか
あんまり関係ないけど AfxBeginThread(・・・, this は止めといた方がいいっぽい。よく見かけるんだけど。
811 :
------------------さん :02/11/28 17:37
謎です。文字列→数値データへの変換でつまりました。 <正しい例、これは正常に稼動しました。出力は1233.000Hz> char *zzz="1.23300000E+003"; double s = atof(zzz); char r[80]; sprintf( r,"※周波数→ %6.3f Hz(数値データ%f)",s); pDC->TextOut(30,20,r,strlen(r)); <実際作ってるプログラム、外部シンボルが未解決ですエラーがでます> <いろいろ処理をしてGPIBというオシロスコープから取り込んだ文字データzzzが文字列形式で%sでとりあえず見ると> <上の正しい例にある1.233E003という数値です。これを数値で表せレない。> double s = atof(zzz); char r[80]; sprintf( r,"※周波数→ %6.3f Hz(数値データ%f)",s); pDC->TextOut(30,20,r,strlen(r));
812 :
------------------さん :02/11/28 17:39
×上の正しい例にある1.233E003という数値です。 ○上の正しい例にある1.233E003という文字列です。
813 :
------------------さん :02/11/28 17:45
そしてこれがエラー内容。バカですいません。新説なひと教えてください リンク中... gpibsdiView.obj : error LNK2001: 外部シンボル ""double __cdecl atof(unsigned char const *)" (?atof@@YANPBE@Z)" は未解決です Debug/gpibsdi.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー
>?atof@@YANPBE@Z なんでatofが型修飾されてるんだ? きちんとstdlib.hをincludeしたか?
name mangling キタ━━━(゚∀゚)━━━!!
>>811 激しくMFCと関係ない悪寒(;;;゜Д゚) ガタガタブルブル
>>817 なんか、もっと重大な問題があるのかと、思っちまったぜ。
「仕組みを理解した上で、thisを渡せ」って前提が抜けてるな。
>>809 (memdc→memdc)で処理の重いStretchBltなどを
使う。最終的にmemdc→hdcして実際に表示する時は
WM_PAINT(OnDraw)を呼び出すメソッドをスレッドから
呼び出す。
memdc→hdcするときに画像サイズの違いで、BitBltが
デフォルトで呼び出すStretchBltが起きてないか注意する。
(memdc→memdc)だけさせるスレッドでも重いか
テストしてみる。
>>819 そうだね。
worker_thread(LPVOID ptr)
{
CHogeWnd* pHoge = (CHogeWnd*)ptr;
とやって
HWND hHoge = pHoge->m_hWnd;
とか
int result = pHoge->HogeMethod();
とかやってると、アクセス違反で落ちたり変な値が帰ってきたり...
それが、いつも再現するとは限らず 100回に1回現れるとかで、今うまく
いってるからといって油断してると痛い目にあう。
スレッド越しのウィンドウやCOMやActiveXの操作は鬼門だけど、 >HWND hHoge = pHoge->m_hWnd; >int result = pHoge->HogeMethod(); これは、いくらなんでも問題ないじゃない?(関数の方の、実際の処理内容は除く) 本当にNGなら、ポインタやInterfaceがすべて破綻してまう。
>>822 スレッドがまだ動いている間に
スレッドが使っている領域を開放しちゃって落ちる
ってのをよくやっちゃうんですが・・・
わしが迂闊なだけか・・・鬱
>>820 何度もありがとうございます
>(memdc→memdc)で処理の重いStretchBltなどを使う。
(memdc→hdc)にStretchBltを使わないよう書き換えました
>最終的にmemdc→hdcして実際に表示する時は
>WM_PAINT(OnDraw)を呼び出すメソッドをスレッドから 呼び出す。
Invalidate() を使って OnPaint() を呼び出すようにしました
この部分では症状がでなくなったようです
>memdc→hdcするときに画像サイズの違いで、BitBltが
>デフォルトで呼び出すStretchBltが起きてないか注意する。
すみません、よくわかりません
しかし、BitBltではもう症状は出なくなりました
>(memdc→memdc)だけさせるスレッドでも重いかテストしてみる。
やはりStretchBltでは重いようです
画面には何も表示されませんが、
処理をした瞬間にマウスカーソルが何かにひっかかるような感じです
>823 スレッドが動いてるときに、呼び出したウインドウ閉じちゃったりして 死ぬってことかな? それは this を渡すのが悪いんじゃなくて実装の仕方が悪いような、、、 俺もよくやるけど。
>>824 >すみません、よくわかりません
CDC::BitBltの解説
「GDI は、・・・・」を参照されたし。
プラットフォームSDKのヘルプには無い解説
なので注意。
>>822 CWndの場合は、それがヤヴァイというようなことが、どっかの ASSERTに
載ってた。例えば
worker_thread(LPVOID ptr)
{
CHogeWnd* pHoge = (CHogeWnd*)ptr;
・・・
int result = pHoge->HogeMethod();
・・・
}
int CHogeWnd::HogeMethod()
{
return this->m_data;
}
とやるとおかしな値が返ってくるので、試しに HogeMethodで Breakしたら、
thisの値が、スレッドに渡した this(pHoge)とは違っていた
ってのではまった。
828 :
デフォルトの名無しさん :02/11/28 21:07
教えてください。 VCでインデントがされていないソースをきちんと揃えるにはどうすればいいのでしょうか?
>>824 >やはりStretchBltでは重いようです
スレッドのプライオリティを下げてみるとか。
それでも解決しなさそうだけど。
>>827 OnInitialUpdate、OnInitialDialog
以降でスレッド起動しても駄目かな?
俺の記憶だとOnCreateでハマッタ覚えがある。
>>802 大きめの画像を扱っている(フィルタとか?)というあたりに適度に
Sleep(0)とか入れてみると言うのはどお?
見当違いならスマソ
結局、AfxBeginThreadでthisを渡さないほうがいいって言うのはどうなの? 俺は今まで問題らしい問題は無かったんだけど、あまり他人に薦めないほ うがいいのかな。
>>832 俺も分かったような分かんないような状態なんだけど、実害を経験してるのと
CWnd::AssertValid() のソースにそれらしいことが書いてあるので、ちょっと
つっかかってみた。
>>832 ,833
要するにWindowsの世界ではスレッド毎にハンドルをくるむCWnd型を持ってて、
それを共有したりすると「うちのスレッドでこのCWnd使ってる人いないね?
じゃ捨てるよ?」とか言って他のスレッドのCWnd破棄したりとか、
(他のスレッドが触ることを考慮してないから)ロックかけずに操作したりとか、
あらゆるやばいことが起きるってことなんじゃ?
漏れは今までそう理解してた。それっぽいバグも経験したし。
というわけでスレッド間で渡していいのはハンドルのみ。
あ、あと自分がMFCと関係なく定義したオブジェクトは当然渡して問題なし。
>AfxBeginThreadでthisを渡さないほうがいいって言うのはどうなの? 手法的には、正しい。 ただ、OSの構造的にスレッドを跨げない機構があるので、要注意。問題が微妙に違う。 CSocketなんかもそうだよね。(←ウィンドウが絡んでる) vtableを信じる物は、救われる。(足下を?)
837 :
デフォルトの名無しさん :02/11/29 00:03
>>832 〜
わしも、特定できたバクは無かったけど、thisにしてしまうと、誰がからかワカランように
なるのと、***Docでそれをやると、デバックモードで動かなくなる事があった。
スレッドが原因じゃないかもしれんが調べてない
835に同意、多少手間だけど、AppのメンバにViewのハンドルを作って、メッセージで処理しとるよ。
>835 さすがに、他のスレッドが触ることを考慮してないクラスがthisを渡すはまずそうですね。
>>838 それは、スレッドセーフになっていないってこと?事情もないのに、手抜きでそーゆー事するのがおかしい。
そーゆー意味では、ウィンドウ関係は非スレッドセーフ。
たとえば、SendMessage()のロック問題とかあるでしょ?
あまり詳しいわけではなく、スレッドセーフの意味が良く分からなかったので、検索して 調べました。意味を取り違えていたらすいません。 下記のように理解しましたがOK? AfxBeginThreadでthisを渡さないほうがいい。 理由 本来スレッドセーフで設計するべきだが、Windows関係の処理には一部スレッドセーフで 無い部分があるので、他のスレッドから直接触るべきではない。 またスレッドセーフで設計されていたとしても、それを期待してthisを渡すのも、安全面 からやめたほうがいかも?
>>840 こーゆー事は、あんまり言いたくないのだが...「アホか?」。
いいかげん、ブチ切れた。なんべん、言えば理解できるのか?
「ウィンドウズは、構造的にスレッドを跨げない、場所・機能・使い方がある」ってのがこの問題の本質だ。
スレッドにthis渡してはいけないなんてのは、関係ない。thisじゃなくても、グローバルインスタンスだって、スレッドを跨いだらNGな場合だってある。
「スレッドを跨いでやってはいけない事がある」ってのが正解だ。それを防止する意味でthis渡しを禁止するのは勝手だが、誰も相手にしてくれなくなるぞ
>>841 まぁ、落ち着きなされ。thisを渡して慎重にコーディングしてウマー
なプログラムなら飯の種になるでよ。そうでなければそれなりに
というわけで、あんたは何も損しないんだから。
>>840 うーん、thisにこだわってるのでどうも理解度が怪しく見えてしまうよ。
AfxBeginThreadに渡す、渡さないはあんまり関係ない。
とにかく、AfxBeginThreadで作ったスレッドから、こちら側のオブジェクトを触るときは、
スレッドセーフな(複数のスレッドから同時に呼び出しても大丈夫なように作られた)処理がなければダメ、ということ。
MFCのオブジェクトのうち、少なくともCWndを継承しているものはスレッドセーフではない。
だから、thisに限らず、CWndの類ならそれを別スレッドから使うのはダメ。
自分でMFCと関係ないオブジェクトをスレッドセーフに定義して、それを使うのは許される。
ということ。
スレッドにCWnd*なんて怖くて渡せねーよ…。
いつもm_hWnd渡してる。
>>840 それのどこが「理解」やねん…
CreateThread使ってないだけ、マシか...
スレッドと例外処理は、薬と一緒。シロートが下手に手をだすと、周りが迷惑する。
(特に、仕事ではね)
>>842 THX
正直、すまんかった
847 :
デフォルトの名無しさん :02/11/29 15:17
入手したソースをビルドしたいんですが どうやら shlobj.h の内容が古いようでコンパイルできないんですが 最新のインクルードファイルやライブラリはどこで入手できるんでしょうか? (MSのページ見てもたどり着けなかったので・・・)
VC++6でMFCアプリ作成して 以下のクラス(シリアライズ機能をつけた)を作ったんだけど ----Line.h---- class CLine : public CObject { DECLARE_SERIAL(CLine) protected: int m_fr; int m_to; public: CLine(){}; void set(int f,int t); void Serialize(CArchive& ar); };
----Line.cpp---- #include "Line.h" IMPLEMENT_SERIAL(CLine,CObject,1) void CLine::set(int f,int t){ m_fr = f; m_to = t; } void CLine::Serialize(CArchive& ar) { CObject::Serialize(ar); if(ar.IsStoring()) ar << m_fr << m_to; else ar >> m_fr >> m_to; } これでコンパイルすると 「プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。」 っていわれちゃうんですけど・・・どうしてですか?
#include "stdafx.h" が ねーから。
852 :
デフォルトの名無しさん :02/11/29 18:57
C言語を勉強しようと思い VisualC++ standard pack を導入したのですが、 下のようなプログラムが実行できません。 stdlib がないプログラムはきちんとコンパイルも実行もできていたの ですが。 初歩的な質問申し訳ありません。 /* ch07-17.c */ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; double d; long l; i = atoi(argv[1]); l = atol(argv[2]); d = atof(argv[3]); printf("%d %ld %f", i, l, d); return 0; }
ありますよ。
>>852 実行できないとはどういう状態なの?
実は実行時に引数渡してないだけとか・・・
ch07-17.exe 10 20 30
こんな感じで実行してみ
その前にMFCじゃないだろう。
857 :
デフォルトの名無しさん :02/11/29 21:04
>>855 設定から引数渡して実行したらできました。ありがとうございます。
ところで、
プロンプトからexeを実行するにはどうすればいいんでしょうか。
最初引数の渡し方がわからなくてプロンプトから実行しようとしたんですが、できませんでした。
>>857 プロンプトで
ch07-17.exe 10 20 30
だって。
だからスレ違いなのよね。
859 :
デフォルトの名無しさん :02/11/29 22:52
そういや、MFC 使ってると stdafx.h とか afxMessageBox とか やたら afx が出てくるけど、この afx って何の意味? 誰か解説キボン。
Application Framework X
↑ この X ってのは数学で使う変数 X と一緒。
自作でスクリプト言語を作成したいのですが お勧めのHPとかありますか?
864 :
デフォルトの名無しさん :02/12/02 17:48
各種2ちゃんねるブラウザのように、各ペインを表示したり非表示にしたりするのは どうやれば良いのですか? CSplitterWndでやっているのですが、上手く実装できません。
865 :
デフォルトの名無しさん :02/12/02 18:23
いきなりですけど、\rってどんなコードですかね?
こーど?
867 :
デフォルトの名無しさん :02/12/02 23:10
少し悩んでることが…。 ファイルからデータを読み込んで表をSDIに描画しなければならないのですが、 今ひとつ上手く文字と罫線が描画できません。 表の中に表を組み込んだり複雑な描画をしたいのですが、…。 ブラウザみたいに上手くいくといいのですが…。 (ブラウザは使いたくない…というかデータファイルの性格上使えないのでこまってます) アルゴリズムか何かご存知でしょうか?
868 :
デフォルトの名無しさん :02/12/03 00:19
すみませんが、助けてやってください! 数字が書いてあるファイルを読み込んで、 データを配列に格納するプログラムの勉強をしています。 配列に格納したデータは後で別の処理に使う予定です。 データの量は二次元配列で[1000][1000]くらいです。 そこでダイアログベースにしてボタンを配置しました。 ボタンでファイルを開いてデータを配列に格納したいのですが、 配列の宣言の仕方がわかりません。 たとえば配列a[1000][1000]というのはどこに書けばよいのでしょう? OnButton1というメンバ関数?の中で宣言すると、その後その配列を外から 使うことはできないですよね? そこで、aaadialog.hという所(ヘッダファイル?)に書いてみた所、 外からも使える配列を上手く宣言できました。 ところが、今度は二次元配列をa[1000][1000]という大きな値を使いたいのですが、 スタックオーバーフローをいうエラーが出てしまいます。 malloc関数を使えばよいのかと思ったのですが、 ヘッダファイル?の中ではエラーが出てしまいます。 長文ごめんなさい。質問をまとめますと、 1.プログラム中で共通に使える配列を宣言するのはどこでやるのでしょう? 2.もしヘッダファイル内で宣言する場合、大きなサイズa[1000][1000]というような 配列の宣言の仕方を教えてください。
だからスレ違い〜。
>>868 ShowWindowだと、スプリットした各ペインを消したり表示したりできないんですよ。
>>871 google で 「分割ウィンドウ 静的 動的」で検索してみぃ
873 :
デフォルトの名無しさん :02/12/03 13:18
AfxBeginThreadで便乗質問。 スレッド生成元とは別のクラス関数を、複数起動したいんだけどどうやればいいんでしょ? { CHoge* HogeA = new CHoge(); CHoge* HogeB = new CHoge(); WorkerA = AfxBeginThread((AFX_THREADPROC)HogeA->Entry, NULL); WorkerB = AfxBeginThread((AFX_THREADPROC)HogeB->Entry, NULL); } 最初のAfxBeginThreadで「キャスト出来ん」と出ますです・・・
874 :
デフォルトの名無しさん :02/12/03 15:07
>>870 ,
>>869 スタックサイズに関してはあながちスレ違いでもなかったり。
プロジェクトの設定、リンクタブのアウトプットカテゴリに、
スタックアロケーションってーのがある。
詳しくはヘルプ見れ。
で、それが現実的でないとか言うんだったら、コンストラクなりなんなり、
C++的に適切な場所で初期化すれ。
875 :
デフォルトの名無しさん :02/12/03 15:11
シリアライズにてファイル保存の際にスキーマ番号を設定しておき、ファ イルを開く際のバージョンチェックに使用しようと思い、新規にMFCア プリケーションをプロジェクトウィザードで作成し、ドキュメントクラス に次の変更を加えました。 ・*.h 内にある、DECLARE_DYNCREATEマクロをDECLARE_SERIALマクロに変更。 ・*.cpp 内にある、IMPLEMENT_DYNCREATEマクロをIMPLEMENT_SERIALマクロ に変更。(スキームの値には [ VERSIONABLE_SCHEMA|1 ]を指定) 保存したファイルを開いて、Serialize関数の中で、GetObjectSchema()を使 用してチェックをしてみるものの「-1」と返ってくるのです。どうすれば、 スキーマ番号の設定・取得ができるのでしょうか?
################## # # # # ############## # # # # ############## # # # ################## # # ################## スプリットウィンドウを使って上記のように5つに分割するにはどうすれば良いですか?
878 :
デフォルトの名無しさん :02/12/03 16:33
>>868 どうしても、罫線と文字が重なったり、表を入れ子にすると
重なったり…。
>>877 上下に分割
上側を左右に分割
上側の右側を縦三つに分割
880 :
デフォルトの名無しさん :02/12/03 22:32
基本的なところでスマソ。 VC++6でMFC app wizard使うと, Test.h: class CMyTestApp : public CWinApp Test.cpp: // CMyTestApp クラスの初期化 BOOL CMyTestApp::InitInstance() { ...................... CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMyTestDoc), RUNTIME_CLASS(CMainFrame), // メイン SDI フレーム ウィンドウ RUNTIME_CLASS(CMyTestView)); AddDocTemplate(pDocTemplate); ......................... } みたいな感じになるよね。 ここの,RUNTIME_CLASS(....)で指定した各classのinstanceを参照する方法。 この方法やこの項目に関連したMSDN内のURLを教えていただけませんか?
ここでの質問では無いかも知れませんが、 知人に 「Visual Studio.NETのMFCを使って、ゲームを作りたい」 と言ったら、 「作りにくいから、辞めておけ」 と、言われました。 事実、そうなのですか?
>>878 それはMFCとは全く関係ない気がするんだが?
あんたのプログラムの仕方がまずいだけだろ。
884 :
デフォルトの名無しさん :02/12/04 02:54
>>875 Serialize関数のあたまで基底クラスのSerialize()を呼び出すんじゃなかったかね。
スキーマ番号そのものをシリアライズしないと読めないので。
>>881 作るゲームとスキルによる。
貴方、アホですか?
>881 ていうか作る前にここに質問に来るのは根本的に間違ってると思う
24ビットのフルカラービットマップ用の構造体 struct BITMAP24{ unsigned char RED; unsigned char BLUE; unsigned char GREEN; } がありまして・・・ それようのポインタ struct BITMAP24 *Img; を宣言しました。 で、これのビットマップサイズ分(つまり,ビットマップのイメージサイズ分height*width)のメモリを全部0で初期化したいんです・・・. で、 memset(Img->RED, 0, height * width); としたところ、エラーで1 番目の引数を 'unsigned char' から 'void *' に変換できません。といわれてしまいました。 memsetを使うやり方がまちがっているのでしょうか? 是非ともご教授いただきたく存じますm(_ _)m
>>887 そのままじゃん。
Img->REDはunsgigned char 1個だぞ。ポインタじゃないだろ。
>>888 ありがとうございました(TT)
おかげで解決しましたm(_ _)m
恥ずかしすぎるシツモンだったと・・・恐縮です。
なんつーかスレ違い質問が多すぎだよな。 単に開発にMFC使ってるってだけで、質問の内容自体はC、C++、Win32APIの話だったり。 本当にMFCに関する質問なのかどうか自分を問い詰めてから 適切なスレで質問した方が回答もより速くより正確に得られるだろうに。
891 :
デフォルトの名無しさん :02/12/05 00:08
CFormViewに貼り付けたダイアログのサイズをコード上で変えるにはどうすればいいのでしょうか?
MoveWindow
ありがとうございます。 すいませんがもう一つ。 そのCFormViewから派生して作成したViewに関連付けてある、 ダイアログのサイズの変更ををViewがサイズ変更(OnSize)した時に、 行いたい場合はどのようにすればいいのでしょうか? 色々やってもASSERTエラーがでてしまいます。
その色々何をやったのか言わんかい。 こういう場合は、初回のOnSize時にはまだダイアログが存在しないから ダイアログのm_hWndが無効でアサートしてるのが定番。 OnSizeの中で // m_dlgがダイアログだとして if(m_dlg){ // ここでダイアログのサイズを変更 } とかするとウマー
>>894 遅ればせながらありがとうございます。
なんとかできそうです。
896 :
デフォルトの名無しさん :02/12/05 19:22
Winsockでプログラミングしているのですが、 Iriaのように環境変数を指定するにはどうすればいいのですか? 教えてください。
好きなだけHTTPヘッダ付ければいいだろ。
898 :
デフォルトの名無しさん :02/12/05 19:45
すんません・・・。 以下はMFC AppwizardのSDIで書いたコードなんだけど・・・ // TODO: この場所にネイティブ データ用の描画コードを追加します。 int n; int j=0; for (n=0;n<=100;n++){ if (n%2==0){ pDC->TextOut(0,10*j,n); j=j+1; } } } エラーが出ずに起動するんだが、文字化けするんだよね・・・。 VC++始めて一日目です。教えてくれろ〜
えーと、ファイルは***View.cppです。
CString str; str.Format("%d", n ); pDC->TextOut(0,10*j, str );
一日目からこのスレかよ。先にもっと見るべき本なりサイトなりあるだろうに・・・
結局のところ
CFrameWnd::GetActiveDocument
CFrameWnd::GetActiveFrame
CFrameWnd::GetActiveView
CView::GetDocument
CWnd::GetParentFrame
その他諸々で自己解決。
>>883 コンストラクタでどうやるんだ?
漏れにはGlobalVariable使う頭悪い方法しか思いつかん。
>>902 漏れもVC++一日目だったYO!
おかげで,900のCStringなんて知らず,_snprintf使って似たような事を…
904 :
デフォルトの名無しさん :02/12/05 20:36
>>897 …ダウンローダー側の環境変数を送りたいのです。
InternetExplorerとか、Mozira とか。
すんません・・・。
甘えついでにもう一つ・・・。
>>899 のコードを実行すると偶数がズラズラ縦に書きつねられますが、
縦にスクロールしてくれないんです・・・。
解決方法は?・・・・。厨ですまそ。
>904 WinSockで、HTTPをしゃべるアプリを作っているのではないのか? そこで出てくる「ダウンローダ側の環境変数」と自分で送った HTTPヘッダのことではないのか? Mozillaの偽装をしたいなら、Mozillaと同じヘッダを送ればいい。 環境変数という言い方からも、HTTPを分かってなさそうなことは よく分かるのだが。RFC2616を読んだことはあるか?
訂正 >」と自分 >」とは自分
RFC2616読まなくてもHTTP ヘッダ ソケット とかでググればすぐ出てくるよ。 perlとかJavaのサンプルでも送る文字列自体は同じだからすぐわかる。はず。 俺はそうやったもの。
>>905 TextOut(10*j,0,str);
あ。何でない。
WinInetならUA文字列そのものずばりを指定する引数があるんだけどな。
>>905 CScrollView使いなよ。使い方まで質問しないでね。
915 :
デフォルトの名無しさん :02/12/05 21:05
>>915 ソケットで"HTTP/1.0\r\nContent-Length: 1024\r\nUser-Agent: モジラ\r\n・・・・・"
みたいな文字列を送る。つーか検索する単語でてるんだから検索しなさい。
917 :
デフォルトの名無しさん :02/12/05 21:20
918 :
デフォルトの名無しさん :02/12/05 21:22
MainFrameにあるProtectedメンバ変数(コントローラーのハンドル) を他のクラスで取得しようとpublicでGetXXXというメンバ関数を作成して 戻り値にハンドルを返そうそうとしたのですが、 コンパイル時に class 'CSplitterWnd' : コピー コンストラクタが定義されていません。 となります。コピーコンストラクタを定義するにはどうすればいいのでしょうか?
>>918 コントローラー?コントロールバーじゃなくて?
とりあえずそのGetXXXという関数を晒してみよう。
920 :
デフォルトの名無しさん :02/12/05 21:31
>>919 すいません、分割ウインドウのハンドル(?)だからコントローラじゃないかも・・
また間違ったこと書きそうなのでソース晒します。
[MainFrm.h]
// アトリビュート
protected:
CSplitterWnd m_wndSplitter;
// インプリメンテーション
public:
virtual CSplitterWnd GetSplitterWnd();
[MainFrm.cpp]
CSplitterWnd CMainFrame::GetSplitterWnd()
{
return m_wndSplitter;
}
>>920 ハンドルを取得したいならHWNDだから、Get〜の戻り値はHWNDにして
return m_wndSplitter.m_hWnd;
だと思う。
CSplitterWndのインスタンスを取得したいならポインタを返すのが普通じゃなかなぁ。
Get〜の戻り値をCSplitterWnd* にして
return &m_wndSplitter;
みたく。
参照を返した方がいい気もする
俺はいつもm_wndSplitterをpublicにしちゃってるわけだが・・・
できました!本当にありがとうございます! ポインタを返さないとあのエラーが出るということでいいんですか? これで、かなり進みました・・・
また,よろしくお願いします。
クラスウィザードって,「メッセージを受け取るメソッドを自動的に作成し,そのメソッドを人間に記入させる」というコンセプトですよね。
逆に,「予め人間様が作成したメソッドをメッセージと関連付ける」という方法はできませんか?
「メッセージ先にありき」っつーのはやっぱ性に合わない…
>>918 それC++の基本的なところ。
インスタンスを引数,返り値にすると,その実体のコピーが作られる。
copy=new CSplitterWnd(&m_wndSplitter);
と等価なコードで返り値が代入されます。
自分のC++教本読み返しとけぇ!
スレ違い内容スマソ。
昔々、BorlandにDDVTという技術があったと云う。 virtual OnTimer() = WM_TIMER; というような構文だったらしい。詳しいことは知らんが
>「予め人間様が作成したメソッドをメッセージと関連付ける」 手動でおながいします。 もしくはメッセージを受け取るメソッドで人間様が作成したメソッドを呼べばいいだけだと思うが。
929 :
デフォルトの名無しさん :02/12/05 23:12
>927 おー,なんか関数ポインタ代入してるみたいで(・∀・)イイ! 順番逆だけどさ…
ありゃ,妙な時間差が… >928 >メッセージを受け取るメソッドで人間様が作成したメソッドを呼べばいいだけだと思うが。 現在は仕方なく,このようにしております…(;_; メッセージマップの関係がGUIで直に確認できたら(・∀・)イイ!のになぁ,ってね。
>メッセージマップの関係がGUIで Ctrl+Wでクラスウィザード起動すれば見れると思うけど、どうよ?
932 :
デフォルトの名無しさん :02/12/05 23:47
グローバル変数をウォッチしても値が更新されない。なぜ? 一度ウォッチの窓を消して、再度出すと更新されているのだが。 6.0 Professional MFC
>>932 常に最新の実行時の値が表示されてるわけじゃないぞ。
>>933 素早いフォローサンクス。
じゃあ、刻々と変化していく変数の値を知りたい場合、コードに埋め込む以外は
方法はないと言うことでしょうか?
>>934 TRACE( ... )マクロ便利だよ。
printfと同じ構文で使えて、デバッグウィンドウに文字を表示する。
ASSERTと同じくDebug版のみで動作し、Release版ではなにもしない。
TRACE("%d\n", i);
でiの値がアウトプットウィンドウに逐一出力される。
ソースコード眺めてたら, BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ..... END_MESSAGE_MAP() てな部分でメッセージマップ定義しているを発見。 >931 こっちを書き換えてやると,確かにクラスウィザード上で確認できました。 今までは,クラスウィザード作るメソッドをラッパーとして使っていたもので(^^;; # んー,NeXT DevelopersはこのあたりのGUIの出来がよかったなぁ…
モードレスダイアログ上に貼り付けた CListCtrl(仮想リストビュー)上での ドラッグの開始/終了時に送られてくるメッセージは HDN_BEGINDRAG/HDN_ENDDRAG でOK? Class Wizardでメッセージハンドラを実装させてみたけどちっとも呼ばれない。 念のため LVN_BEGINDRAG も試してみたけどやはりダメ。 他の HDN_〜 はちゃんと動作するのになあ。 環境はWinXP、VC++6.0っす。
938 :
あだ名はG。 :02/12/07 20:05
すいません。基本的な質問をします。 MFCでCTest1ダイアログをつくりました。 ダイアログ内にはエディットボックス(IDがIDC_EDIT1、変数名がm_edit1)を作りました。 で、ソース内で、 CString str("2ch"); m_edit1=str; と、エディットボックスにstrを代入したのですが、 ダイアログ内のエディットボックスには、さっき代入した「2ch」が表示されません。 エディットボックス内のメンバーに文字列を代入した際、その代入をダイアログ内に反映(表示)させるのはどうすればいいのでしょうか?
939 :
あだ名はG。 :02/12/07 21:03
>>938 解決。
(CWnd->UpdateData(BOOL))
>>937 LVN_BEGINDRAGでふつーに取れるけど…。
ダイアログにリストビューコントロールはりつけてOnInitDialogでアイテム一個追加して
クラスウィザードでLVN_BEGINDRAGのハンドラ作ってブレークポイント置いただけ。
Win2000, VC++6.0SP5
HDN_はヘッダ用だよ
OnNotifyで強引に捕らえる方法があったような。
>>940 >>941 回答ありがとう。
「ドラッグ」の意味を勘違いしてた。
GoogleやMSDNで調べているうちに今やっと気づいたんだけど、
アイテムをまさに「引きずる」のがドラッグだったのね。
自分がやりたかったのはマウスでの矩形選択(複数のアイテム)だった。
この動作のこともドラッグと呼ぶものだと長い間思ってた。
WM_LBUTTONDOWN/WM_LBUTTONUPのメッセージハンドラで様子を見てみたんだけど、
クリックして「DOWN」が送られてきたあと、ボタンを上げずに移動させると(自分的にはドラッグ)、
矩形選択の開始を知らせるメッセージがWinから送られてきている模様。
でもそのメッセージの名称がわからないから、
どうやって捕まえればいいのかよくわからない。
とりあえず、「DOWN」のハンドラでフラグを立てておいて「ドラッグ」開始、
「ドラッグ」中はWM_MOUSEMOVEが送られて来ないので、
「UP」後、「MOVE」が来たときにフラグが立っていたら「ドラッグ」終了、
というやり方を考案してみた。
矩形選択開始時に送られてくるメッセージが何なのかを知ってる人がいたらよろしく。
944 :
デフォルトの名無しさん :02/12/08 12:42
矩形って用語的には bounding box か。
>>943 >>944 回答、Thanks a lot。
そっかー、マーキーなんて名前なんだ。
ぱっと見て一瞬、HTMLのマーキーを連想して「何のネタだよ!」と内心突っ込んでた。すまん。
これ、BEGINはあってもENDはないのね。LVN_BEGINDRAGと同じで。
英語、そんなに得意じゃないんだけど、マニュアルが言ってるのは
「選択を始めたら0が、選択を終了したら0以外が (LPNMLISTVIEW) lParam に代入される」
ことで開始/終了を知ることができる、てとこかな。
勉強になるなあ。
946 :
デフォルトの名無しさん :02/12/09 15:40
MFC で SDI のプロジェクトを作ったときにメニューって絶対作られちゃうの? メニュー無しはダイアログベースじゃなきゃ作れないもの? IDR_MAINFRAME のメニューが非常に邪魔なのだが。
>>946 構築後に消してる
m_pMainWnd->SetMenu( NULL );
>>947 > 構築後に消してる
> m_pMainWnd->SetMenu( NULL );
できますた。
ありがと。
949 :
デフォルトの名無しさん :02/12/09 16:03
オリジナルのMassageBoxの出し方を教えてください。
>>949 他人にわかるように喋ってください。
…ダイアログ自分でつくりゃいいじゃん。
>949 つーか、マッサージボックスって何だよ(w
952 :
デフォルトの名無しさん :02/12/09 17:43
Emacみたいなコマンドで編集するメモ帳を作りたいのですが、 CEditViewを使った方がいいのでしょうか? それとも自分でクラス作ったほうが早いですか? C++&MFC始めたばっかでよくわからんのです。 アドバイスください。
>>952 オリジナルのViewクラスは結構めんどいよ。
使い始めたばかりなら、まずCEditViewでドキュメントービュー構造になれたほうがよさげ。
最近故あってSDKベースからMFCにやってきますた。 operator= が使えるCStringArrayを作りたいんですが、どう書けばよろしいでしょう? STLとかATLは使えない環境でつ。
>>954 レスありがとうございます。
了解しました。
>>955 普通に派生クラス作って operator= をインプリメントするのはダメなんでしょーか?
959 :
デフォルトの名無しさん :02/12/11 18:42
VC+++MFCでhttpsサーバにアクセスするクライアントを作成する場合、 どのAPI、クラスを使えばよいのでしょうか? WinInetやそのラッパークラスにはhttpsについての記述がありませんでした。
INTERNET_FLAG_SECURE
CString に char[256]とかを =演算子で何度も追加するのはまずいですか?
CMapWordToObでメモリリーク起こさない方法ってどうすればいいんでしょう? deleteすると、キーを挿入しているところで大量に漏れてると言われます。 VC6.0です。
>>962 ループで回してMapの要素を一つずつdeleteする。
>>963 それでも結果全く同じ。
ダンプを見ると、どうもキーのメモリが開放されてないようなんですがそんなことあるんですかね?
以下、削除部のソース
{
POSITIONpos;
WORDkey;
CObject*pa;
pos = ThStack_w.GetStartPosition();
while(pos != NULL) {
ThStack_w.GetNextAssoc(pos, key, (CObject*&)pa);
ThStack_w.RemoveKey(key);
}
}
>>965 SetAt する時にオブジェクトを new してるんでしょ?
↓でどう?
pos = ThStack_w.GetStartPosition();
while(pos != NULL) {
ThStack_w.GetNextAssoc(pos, key, (CObject*&)pa);
delete pa;
ThStack_w.RemoveKey(key);
}
>>966 ダメでつ。
一発目からAccess Violationが出ます。
delete pa のとこで。
といーますかPtrじゃなくてOb系なんで、削除は保証されてるはずなんですがねー。
マニュアルまたバグってる?
ちなみに、MSDNがCMapWordToObの参考にしてくれって言ってる CMapStringToObにはこうある >CMapStringToOb オブジェクトを削除するか要素を削除すると、 >CString オブジェクトと CObject ポインタが削除されます。 >CObject ポインタが参照しているオブジェクトは破棄されません。 Mapの要素としてのCObject*は破棄されるが、 その先のオブジェクトは破棄しないということだな。 CMapWordToObの説明は >その要素を削除すると、対応する CObject オブジェクトが削除されます。 ってあるが。
>>968 そんなことはない。
ThStack_w[para_w] = (CObject *)new CString(temp);
>>969 そう。
どっちを信じていいか小一時間悩んで、結局deleteできないなら後者だろ、と思った。
でも漏れ漏れ。どうなってんやら。
>>970 CStringはCObjectじゃないよ。
>>972 おお、それは気が付かなかった。
CStringArrayに替えたら解決しますた。
ダンケ。
>>973 CStringArrayでええんか?
CString*を保持するCMapWordToPtrの方が良いんじゃ?
975 :
デフォルトの名無しさん :02/12/12 19:36
MediaPlayerのActiveXコントロールで、実行時にサイズ変更する方法を教えてください。 MoveWindowするとエラー出てしまいます。 CMediaPlayer2を見てもそれらしきものが見当たらないっす。
978 :
デフォルトの名無しさん :02/12/13 05:22
スプリットウィンドウで分けて複数のビューを 表示してる場合にWM_KEYDOWNメッセージを 特定のビューで受けたい場合はどうしたらいいのでしょうか どのビューでもOnKeyDownが動いてくれません
すいません、どのビューでも動かないとかいてしまいましたが 一番左上のビューで動きました 2列に分割して左の列を2行に分割していて 左下のビューで受け取りたいのですがSetActivePaneとかしても アクティブになってくれません
すいません解決しました ボタンにフォーカスあたってたのをなくしたら OnKeyDown動いてくれました ボタンにフォーカス当たったままじゃ ビューがメッセージ受け取らないとは知りませんでした
>>974 元々スレッド間通信に使おうと思ってたから、Arrayの方が都合が良い。
故にこれでオケー。
続けて質問させてください 入力するキーによって 受け取るビューを変えたいのですが どうしたらいいでしょうか たとえば数字キーなら左のビュー エンターキーなら右のビューといった感じです
|■\ | ∀`) ダレモイナイ... | ⊂) ワショーイスルナラ イマノウチ | / ./■\ ∩´∀`∩ ワショーイワショーイ ヽ 丿 ( ヽノ し(_) /■\ (´∀`∩) ワワワワワショーイ (つ 丿 ( ヽノ し(_)
age
>>986 いい加減にそういう冬厨丸出しなことはやめてくれ
冬坊丸出し上げ
どっちが冬厨だか(藁
d
a
r
e
m
o
1000
torannoka
YO!
jyaorega1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。