■ VisualC++(MFC限定)相談室 4■
■ このスレッドは過去ログ倉庫に格納されています
0001MFC
NGNG※MSDNライブラリをよく読む。
※関連すると思われるクラスのメンバ関数を探してみる。
※そのクラスの基本クラスのメンバ関数も探してみる。
※Win32APIからも探してみる。
※WEB検索。
※たいていの問題は>>2-3のサイト/書籍で探せば解決。
0002デフォルトの名無しさん
NGNGまずはスレをさかのぼってキーワード検索してみよう。
■ VisualC++(MFC限定)相談室 2■
http://pc.2ch.net/test/read.cgi/tech/1008031675/
■ VisualC++(MFC限定)相談室 3■
http://pc.2ch.net/test/read.cgi/tech/1014057520/
:: 国内サイト ::
VC++ML
ttp://mfc.acty-net.ne.jp/ml/mfc/
WEBから過去ログ検索できるので便利。
Visual C Forum
ttp://forums.belution.com/ja/vc/
アーカイブ検索やTechTipsあり。
:: 海外サイト ::
CodeGuru
ttp://www.codeguru.com/
便利なクラスやTips、サンプルが満載。
CodeProject
ttp://www.codeproject.com/
便利なクラスやTips、サンプルが満載。
0003デフォルトの名無しさん
NGNGMFCによるWindowsプログラミング改訂新版
MFCのバイブルと呼ばれている本。
基本的なことから広範囲にわたって解説されている。
ただしデータベースやネットワーク関連クラスについては
触れられていない。
VisualC++5 パワフルテクニック大全集
テクニック集。書籍名のとおり内容は少し古い。
ワンポイント・レッスン 最新Windowsプログラミングテクニック
テクニック集。書籍名のわりに内容は少し古い。
Best of MSDN magazine 上・下巻
ワンポイント〜の続編。
WinSock2.0プログラミング
MFCの本では無いが、ソケット関連クラス(CAsyncSocket、CSocket)
について書かれている数少ない書籍の中の一つ。
00041
NGNG独断と偏見で参考サイト/書籍を挙げておきました。
これからMFC関連の新書は出ないんでしょうかね……
0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNG国内と海外を区別する理由は?
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNGイメージとしては、ツールバーにWordのような文字色を変更するためのボタンを作り、
色を選択するとそのボタンの色も選択した色で着色したいのです。
0011デフォルトの名無しさん
NGNGサブクラス化したコントロールをメンバに持つ親ウィンドゥがあり、
それら両方に同じメッセージに反応するハンドラを実装した場合、
試してみると親ウィンドゥのハンドラのみが呼び出されます。
これを、サブクラス化されたコントロールのハンドラも呼び出されるように
する方法ってありますでしょうか?
当然、親のハンドラ内で m_MyControl.OnXXX() を呼び出したり、
メッセージを親の WindowProc() 内で処理するようにすれば実装できますが、
これでは保守性が悪いので、スマートな方法を模索しております。
0012デフォルトの名無しさん
NGNGON_CONTROL_REFLECT_EXマクロを使って、ハンドラ内でFALSEを返す
のはどうかな?
これだと子→親へとメッセージがルーティングされる。
0013デフォルトの名無しさん
NGNG11です。
すばやい回答ありがとうございます。
まさしく、ご指摘どおりの方法で希望の動作を実現することができました。
ありがとうございました。
これで、親ウィンドゥでは通常の方法でメッセージハンドラを追加するだけで
両方のハンドラを呼び出すことができるようになりました。
0014
NGNGButton.MoveWindow()で動かしているのですが、
WM_SIZEを拾うOnSize()でやるとコンパイルは通っても実行時に止まってしまいます。
OnPaint()では縮小のみの場合書き直されないようで・・。
0015デフォルトの名無しさん
NGNG確認したほうがいいよ。その方が回答も得られやすいし。
この場合、たぶん始めにOnSizeが呼ばれたときはまだコントロールが
無いから、Button.MoveWindowのButtonが無いって起こられてるんだと思う。
OnSize内で
if(Button){
Button.MoveWindow(・・・);
}
としてみては。
0016
NGNG起動時にもOnSizeが呼び出されるんですね。
ありがとうございました。
0017デフォルトの名無しさん
NGNGプロパティシートにプロパティページを複数張り付けて表示しています。
そのうちのプロパティシートで最初にAddされたページ(ページのINDEXは0だと思う)
のタブ部分にフォーカスというか、カーソルというか、クリック後のように
文字が点線で囲まれたような状態にしたいんです。
調べたところCTabCtrl::SetCurFocusを使うのではないかと思い、
ページのOnInitDialogでやってみたのですが使い方を間違えているのか、
うまくいきませんでした。何かヒントなどあったら教えてください!お願いします。
0018デフォルトの名無しさん
NGNG0019デフォルトの名無しさん
NGNG0020デフォルトの名無しさん
NGNGフォーカスが移ってしまうみたいだね。
これを断ち切ればタブにフォーカスがセットされたままになると
思うのだけれど・・・どうしたものか。
0021デフォルトの名無しさん
NGNGタブ.SetCurFocus( 1 );
でだめならPostMessageするしかないかな。
0022デフォルトの名無しさん
NGNGそうですか・・・ありがとうございました。PostMessageですね。
やってみようと思います。
0023デフォルトの名無しさん
NGNGキャプションを変更するには
どうしたらいいでしょうか?
0024デフォルトの名無しさん
NGNGホントいい加減にして欲しいよなぁ
MFCが行き詰まったとか対応できなくなったとか、そんなんあるか?
0025デフォルトの名無しさん
NGNG何をしたいか書いてないから断定できないが・・・
動的にドキュメントテンプレートのリソースが交換でないし
AfxGetMainWnd()->SetWindowText ( "My Own Title" );
SetMenu();or UPDATE_COMMAND_UIのCCmdUIを使うしかなと思う。
0026デフォルトの名無しさん
NGNG0027デフォルトの名無しさん
NGNG楽です。フレームワークの範囲ならC++の知識も大して要りません。
(テストプロジェクトを作って見ればどれだけ楽か判ります)
それ以外は全く同じです。
0028デフォルトの名無しさん
NGNG0029デフォルトの名無しさん
NGNG丸型のウィンドウとか、六角形だとか、もしくは複雑な形のウィンドウです。
0030デフォルトの名無しさん
NGNGSetWindowRgn
0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
NGNG大して楽になりません。結局Win32APIとMFCの関係を知らないと
困ること多し
0033デフォルトの名無しさん
NGNGo_edit_control.SetSel(0, -1, false);
UpdateData(false);
これでコンパイルは通るんですが、全選択がされません。
第2引数に5などの数を入れたり、第3をtrueにしてもダメ。
何か他に設定とかありますか?
0034デフォルトの名無しさん
NGNGなんでUpdateData(false); してんの?
なんでUpdateData(false); してんの?
0035デフォルトの名無しさん
NGNG出来ればスマートな方法をお教え頂きたいのですが。
0036デフォルトの名無しさん
NGNGツールバーの代わりに ReBar を使ってしまうのがスマートかと。
0037デフォルトの名無しさん
NGNG0038デフォルトの名無しさん
NGNGセパレータの幅を指定することが出来るので広めのセパレータを作成し、
その領域にEditを貼り付ける。
0039デフォルトの名無しさん
NGNG表示しないようにするには、どうしたらいいですか?
0040デフォルトの名無しさん
NGNG004135
NGNG教わったキーワードを元に色々調べてみます。
ありがとうございました m(_ _)m
0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNGアクティブビューの取得
0044デフォルトの名無しさん
NGNGビュークラスのOnUpdate()中でサブアイテムを追加しようとすると失敗します。
何か足りないんでしょうか?こんな感じ。
void CPageNumerView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CListCtrl& listCtrl=GetListCtrl();
listCtrl.DeleteAllItems();
CPageNumerDoc* pDoc = GetDocument();
LV_ITEM listitem;
for(int i=0; i < pDoc->m_PageNo; i++){
int iActualItem;
listitem.mask = LVIF_TEXT;
listitem.iItem = i;
listitem.iSubItem=0;
listitem.pszText=_T("サブアイテム番号0は追加成功");
iActualItem=listCtrl.InsertItem(&listitem);
listitem.iItem = iActualItem;
listitem.mask = LVIF_TEXT;
listitem.iSubItem=3; // ここに0を指定すると正常動作
listitem.pszText=_T("追加されないよー");
listCtrl.SetItem(&listitem);
}
}
ちなみに何故か同じ処理をOnInitialUpdate()で行うとちゃんと動きます…。
004542
NGNGありがとう。氏んでくる。
004644
NGNG0047デフォルトの名無しさん
NGNGいいえ、どういたしまして。
0048デフォルトの名無しさん
NGNGTVN_ITEMEXPANDINGを捕まえれば良いような気もしますが、これって展開か縮小かどっちか判断できませんよね?
004948
NGNG0050デフォルトの名無しさん
NGNG前スレ881のPtInRegionだけど解決したので一応ご報告
If (rgn.PtInRegion(point) == TRUE)
これを
If (rgn.PtInRegion(point) != FALSE)
に変えたら直りました。
こんな落とし穴に1週間悩むなんて....鬱
0051デフォルトの名無しさん
NGNGま、人に話してると分かっちゃうってのは実際よくあるけど。
0052デフォルトの名無しさん
NGNGよい傾向ではないか?
0053デフォルトの名無しさん
NGNGページ1(クラスMyPage1)にEditBoxを置いています.
そのEditboxの値を,
CMyDlgクラス(始めに作成したクラス)のOn_Button()内で使いたいのですが.
クラスが違う時はどのようにEditboxの中身を参照すればいいのでしょうか?
0054デフォルトの名無しさん
NGNGpublic宣言されるので外から参照できます。
0055デフォルトの名無しさん
NGNGBOOL だから安心したんだろうけど、MSDN はちゃんと読むもんだよ。
BOOL PtInRegion(HRGN hrgn, int X, int Y);
戻り値
点がリージョンの内側に含まれていたときは、0 以外の値が返ります。
点がリージョンの内側に含まれていなかったときは、0 が返ります。
TRUE が返るとは一言も書いてない。そもそも C 言語で...
if(xxx == TRUE){...
とかくのはどうかと思う。真偽しか返ってこないとわかっているなら...
if(xxx){...
と書いたほうが良いと思う。(まあ、個人的見解だけどね。)
0056デフォルトの名無しさん
NGNG漏れは前者の方が好きだが。分かり易くて良いよ。== TRUE
0057デフォルトの名無しさん
NGNG005855
NGNGまあ、>>55 にも書いたが、個人的見解が色々ありそうなところではある。
ただ、>>50, >>57 の通り == TRUE は、色々危ないし != FALSE
と書く余計わかりにくくなると思うが、どうよ ?
0059デフォルトの名無しさん
NGNG0060デフォルトの名無しさん
NGNGBOOLはboolじゃないんだから。
0061デフォルトの名無しさん
NGNG「1かそれ以外」で判定するのはやめてくだちい。
0062デフォルトの名無しさん
NGNGOleLoadPicture。これ最強。
0063デフォルトの名無しさん
NGNGCEditにいったんフォーカスを移してしまうと、ScrollViewをクリックしても
KILLFOCUSされないんですよね。
これ、何か回避方法はあるのでしょうか。要はScrollView上にフリーに
文字列を書いて行くようなアプリを作りたいのですが。
0064デフォルトの名無しさん
NGNGViewにEditって貼り付けるって、その考え方おかしくないか?
あり得ないと思うが。
006563
NGNGそですか?表現が悪いのかなぁ。Winプログラミング初めてなもんで。
フォームビューにエディットボックスを貼り付けるのは普通にやりますよね。
スクロールビューにも貼り付けることは出来たんですけど、
(そもそも、貼り付けるって言う表現は適切なのかな・・・)
編集状態から抜けるためには、ビューのところをクリックしてもだめなんですよね。
0066デフォルトの名無しさん
NGNG0067デフォルトの名無しさん
NGNGウィンドウはクリックしても自動的にフォーカスは受け取ってくれないんじゃなかったっけ?
OnLButtonUpでSetFocusじゃないかな?
0068デフォルトの名無しさん
NGNGCView →CFormView(Dialog)→CEdit
ビューの動作
CView →CCtrlView→CEditView(Edit)
0069デフォルトの名無しさん
NGNG何が言いたいのか解らないのですが・・・
0070デフォルトの名無しさん
NGNG解決しました。ありがとうございました。
OnLButtonDownじゃ駄目なんですね。なぜなんでしょう。まだ精進が足らんな。
0071デフォルトの名無しさん
NGNG謎な順番でファイル名が返ってきますけど、
アルファベット順に受け取りたい、時は、
どうすれば良いでしょう?
0072デフォルトの名無しさん
NGNG0073
NGNGツリーの選択されたノードに登録されているオブジェクトを取得ってしたいのですが。
0074デフォルトの名無しさん
NGNG0075デフォルトの名無しさん
NGNGhttp://www.ne.jp/asahi/hishidama/home/tech/vcpp/dropfile.htmlをサンプルに、
VC6++でMFC ActiveX ControlWizardでEDITを基底クラスにして、DragAcceptFiles()と DragQueryFileでDropを受け取るコンポーネントを作成し、ActiveX Control Test Container で実行したところ、問題なくエクスプローラからファイルをDropすることができました。
しかし、HTMLに貼り付けIE上から同じことをしようとしたところ、このコンポーネントはDropを受け 取ることができませんでした。
もうひとつこのコンポーネントからDialogを開き、それを「ドラッグドロップを許可」で受け取れるよ うにして実験してみても結果はおなじでした。
IEのセキュリティ上の問題なのかとも考えていますが、そういう資料がみつかりません。
0076デフォルトの名無しさん
NGNG変わってるときはおまえらどうしてますか?
1.旧バージョンのファイルと互換性をなくす
(このことをReadme.txtなどでユーザに通知)
2.ファイルの先頭にバージョンを表すコードを埋め、
読み込み時にそのコードでファイル形式を場合分け
3.シリアライズ時にスキーマ番号でファイル形式を場合分け
実は3でやろうと思ったらスキーマ番号が反映されなくて困った。
GetObjectSchema()で番号を取得しても4294967295という変な数字しか
返ってこないのです。
0077デフォルトの名無しさん
NGNG0078デフォルトの名無しさん
NGNG今度はいった会社にVC6.0があります。ソフト屋でないので
誰も使っていません。もちろんMSDNには入っていません。
その古いVC6.0でWin2000命令のColorRGBtoHSLが使えません
おそらくダウンロードサイトいって落としてくれば良いと
思うのですが該当するファイルがわかりませんでした
VCサービスパック5は落として当てていますがダメのようです
前の会社ではVC6.0 Win2000サービスパック(名前うろおぼえ)
というCDがあったのでそれとは思うのですが・・・・
よろしくお願いします
0079デフォルトの名無しさん
NGNG4294967295==0xfffffffだからオブジェクトのバージョン不定とおもわれます。
CXXXDocクラスなんかはDECLER/IMPLEMNT_SERIALしてもクラス情報をファイルに
書き込まないから必ずオブジェクトのバージョン不定になります。
0080デフォルトの名無しさん
NGNGてことはCDocumentの派生クラス(つまりAppWizardで生成されるもの)
ではスキーマ番号によるバージョン管理はできないということですか??
0081デフォルトの名無しさん
NGNG何故ドキュメントやビューの子クラスのバージョンがー1になるかは知りません。ですが
ar.SerializeClass()でクラスの情報を強制的に読み書きすればドキュメントクラスも
バージョン管理ができます。(MSDNアンドキュメンテッドです)
そもそもファイルのバージョンという概念がないですから(クラスのバージョンと
いう概念しかない)ファイルバージョンクラスを作って管理するのが正しいやり
かたかもしれません。
IMPLEMENT_SERIAL(CMyDoc, CDocument, VERSIONABLE_SCHEMA|100)//Ver1.00
void CMyDoc::Serialize(CArchive& ar)
{
ar.SerializeClass( RUNTIME_CLASS(CMyDoc) );//親でなく自分のクラス名
if (ar.IsStoring()) {
ar << m_pObject;
} else {
UINT nVersion = ar.GetObjectSchema( );
ar >> m_pObject;
}
}
0082
NGNG当然マイPC(Win98)では稼動するわけだけど
これってどのマシンで動くの?
VBの場合ってVBランタイムってのが入ってないとだめじゃん。
他のPCで動かす場合でVC++が入ってない場合
VCで作ったプログラムもこのようなVCランタイムみたいなのが
必要なの?
ちなみに95で起動エラーおこしました。
0083デフォルトの名無しさん
NGNG0084デフォルトの名無しさん
NGNGもしくわスタティックリンくさす。
とよく確かめもせず答えてみる
0085デフォルトの名無しさん
NGNGスマソ向こうに書き込んでた。
http://pc.2ch.net/test/read.cgi/tech/1022402165/720
008682
NGNG>>85
いまいちわからんけど、とにかくありがとう。
えーっとVC++が入っているPCはDLLがはいっていて
普通に作ったデバッグフォルダの中にある完成品単独で動くんだよね。
サブマシンWin98で作ったものがメインマシンXP(VC++インストールしてある)
で単独で動きました。
ただ大学のWin95のVCはいっていないマシンで動きませんでした。
このMFCDLLってのは通常は入っていないものなの?
えーっとスタティックリンクってのもそれっぽいエラーでました
そこをなんとかすれば動きそうなんですけど。
>>85さんのが答えなんだろうけどちょっとわかんないです。
つまりどうしたらいいのでしょうか。バカですいませんです。
0087デフォルトの名無しさん
NGNG(VC++.net standard 以上と思う)
スタティックリンクのオプションが通っていて、Win32 Releseになってる
の確認してもうリビルドしてみたら。(my.exeはreleaseのしたにある)
もしかしたらスタテックライブラリが(コンパイルマシンに)インストールされて
ないかもしれないからその時は、ライブラリをインストールするか、
他のWin95or98機からMFC42.DLLをそのWin95機のwindows\systemフォルダー
にコピーするだけでMY.exeが動くようになると思うけど。(未確認)
0088デフォルトの名無しさん
NGNGまあ無理して95でうごかすつもりはないけど
みなだんはVC++で作った作品を公開する場合、
どうしてるんですか?98、Me、XPで動くようにするために
0089デフォルトの名無しさん
NGNG0090デフォルトの名無しさん
NGNGで、その壁紙で使用するJPEG画像をプログラム中に埋め込んで、ユーザが
用意せずにボタンを押すだけで変更できるようにしたいのですが。
プログラムに画像を埋め込んでそれを使用できるようにする方法はどのようにしたらよろしいでしょうか?
色々WEBで調べてみたのですが、検索の仕方が悪いのか、全然わかりません。(TT
0091デフォルトの名無しさん
NGNGどうすれば莫大な文字列を格納できるでしょうか?
0092[email protected]
NGNG「高性能ビデオスタビライザー」です↓
http://user.auctions.yahoo.co.jp/jp/user/NEO_UURONNTYA
店頭販売価格は、13900 円なんですが、
今回だけ、破格の 7100 円に設定して
おります。
購入希望の方は、名前の所にも書いて
ある、[email protected] 迄、
メールを下さい。
不安な方は、落札をして頂いても
構いません。
0093デフォルトの名無しさん
NGNGres://ファイル名
形式でリソースにアクセスできたはず、
ドキュメントは・・・どこで見たか忘れた。
res://C:\WINDOWS\System32\shdoclc.dll/dnserror.htm
それが壁紙に使えるかどうかは知らないけどね。
1.プロジェクト名"Test"でダイアログアプリケーションを新規作成する。
2.リソースエディタでプッシュボタン(ハンドラ:OnButton1)を作成する。
3.それぞれのソースに下記を追記。
・TestDlg.h
class CTestDlg : public CDialog{
private:
CWinThread* mpThreadList;
};
・TestDlg.ccp
extern UINT gThread (void* pParam);
void CTestDlg::OnButton1(){
mpThreadList = AfxBeginThread(gThread ,this);
}
UINT gThread (void* pParam){
UINT i,j=1;
for(i=0;i<30000000;i++){
j *= j; j /= j; j++; j--;
}
AfxEndThread(0);
return j;
}
4.上記を実行し作成したプッシュボタンをクリック。
不具合)
gThreadの実行中にダイアログを閉じるとメモリリークが発生する。
上記のようなメモリリークが起きて困っています。
どのように記述すればよいのでしょうか?
0095デフォルトの名無しさん
NGNGとやったら純粋仮想関数の定義が間違いだとえらーがでます=0とやれと。
なんで??
0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNG生ポインタを使う。
>>94
気づいたとこだけ
AfxBeginThread(gThread ,this)にはCWnd*を渡さないほうが
よいといわれている。
AfxEndThread(0);
return j; <-これは実行されない気がする。
あとメモリリークはオートデリートするフラグとかの関係かも
以上適当に書いてみました。バーカバーカ
0098デフォルトの名無しさん
NGNGあふれそうになったら、勝手に伸ばしてくれるので気にしなくてよい。
0099デフォルトの名無しさん
NGNGINT_MAX-1
まで。それ以上は使えません
0100デフォルトの名無しさん
NGNG0101デフォルトの名無しさん
NGNGありがとうございました。
どうやら、壁紙には使えないようです><
ファイルをハードにコピッて使えるかどうか試してみます。
■ このスレッドは過去ログ倉庫に格納されています