■MFC相談室 mfc20d.dll■
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/12/26(金) 00:43:36前スレ
■MFC相談室 mfc19d.dll■
http://pc11.2ch.net/test/read.cgi/tech/1207301867/
0002デフォルトの名無しさん
2008/12/26(金) 01:09:300003デフォルトの名無しさん
2008/12/26(金) 05:21:39ウィンドウに張り付けたコントロールをスクロールさせてるんですが、
ウィンドウ内のどこへでも行って他の描画を上書きしてしまいます。
このコントロールをウィンドウ領域を制限して移動させるにはどうすればいいんでしょうか?
コントロールの一部が見えている状態もあり得るので領域の制限がいいです。
CRgn rgn;
rgn.CleageRgn(表示領域);
CPaintDC dc(this);
dc.SelectObject(&rgn);
こうじゃないかと思ったんですが、
コントロールのポジション設定の前に書いても
ウィンドウのOnPaintの最初にも書いたのですが、だめでした。お願いします!
0004デフォルトの名無しさん
2008/12/26(金) 08:41:350005デフォルトの名無しさん
2008/12/26(金) 09:10:40何がやりたいのかさっぱりわかんない
0006デフォルトの名無しさん
2008/12/26(金) 10:40:19ウィンドウ内でボタンコントロールを表示させたくない領域か、表示される領域を分けて作りたいんです。
0007デフォルトの名無しさん
2008/12/26(金) 12:03:02で、子ウィンドウそのものをスクロールさせる。
ボタンは子ウィンドウの中に存在するから、親ウィンドウの領域を侵すことはない。
00087
2008/12/26(金) 12:13:54子ウィンドウの中でボタンをスクロールさせる の間違い。
0009デフォルトの名無しさん
2008/12/26(金) 23:01:00きづかなかった・・・・・
お知恵を頂きありがとう!
0010デフォルトの名無しさん
2008/12/27(土) 00:31:41ちゃんと>>7を読んだ?
スタティックコントロールの上にボタンを置いても、親から見ればどちらも子供だからボタンを動かすと親の領域を侵すぞ。
親の中に子ウィンドウを作って、さらにその中にボタンを置くんだよ。つまり、親から見ればボタンは孫。
「子ウィンドウの中にボタンを配置」とわざわざ書いたのは、そういうことなんだがな。
0011デフォルトの名無しさん
2008/12/27(土) 00:33:34俺は>>6の文章で何を言ってるのか意味がわかんねーよ
0012デフォルトの名無しさん
2008/12/27(土) 03:12:14CStaticの上ではなくて派生CStaticの中でボタンをCreateです。
わかってます大丈夫です。ありがとうございます。
まだコンパイルまで行きませんが、はみ出したらCWnd派生を置いてやります。どうもです。
0013デフォルトの名無しさん
2008/12/27(土) 08:35:47そう。
たぶん次は、『スクロールさせるボタン以外、貼り付けたスタテイック
コントロールに重なっているダイアログ内のコントロールが上書きされ
たり、欠けてしまう』などと質問してくるに違いない。
0014デフォルトの名無しさん
2008/12/27(土) 09:02:320015デフォルトの名無しさん
2008/12/27(土) 09:26:30スタティックコントロールをWS_VSCROLLで張り付けたんですが、スクロールバー操作が全くできません。
SS_NOTIFYを付けたんですがだめです。クリックDownは届いてるんです。
スタティックコントロールではなくリストコントロールを代わりに張り付けたら、リストコントロールは全部操作できるんです。
どういうことですか?
0016デフォルトの名無しさん
2008/12/27(土) 10:52:06お世話になりました。
0017デフォルトの名無しさん
2008/12/27(土) 11:04:00・・・・・・孫にしてどーする。^^;
0018デフォルトの名無しさん
2008/12/27(土) 11:51:130019デフォルトの名無しさん
2008/12/27(土) 11:53:57ント通知がダイアログに送られてこないかな?
0020デフォルトの名無しさん
2008/12/27(土) 12:21:550021デフォルトの名無しさん
2008/12/27(土) 13:18:25そういうコードを子供に書くんだよ。孫から親には通知されないが、子から親には通知されるだろ?
孫から子、子から親に通知すれば、ちゃんと親元に届くじゃないか。(笑)
0022デフォルトの名無しさん
2008/12/27(土) 16:36:43そういうメッセージの流れを承知していれば、
> もうわからないのでスクロールバーは孫ではなく子にしました
なんて話も出てこないのでは?
0023デフォルトの名無しさん
2008/12/27(土) 19:18:270024デフォルトの名無しさん
2008/12/27(土) 20:16:07ExitInstanceとかやデコンストラクタでは読み込めないっぽいんです。
どの関数を使ったらいいですか?
0025デフォルトの名無しさん
2008/12/27(土) 21:00:34もう少しまともな質問の仕方ができるように、MFCを勉強してこい
0026デフォルトの名無しさん
2008/12/27(土) 21:29:48デストラクタくらいはちゃんと覚えようぜ。 会話にならないから。
0027デフォルトの名無しさん
2008/12/27(土) 21:35:57どんな「処理」をしたいのか、まったく想像できんのだが・・・。
0028デフォルトの名無しさん
2008/12/27(土) 21:57:16具体的にこれがしたいって言えよな
0029デフォルトの名無しさん
2008/12/28(日) 08:38:34どう変化していくのか数値を眺めていたんですが3色同じ割合で変化してないのでどう書けばいいのかわからないです。
0030デフォルトの名無しさん
2008/12/28(日) 08:46:470031デフォルトの名無しさん
2008/12/28(日) 08:48:33COLORREF rgbRGB(255,0,0);
nBrightness=UINT(dblPercent*255.0/100.0);
rgb=RGB(GetRValue(rgb)*nBrightness/255, \
,GetGValue(rgb)*nBrightness/255, \
,GetBValue(rgb)*nBrightness/255);
とか。
0032デフォルトの名無しさん
2008/12/28(日) 09:37:09GetGValue(rgb) + (((255.0-(double)GetGValue(rgb))/255.0)*(bufLum/255.0)),
GetBValue(rgb) + (((255.0-(double)GetBValue(rgb))/255.0)*(bufLum/255.0)));
まったくうまくいきません
dblPercentはなんですか?
0033デフォルトの名無しさん
2008/12/28(日) 10:30:520034デフォルトの名無しさん
2008/12/28(日) 11:53:560035デフォルトの名無しさん
2008/12/28(日) 13:23:10調べてもVK_Aとしか出てこないんですが、シンボルが無いといわれるんです
0036デフォルトの名無しさん
2008/12/28(日) 13:47:15ただ単に 'A' と書けばいい。VK_Aを定義したいなら、 #define VK_A 'A' もしくは #define VK_A 0x41
0037デフォルトの名無しさん
2008/12/28(日) 13:47:25こいつに素養なんか、かけらもない。
0038デフォルトの名無しさん
2008/12/28(日) 14:15:49昔からそこら辺の説明はまともに書いてないんだよなあ。
0039デフォルトの名無しさん
2008/12/28(日) 15:17:50VK_Aの情報多すぎますよね。なんでなくなったんだろ
トレースで出てきた値入れようか悩んだんですが、あまりにも原始的で・・・Aで良かったんですね。どうもです。
コントロールと同時押しも情報がなさすぎて困ってたんですがすごいのを思いつきました!今日は冴えてます。
BOOL ctrl_A = 0;
void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){
if( ctrl_A == 1 ){
if( (nChar == 'A') || (nChar ==VK_CONTROL) ){
}
}
if( (nChar == 'A') || (nChar ==VK_CONTROL) ){
ctrl_A = 1;
}
}
void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags){
if( (nChar == 'A') || (nChar ==VK_CONTROL) ){
ctrl_A = 0;
}
}
0040デフォルトの名無しさん
2008/12/28(日) 15:40:390041デフォルトの名無しさん
2008/12/28(日) 15:47:140042デフォルトの名無しさん
2008/12/28(日) 18:06:16どーでもいいことだが、ハンガリアン記法を憶えると、あとからソース見直す時にラクになるぞ。
つうか、こっちがそれに慣れてるからそうじゃないコードを見ると読みにくくてかなわん。(笑)
>BOOL ctrl_A = 0;
BOOL は TRUE か FALSE だろ? みたいな、よ。
>if( ctrl_A == 1 ){
は、if ( ctrl_A ){ でいい。あくまで == を書きたいなら、if ( 1 == ctrl_A){ としたほうがいい。
理由はわかるだろ?
って、ここは C の初心者教室かよ・・・・。
0043デフォルトの名無しさん
2008/12/28(日) 18:10:39今更何を……
>は、if ( ctrl_A ){ でいい。あくまで == を書きたいなら、if ( 1 == ctrl_A){ としたほうがいい。
勘弁してくれ。
ここはいつから三田某シンパのロートルが巣食うようになったんだ?
0044デフォルトの名無しさん
2008/12/28(日) 18:15:270045デフォルトの名無しさん
2008/12/28(日) 18:52:05TRUEとFALSEだけではない
0046デフォルトの名無しさん
2008/12/28(日) 18:54:55004724
2008/12/28(日) 20:20:460048名無し募集中。。。
2008/12/28(日) 20:28:100049デフォルトの名無しさん
2008/12/28(日) 21:10:100050デフォルトの名無しさん
2008/12/28(日) 21:26:02終了時に開いてるやつが編集されたか全部チェックしてるだろ
0051デフォルトの名無しさん
2008/12/29(月) 00:41:49派生クラスのメンバ関数内から、
(1) まず、CWinApp::GetFirstDocTemplatePosition()を呼んだ後で、
(2) CWinApp::GetNextDocTemplate()を呼んで、CDocTemplateクラスのポインタを得る。
(3) (2)で取得したCDocTemplateクラスのポインタに対して、まず
CDocTemplate::GetFirstDocPosition()を呼んだ後、
(4) CDocTemplate::GetNextDocを呼んで、CDocumentのポインタを得る。
同じテンプレートでオープンされているか複数ドキュメントを全て取得
するには、(4)をNULLが返るまで繰り返す。
という流れ。
アプリケーションに複数のドキュメントテンプレートが存在する場合、(2)が
NULLを返すまで、それぞれのテンプレートのポインタに対して(3)〜(4)を繰り
返す。
この方法ならSDI/MDI関係ない。
各ドキュメントのパスは、CDocument::GetPathName()で取得。
ドキュメントが更新されているかどうかは、CDocument::IsModified()で取得。
0052デフォルトの名無しさん
2008/12/30(火) 04:18:010053デフォルトの名無しさん
2008/12/30(火) 05:41:42BitBltでパターンを使う2段階描画じゃなくて、直接変更するにはどうすればいいんでしょうか
0054デフォルトの名無しさん
2008/12/30(火) 06:30:44005547
2008/12/30(火) 19:18:07ありがとうございます!
えっと、仕組みは分かったのですが、終了するときExitInstanceやデストラクタでは
すでに子ウィンドウが閉じていて取得できません。どこに書けば取得できますでしょうか?
0056デフォルトの名無しさん
2008/12/30(火) 23:47:58wxWidgetを使うことにします。
0057デフォルトの名無しさん
2008/12/31(水) 08:26:19ずっとバグと闘ってたんですが、どうも同じcase値があるのがいけないような気がするんです。この辺どうなんでしょうか
0058デフォルトの名無しさん
2008/12/31(水) 08:39:590059デフォルトの名無しさん
2008/12/31(水) 09:07:190060デフォルトの名無しさん
2008/12/31(水) 10:36:30ここMFCスレですよ
006151
2008/12/31(水) 13:24:41よいのでわ?
0062デフォルトの名無しさん
2008/12/31(水) 15:00:450063デフォルトの名無しさん
2008/12/31(水) 20:54:58VS2008 SP1 で CFormView から派生の SDI の新規プロジェクトを作り、
何も変えずにビルドしたらいきなり CMainFrame::OnCreate が見つからないというエラーに遭遇しました
それで、MainFrame.h に CMainFrame::OnCreate の定義を追加したところ、ビルドはできたのですが、
その CMainFrame::OnCreate が呼ばれていないらしくて、ツールバーやドッキングウィンドウ等がまったく表示されません
SDI の CFormView でツールバーやドッキングウィンドウはどうやって表示すればいいですか?
むしろ VS2008 SP1 を使うのやめといたほうがいいですかね???
0064デフォルトの名無しさん
2008/12/31(水) 21:14:441.アプリケーションの種類でシングルドキュメントを選択
2.生成されたクラスで基本クラスにCFormViewを選択
3.完了ボタンを押す
4.印刷サポートが無いとの警告で「はい」を押す
5.F5でビルド-デバッグ実行
以上の操作で問題なく実行された。
0065デフォルトの名無しさん
2008/12/31(水) 21:21:02レスありがとうございます
んー、使っているのが VS2008 Pro の評価版でこいつにSP1あてたせいでしょうかね?
製品版のVS2008 SP1だとこの問題が出ないのでしょうかね
とりあえず、Createのイベントを追加してOnCreateのコードをごっそり移動させたら動きました
0066デフォルトの名無しさん
2009/01/01(木) 10:18:59これWizard内だけで完結させたのかな?
もしそうなら、そんなエラー出ることないと思うけどなあ。
0067デフォルトの名無しさん
2009/01/02(金) 05:11:13初期ステータスバーのチェックを外すと発生するみたいです
(初期ステータスバーのチェックを外す以外は何も変更しなくても起きました)
0068デフォルトの名無しさん
2009/01/03(土) 01:08:51検証してみたが、製品版のVS2008SP1(SE)でも発生した。
【対処法】は以下のとおり。
・MainFrm.cppのメッセージマップに、
ON_WM_CREATE()
の一行を追加する。
・MainFrm.h のメッセージハンドラ関数を宣言しているあたりに、
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
の一行を追加する。
これでビルドは可能になる。うーん、AppWizerd のバグかな。
0069デフォルトの名無しさん
2009/01/03(土) 02:43:18VC2005のMFC、SDIを使いラジオボタンを配置しているのですが、選択ができず、チェックがいれられないでいます。
ラジオボタン自体はradiobutton.Create()で引数指定して貼り付けています。
ググってCwnd;;CheckRadioButton等を見つけたのですが、手をつけられず困っています。
もしよろしければどなたか助言の方お願いします。
0070デフォルトの名無しさん
2009/01/03(土) 03:02:14あと、「グループ」プロパティのチェックは
一連のラジオボタンの先頭のみにチェックを入れるんだったはず。
0071デフォルトの名無しさん
2009/01/03(土) 03:14:08詳細は CButton::SetCheck のヘルプ読めばわかる。
0072デフォルトの名無しさん
2009/01/03(土) 03:35:38IDを連続させて、ON_CONTROL_RANGE() マクロで処理するんだよ。
0073デフォルトの名無しさん
2009/01/03(土) 11:19:24ON_UPDATE_COMMAND_UIを実装してもコールされず、メニューの有効無効やチェックなどが更新されません
ダイアログでON_UPDATE_COMMAND_UIの関数でメニューを更新する方法はありますか?
0075デフォルトの名無しさん
2009/01/03(土) 13:50:02Microsoft Visual Studio 9.0\VC\VCWizards\AppWiz\MFC\Application\templates\1041にある
frame.h内の177行目と、frame.cppの内の47行目の
[!if DOCKING_TOOLBAR || TOOLBAR_STYLE_REBAR || RIBBON_TOOLBAR || STATUS_BAR]
を
[!if DOCKING_TOOLBAR || TOOLBAR_STYLE_REBAR || MENUBAR_TOOLBAR || RIBBON_TOOLBAR || STATUS_BAR]
にしておくと、次からうまくいくようになる。
ついでに、frame.cppの内の935行目の
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
を
return [!output MAIN_FRAME_BASE_CLASS]::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
にしておくとドキュメントのないSDIのときに、ドッキングウインドウ関係のバグがなくなる。
0076デフォルトの名無しさん
2009/01/03(土) 14:44:38複数選択をさせる時等はどうしたらいいんでしょう?
0077デフォルトの名無しさん
2009/01/03(土) 14:48:180078デフォルトの名無しさん
2009/01/03(土) 15:15:530079デフォルトの名無しさん
2009/01/03(土) 16:32:54Doc側に関数を実装すればいいんですかね?
0080デフォルトの名無しさん
2009/01/03(土) 17:10:390081デフォルトの名無しさん
2009/01/03(土) 17:16:43俺は、WM_KICKIDLEが届いたら、
ツールバーにWM_IDLEUPDATECMDUIを送るようにした。
0082デフォルトの名無しさん
2009/01/03(土) 19:55:47LoadImage関数を使いビットマップをマイピクチャから読み込もうとしているのですが、例外が出てしまい上手くいきません。
マイピクチャにあるビットマップを読み込もうとしており、フルパスで指定してみたいと思ったのですがフルパス指定の方法がいまいちわかりません。
どなたかアドバイスお願いします。
0083名無し募集中。。。
2009/01/03(土) 19:59:15>>82
どんな例外? ファイルが無くても例外は出ないんじゃないかと。
フルパス指定ができない? \を\\にしていないとかじゃない?
0084デフォルトの名無しさん
2009/01/03(土) 20:28:20LoadImageはイメージリソースをロードする関数だろ。
フォルダにあるBMPを読むには、CreateFileなり、fopenなり、CImage::Load なりを使わなきゃ。
0085名無し募集中。。。
2009/01/03(土) 20:49:00そうでもない
http://msdn.microsoft.com/ja-jp/library/cc364835.aspx
例えばこんな感じ(fnがフルパスのファイル名)
m_hBmp = (HBITMAP)LoadImage( NULL, fn, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR|LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_VGACOLOR )) ;
0086デフォルトの名無しさん
2009/01/03(土) 21:11:000087デフォルトの名無しさん
2009/01/03(土) 23:07:54ありがとうございます
できないかと思っていましたが、おかげさまで実装できました
008882
2009/01/04(日) 19:22:05エスケープシーケンスも間違いでしたが、ちょこちょこ手直ししていたらなんとかなりました。
本当に助かりました。ありがとうございます!
0089デフォルトの名無しさん
2009/01/05(月) 09:26:200090デフォルトの名無しさん
2009/01/05(月) 11:04:460091名無し募集中。。。
2009/01/05(月) 11:34:29特に理由がない限りnewしたものはdeleteと相場が決まっている
0092デフォルトの名無しさん
2009/01/05(月) 12:04:04delete thisで自殺するクラスもあるけどね。
0093デフォルトの名無しさん
2009/01/05(月) 12:51:52クラス一つ一つに画像がついていて
画像を切り取る時にCRect構造体を用いてるんですよ。
で、このCRect構造体はnewで作っていて切り取りの情報を削除したらDeleteするべきなのかな。とおもいまして
0094デフォルトの名無しさん
2009/01/05(月) 13:28:58すまん、何を言っているのか理解できないからソースを出してくれ。
0095名無し募集中。。。
2009/01/05(月) 13:31:51newで作ったらdeleteしないといけない
でもnew-deleteを使わなくても良い別の方法があるような気がする(ローカル変数を使うとか
0096デフォルトの名無しさん
2009/01/05(月) 13:51:12理解できないなら理解しなければいいんじゃね?
ようするに、画像の範囲を切り取る時にCRectでサイズと範囲を指定してるっていう話だろ?
newで作ったならDeleteするのはお約束。
戻り値ある関数でなら戻り値作らなきゃいけないのと一緒。
0097デフォルトの名無しさん
2009/01/05(月) 13:55:33漏れにはここが理解できん。
0098デフォルトの名無しさん
2009/01/05(月) 13:56:340099デフォルトの名無しさん
2009/01/05(月) 13:57:24範囲を切り取ったよ!
でも、この範囲の情報をいらなくなったからユーザが削除したよ!
そうしたら、プログラム的にdeleteするべき?ってきいてるんだろ。
deleteと削除を区別して考えてるというか、ユーザ側とプログラムで別って事を自覚してるから正しい。
0100デフォルトの名無しさん
2009/01/05(月) 14:01:22顔真っ赤だけど大丈夫?
C++からMFC来るとクラス削除しなくっても勝手に処理してくれたりで戸惑うのは当たり前だと思うのは俺だけか
0101デフォルトの名無しさん
2009/01/05(月) 14:06:32顔真っ赤なのは、鏡に映ってる自分のことかぃ?(w
自分のコードで明示的にnewして作ったものを、MFCが内部で勝手に削除
するMFCの標準クラスって、具体的にどのクラスのことなのか1つでいい
から挙げてみてよ。
0102デフォルトの名無しさん
2009/01/05(月) 14:07:060103デフォルトの名無しさん
2009/01/05(月) 14:10:490104デフォルトの名無しさん
2009/01/05(月) 14:16:55いわゆる、真性のコミュニケーション能力不足ってやつですね。
なんか理系全体のレベルが下がるとともに、年々新人プログラマの質も
下がっているような気がするのは、気のせいか?
>>103
メンバ関数のCreateやReleaseは、麻生読みするとnew/deleteになると
でも言うのかぃ?
予約語以外の関数名なんてコンパイラにとっちゃ、関数を個別に識別する
ための単なる記号でしかないのは、C++どころかCやアセンブラ、BASICでも
変わらん。C++から来たとか騙るな。
0105デフォルトの名無しさん
2009/01/05(月) 14:20:17お前は何の話をしてるんだw
0106デフォルトの名無しさん
2009/01/05(月) 14:23:15つまりなにか? このスレは説明もろくにできない質問者と、
自分の世界に浸って周りを見ようともしない回答者と、
一部の傍観者によって構成されているのか?
# まぁそんなもんか。
0107デフォルトの名無しさん
2009/01/05(月) 14:24:51CFrameWnd
0108名無し募集中。。。
2009/01/05(月) 14:35:34説明が下手な人は自分の考えを言葉に表現できないという事だと思うけど
コーディングってプログラム言語でプログラムしたい内容を表現するという事だから
(上司の、スレ住人の、CPUの、OSの、言語の)理解できる的確な表現をする事は重要な事だぜ
0109デフォルトの名無しさん
2009/01/05(月) 14:36:410110デフォルトの名無しさん
2009/01/05(月) 16:11:580111デフォルトの名無しさん
2009/01/05(月) 16:22:200112デフォルトの名無しさん
2009/01/05(月) 16:31:16それだけは真実。
0113デフォルトの名無しさん
2009/01/05(月) 17:07:530114デフォルトの名無しさん
2009/01/05(月) 17:23:26親ウィンドウでも処理をしたいんですが、どうしたらいいんでしょう?
フォーカスを無理やり親に渡してしまうと子ウィンドウ側での処理ができなくなってしまいますし。。。
と、APIの方に誤爆ってしまいましたがどなたかお知恵をお貸しくださいな
0115名無し募集中。。。
2009/01/05(月) 17:42:02フォーカスを渡さないといけない処理ってどんな処理?
>>109
インタプリタもあるじゃない?と思ったけどMFCならコンパイラ限定か(チッ
0116デフォルトの名無しさん
2009/01/05(月) 17:53:59子ウィンドウの移動をさせたいんですが、親ウィンドウはViewクラスで子ウィンドウはCEditになってます。
0117デフォルトの名無しさん
2009/01/05(月) 18:59:100118デフォルトの名無しさん
2009/01/05(月) 19:05:220119デフォルトの名無しさん
2009/01/05(月) 19:31:59キー入力がそっちに行っちゃってCtrl+Vとかも使えなくなったのでフォーカスかなぁと。
0120デフォルトの名無しさん
2009/01/05(月) 21:21:22EditViewでツールバーやメニュー触ったあともフォーカスはeditに残ってるから
フォーカス戻す処理が入ってる気がする
仮にそうだったらEditViewじゃない普通のviewの場合はviewへフォーカスが戻るだろうね
0121デフォルトの名無しさん
2009/01/05(月) 21:39:14これはどこが問題あるんでしょうか?スクロールバーは常に一番下になるんですが、画面が変わりません
m_List.InsertItem(m_List.GetItemCount(), mes);
SCROLLINFO si;
m_List.GetScrollInfo(SB_VERT, &si, SIF_ALL);
si.nPos = si.nMax;
m_List.SetScrollInfo(SB_VERT, &si);
m_List.RedrawWindow();
0122デフォルトの名無しさん
2009/01/05(月) 21:50:520123デフォルトの名無しさん
2009/01/05(月) 22:04:490124デフォルトの名無しさん
2009/01/06(火) 21:28:48教えて下され。
CWndクラスの中で下のように書くとタイトルバーもない四角いウィンドウがでるのですが、
これに影を付けたいのです。
CreateEx(
WS_EX_TOOLWINDOW,
lpszClassName,
NULL,
WS_POPUP | WS_VSCROLL,
0, 0, 100, 100,
NULL, NULL, NULL);
0125デフォルトの名無しさん
2009/01/06(火) 21:44:360126デフォルトの名無しさん
2009/01/06(火) 22:05:230127デフォルトの名無しさん
2009/01/06(火) 22:18:51GDIを使って描いてもいいけれど、もっと安直にウィンドウを重ねてもできるよ。
0128デフォルトの名無しさん
2009/01/06(火) 22:38:250129デフォルトの名無しさん
2009/01/07(水) 00:00:29ちょっと小さくて読みにくいんだけど、これって、どこで修正できるん?
どこかのタイミングでフォントを設定すれば修正できるような気がするんだけど、
上手くいかない・・・orz
どなたか、わかる方、教えてplz
0130デフォルトの名無しさん
2009/01/07(水) 00:49:39普通にSP1って呼んでるわ
0131デフォルトの名無しさん
2009/01/07(水) 13:22:30すんません。いろいろ調べてはいたのですが
灯台下暗しでした。。。
CS_DROPSHADOWでやりたいことができました。
0132デフォルトの名無しさん
2009/01/07(水) 13:47:27ググってもなかなかみつからないので。。。
よろしくお願いします。
0133名無し募集中。。。
2009/01/07(水) 14:09:49VBAの関数を呼ぶ方法はわからないな
VBAのどんな関数を呼びたいんだ? (または任意のマクロかな)
0134デフォルトの名無しさん
2009/01/07(水) 15:05:13ExcelのVBEditorで作ったVBAの関数を呼びたいと思っています。
Excelに貼り付けたボタンを押すとその関数が呼び出されるんですが、
これをMFCで処理させたいと思っています。
なかなか難しいですかね?
0135デフォルトの名無しさん
2009/01/07(水) 15:15:24追加し、MFC からオートメーションを使用した VBA マクロを実行する方法
ttp://support.microsoft.com/kb/194906/ja
0136デフォルトの名無しさん
2009/01/07(水) 15:22:52日本語が。。。
でも、オートメーション使うとなにかできそうですね。
0137デフォルトの名無しさん
2009/01/07(水) 17:58:11タイトルバーのフォントが変わるの? XPじゃ変わらんけど。
ちなみに、メニューバーのフォントは変わるのでシステムの設定を
チェックしてそれに合わせているんだが。
0138デフォルトの名無しさん
2009/01/07(水) 18:01:14スクロールバー等をクリックしても無反応です。
CDHTMLDialogで動的に生成したコントロールを有効にする方法は無いでしょうか?
0139デフォルトの名無しさん
2009/01/07(水) 19:06:25CEditのHDCを取得して、SetTextColorではだめなんでしょうか?
0140デフォルトの名無しさん
2009/01/07(水) 20:19:180141デフォルトの名無しさん
2009/01/08(木) 00:17:30ある比較的シンプルなWindowsアプリで、なぜかCPU使用率が異常に高いので
いろいろ試行錯誤しなかがら試してみると、どうもOnPaintのオーバライドで
ベースクラスのOnPaint(CframeWnd::OnPaint)を呼んでないことが原因らしいことが
わかったのですが(つまりオーバーライドの中でCframeWnd::OnPaintを呼んでやれば
CPU使用率の異常な上昇は起こらない)これって普通なんでしょうか?
なんかググってもオーバーライドの中でCframeWnd::OnPaint読んでるようなコードって
見かけないような気がするんですが……。
0142デフォルトの名無しさん
2009/01/08(木) 00:19:42OnPaint では CPaintDC でデバイスコンテキストを作る必要がある。
あるいは、OnPaint で何もしていないか・・・。
何もしなくても CPaintDC を作る必要がある。
0143デフォルトの名無しさん
2009/01/08(木) 00:50:27ベースクラスでは、Default()、つまりDefWindowProc() を呼んでいるだけだから。
0144デフォルトの名無しさん
2009/01/08(木) 00:52:34BeginPaint と EndPaint をしてるから
OnPaint で何もしていないなら
自前で CPaintDC 作るか
さもなくばベースクラスの OnPaint を呼ばなければいけない。
0145デフォルトの名無しさん
2009/01/08(木) 01:06:27延々とWM_PAINTが生成されるんだっけか
0146デフォルトの名無しさん
2009/01/08(木) 01:36:29一応メッセージの優先順位が低いから、それでもそれなりにアプリは動作するけど。
0147デフォルトの名無しさん
2009/01/08(木) 05:09:440148デフォルトの名無しさん
2009/01/08(木) 19:26:24ありがとう。
ソースは会社なんで明日確認してみます。
>元のアプリは相当酷い代物ってことだな。
名前から意味がまったく読み取れない変数名やメソッド名とか、
一つのメソッドが平気で200行とかそれはもうw
0149デフォルトの名無しさん
2009/01/08(木) 21:41:460150デフォルトの名無しさん
2009/01/08(木) 21:43:43デスクトップからの相対座標を、親ウィンドウの相対座標に変換するってことか?
0151デフォルトの名無しさん
2009/01/08(木) 21:44:50このCEdit内をクリックされた時に親ウィンドウ側に座標を渡したいんです
0152デフォルトの名無しさん
2009/01/08(木) 22:10:120153デフォルトの名無しさん
2009/01/08(木) 22:20:470154デフォルトの名無しさん
2009/01/08(木) 22:23:010155デフォルトの名無しさん
2009/01/08(木) 22:27:070156デフォルトの名無しさん
2009/01/08(木) 22:55:150157デフォルトの名無しさん
2009/01/09(金) 08:02:43どうもキレイに行かなくて困ってます。
イイ解決法ってありますか?
0158デフォルトの名無しさん
2009/01/09(金) 10:12:410159デフォルトの名無しさん
2009/01/10(土) 11:55:15これは、使い方がおかしいのでしょうか?
0160デフォルトの名無しさん
2009/01/10(土) 12:02:210161デフォルトの名無しさん
2009/01/10(土) 12:09:41別に意味がわからなくはないとおもうが・・・。
まぁ、俺には解決策はわからんけどね
0162デフォルトの名無しさん
2009/01/10(土) 14:04:57・実はAPIのScreenToClientを使用しており、渡すHWNDが間違っている。
・"正しく変換された物"のほうがずれている。
0163デフォルトの名無しさん
2009/01/10(土) 15:33:570164デフォルトの名無しさん
2009/01/13(火) 23:01:130165デフォルトの名無しさん
2009/01/13(火) 23:18:29「簡単」の基準は?
0166デフォルトの名無しさん
2009/01/13(火) 23:24:58例えばダイアログ上にボタンを配置し 毎フレーム位置を変更させるような
プログラムを作成したいと考えています。
毎フレーム処理を行うようなコードはどのように実装すればよいのでしょうか?
0167デフォルトの名無しさん
2009/01/13(火) 23:28:08紙芝居でもダイアログ上に表示するのか?
0168デフォルトの名無しさん
2009/01/13(火) 23:38:06返答ありがとうございます。
>紙芝居でもダイアログ上に表示するのか?
イメージに近いです1フレーム毎に処理を行えればと思っています。
0169デフォルトの名無しさん
2009/01/13(火) 23:43:46関係ない話だけど、今Windows7のペイントいじってみた
なんとなくリボンの良さ分かった木はするけど、絵心がないから個人であれ作るのは面倒だな
0170デフォルトの名無しさん
2009/01/13(火) 23:52:29Timerを使わず
win32でいうところのメッセージループみたいな
所で独自のイベントを受け取って処理を行いたいんだけど
いまいちわからん。。。
リボンUIは確かに見た目は良いね
0171デフォルトの名無しさん
2009/01/14(水) 00:26:54タイマーかなんかで一定時間毎に処理するしかないね。
0172デフォルトの名無しさん
2009/01/14(水) 01:39:59描画が必要なタイミングの単位と言うならOnDrawとかになるんだろうけど
一定周期じゃないもんな(アクティブになったときとか、リサイズされたときとか色々。。。)
0173デフォルトの名無しさん
2009/01/14(水) 10:09:350174デフォルトの名無しさん
2009/01/14(水) 10:42:440175デフォルトの名無しさん
2009/01/14(水) 18:16:00変更可能な矩形を描画しようとしてるんですが、
矩形内の色が白になってしまって画像が上書きされた形になります。
枠だけ描画というのはどうやったらできるんでしょうか。
画像はrawで、OpenGLで描画されています。
0176デフォルトの名無しさん
2009/01/14(水) 18:24:56コンストラクタでCRectTracker::hatchInsideを指定するとどうなる?
# OpenGLで描画したものってDCの範疇じゃないのかな?
0178デフォルトの名無しさん
2009/01/14(水) 19:52:530179178
2009/01/14(水) 19:53:280180デフォルトの名無しさん
2009/01/14(水) 21:15:39なければスレ違い
0181デフォルトの名無しさん
2009/01/14(水) 22:07:07そもそもなんでOpenGLで描画したところにトラッキングしたいのか判らんが、
MFC側の問題じゃなくてOpenGL側の問題っぽいからOpenGLスレで聞いて味噌。
0182デフォルトの名無しさん
2009/01/14(水) 23:26:05今MFC VC2005を使いプログラムを組んでいるのですが、あるメソッド内でint型配列array[21]の中身をsetwindowtextでタイトルに表示させたいと思っています。
setwindow(_T(""))で、array[i]をどのように記述すれば表示できるようになるでしょうか。下らないかもしれませんがお願いします。
0183デフォルトの名無しさん
2009/01/14(水) 23:28:17hoge.format(_T("%d"), array[i]);
wnd.SetWindowText(hoge);
こんな感じかな
0185175
2009/01/15(木) 02:48:28今使ってるプログラムはもともと1年半くらい前の演習の時に先生から頂いたrawビューアで、
研究に使えそうだってことでその時のプログラムを改造しようとしてるんですが、
OpenGLは全く扱ったことがなくて(演習の時も処理部分しか触ってない)、
時間もないんで、OpenGLを勉強するより1から作り直した方が早いような気がしてきたんですが、
raw画像(320×320の輝度値のみのデータ)をMFCを使って表示させるには
ビットマップに変換するしかないのでしょうか。
0186名無し募集中。。。
2009/01/15(木) 03:19:54BMPはLoadImageでDIBのハンドルを得られるが
自分で変換する場合はBITMAPINFOにサイズなどをセットしてCreateDIBSectionを使って
ハンドルと輝度データを入れる領域を得る(ここまでMFCなし
0188デフォルトの名無しさん
2009/01/16(金) 17:33:571999〜2001年に出版されたものなんだが
0189デフォルトの名無しさん
2009/01/16(金) 19:37:56TCHAR *ptBuf = new TCHAR[iLength];
m_Edit.GetLine(i,ptBuf,iLength);
ptBuf[iLength]=0;
ar.WriteString(str);
delete[] ptBuf;
一行一行ファイルの保存させたいのでCEditの内容を取得して保存させるのに
上記の様なソースを書いたところdelete[]の所でエラーをはくのですがなぜでしょうか?
0190デフォルトの名無しさん
2009/01/16(金) 19:47:37ptBuf[iLength]=0;
↓
ptBuf[iLength-1]=0;
0191デフォルトの名無しさん
2009/01/16(金) 19:57:10CString::Tokenizeで分解したほうが手っ取り早くね?
0192デフォルトの名無しさん
2009/01/16(金) 20:45:37int i, nLineCount;
CString strText;
CStringArray bufArray;
nLineCount=m_Edit.GetLineCount();
for (i=0;i < nLineCount;i++)
{
int len = m_Edit.LineLength(m_Edit.LineIndex(i));
m_Edit.GetLine(i, strText.GetBuffer(len), len);
strText.ReleaseBuffer(len);
bufArray.Add(strText);
}
CStdioFile file;
if(file.Open(..略..))
{
for (i=0;i <bufArray.GetSize();i++)
{
file.WriteString(bufArray.GetAt(i));
file.WriteString(_T("\r\n"));
}
file.Close();
}
とかでよくね?
0193デフォルトの名無しさん
2009/01/16(金) 21:25:28戻り値
実際にコピーされたバイト数
戻り値使わないの?
0194デフォルトの名無しさん
2009/01/17(土) 00:00:500195デフォルトの名無しさん
2009/01/17(土) 00:05:430196デフォルトの名無しさん
2009/01/17(土) 03:07:01ここの使用例をテキトーに書き直しただけだから、
ttp://msdn.microsoft.com/ja-jp/library/s7zy7cwk(VS.80).aspx
細かい事気にすんな。 ハゲるぞ。(もうハゲてるかもしれんけど)
0197デフォルトの名無しさん
2009/01/17(土) 04:18:10>>193は、>>192でどう戻り値使うのだろうか?
0198デフォルトの名無しさん
2009/01/17(土) 09:07:51GetTextMetrics
0199デフォルトの名無しさん
2009/01/17(土) 17:51:17っていう風に関数を実行するとstrTextにその行が入る時と入らない時があるんですがなぜなんでしょうか?
0200デフォルトの名無しさん
2009/01/17(土) 17:57:300201デフォルトの名無しさん
2009/01/17(土) 18:01:190202デフォルトの名無しさん
2009/01/17(土) 18:08:02こんなコード、有り得ないだろ。
0203デフォルトの名無しさん
2009/01/17(土) 19:07:15だろ?EM_GETLINEのベタ実装なんだよな、これ。
昔から思っていたんだが、わざわざメソッドとして用意しておく必要性あるんだろうか。
普通バッファ長を指定できる方しか使わないと思うのだが。
わざわざこっちでバッファの先頭ワードにバッファ長代入とか暇人過ぎだろ。
0204デフォルトの名無しさん
2009/01/17(土) 21:11:510205デフォルトの名無しさん
2009/01/18(日) 15:22:20>>203 が書いているように、引数が2つしかない CEdit::GetLine()を使う
時は、呼び出す前に、第二引数で渡すバッファの先頭に、バッファ長を
書いておく必要があるのに、それをやっていないからだろ?
LPTSTR pBuf;
pBuf=strText.GetBuffer(iLength);
*((LPWORD)pBuf)=iLength; // バッファ長をセット
m_wndEditCtrl.GetLine(iLine,pBuf);
strText.ReleaseBuffer(iLength);
自分でバッファ先頭にバッファ長をセットするのが面倒なら、引数が3つ
あるCEdit::GetLine()を使うことだ。
0206デフォルトの名無しさん
2009/01/18(日) 16:01:41内容は
Run-Time Check Failure #3 - The variable 'newtime' is being used without being initialized.
afx_msg void CMainWin::OnTime()
{
char str[80];
CTime Curtime = CTime::GetCurrentTime();
struct tm *newtime;
newtime = Curtime.GetLocalTm(newtime); //ここが問題
wsprintf(str,asctime(newtime));
str[strlen(str) - 1] = '\0';
MessageBox(str,"Time and Date");
}
http://msdn.microsoft.com/ja-jp/library/fxy17zta(VS.80).aspx
ここ見る限りじゃ間違いないと思うんだけどなあ・・・
指摘と改善お願いします。。。
0207デフォルトの名無しさん
2009/01/18(日) 16:57:35突っ込みどころが大杉。釣りか?
C++やMFC以前に、ポインタも理解していないなら、C言語の基礎からやった
方がいいと思う。
MFCのサンプルは間違っているな。
struct tm newtime;
Curtime.GetLocalTm(&newtime);
でうまくいくだろう。
また、ワイド文字版のwsprintf()を使うなら「char str[80]」ではなく
「wchar_t str[80]」とすべき。MessageBoxもワイド版を使う。
> str[strlen(str) - 1] = '\0';
これもprintf()/wprintf()によって文字列末尾にNUL文字('\0')は付与され
ているから意味がないし、ワイド文字なら、strlen()ではなくwcslen()を
使うべき。
str[wcslen(str)-1] = L'\0';
第一、str[]がNUL文字で終端されていないと、strlen()/wcslen()は
文字列長さを判定できない。
0208デフォルトの名無しさん
2009/01/18(日) 17:08:05MSのサンプル間違ってるとか悲しいわな
これ、一応参考書のサンプルなんですけど捨てたほうがいいでしょうか
まあ2001年に出版されたものなんですけどね
0209デフォルトの名無しさん
2009/01/18(日) 17:14:24宣言と利用の間に、メモリ確保が隠されているかもしれないw
とは言え、2008用のページの方は訂正されているんだからそっちを見ればいい訳で。
ttp://msdn.microsoft.com/ja-jp/library/fxy17zta.aspx
0210デフォルトの名無しさん
2009/01/18(日) 17:22:43tm newtime;
Curtime.GetLocalTm(&newtime);
wsprintf(str,asctime(&newtime));
でできました!
参考書って年代で仕様も変わるけど図書館にはこれしかなくて・・・^^;
なんか疑いにくいんですよね、参考書って
どうもありがとうございました
0211デフォルトの名無しさん
2009/01/18(日) 17:28:490212デフォルトの名無しさん
2009/01/18(日) 17:33:050213デフォルトの名無しさん
2009/01/18(日) 17:33:41その参考書が何か知らんが、MSDNのサンプルをコピペしただけの悪書なんじゃないか?
いみじくも参考書を名乗るのなら、ちゃんと検証されたコードを載せるべきだと思うのだが。
0214デフォルトの名無しさん
2009/01/18(日) 17:37:35えっと・・・
ハーバート・シルト/フランク・クロケット著 「標準講座 MFC6.0」だそうです
結構分厚いからコピペではないと思います
ver間での使用の違いを疑わなかった自分のミスです
0215デフォルトの名無しさん
2009/01/18(日) 17:40:25でもその本見る限り、コピペじゃなくて同じソースってことみたいね
0216デフォルトの名無しさん
2009/01/18(日) 17:44:41struct tm *newtime;
newtime = curtime.GetLocalTm();
これなら旧仕様で合法だな。
0217デフォルトの名無しさん
2009/01/18(日) 17:48:03昔はよかった
0218デフォルトの名無しさん
2009/01/18(日) 17:50:030219デフォルトの名無しさん
2009/01/18(日) 17:50:40→いいと書いてるみたい
0220デフォルトの名無しさん
2009/01/18(日) 17:56:33ポインタを返す仕様だったけど、NULLポインタを渡すのを許可しなくなった
ってことでは?
オブジェクト内部のstruct tmのポインタを取得できると、直接データを
書き換えて隠蔽化の意味がなくなるから。
0221デフォルトの名無しさん
2009/01/18(日) 18:56:560222デフォルトの名無しさん
2009/01/18(日) 19:33:49コピペするもんじゃねぇ。
自分のプログラムに組み込むときは、引数・戻り値の意味と動作を理解し
自分の頭でコードを書くべき。
0223デフォルトの名無しさん
2009/01/18(日) 20:41:17いじくる前に1回コピペするだろ
0224デフォルトの名無しさん
2009/01/18(日) 21:26:460225デフォルトの名無しさん
2009/01/18(日) 22:59:29wsprintf()ってワイド文字ではなくTCHARだけど。
0226デフォルトの名無しさん
2009/01/18(日) 23:02:26wprintfはwcharのはず
プリプロセッサで切り替わるだけだし
0227デフォルトの名無しさん
2009/01/18(日) 23:05:43wprintfはprintfのワイド文字版
0228デフォルトの名無しさん
2009/01/19(月) 00:15:16手元の2004年初版第6刷発行では>>216のコードになってるな
>>225-227
wsprintf()は環境によってマルチバイトかUNICODEだよね。
>>206のコードだとマルチバイト環境のコードならばcharは間違えというわけではない。
それと
str[strlen(str) - 1] = '\0';
ってのはasctime()が改行文字を付加するからそいつを取っ払うため。
まぁ、あんまりよろしくないコードとは思うけどね。
0229デフォルトの名無しさん
2009/01/19(月) 00:41:370230デフォルトの名無しさん
2009/01/19(月) 05:48:07そんなことは可能なんですか?
0231デフォルトの名無しさん
2009/01/19(月) 08:47:51他のアプリの邪魔をしたくなければ、スレッドの優先順位を低くしとけばいいだけ。
0232デフォルトの名無しさん
2009/01/19(月) 08:53:1525%上限でよければ、簡単だよw
0233デフォルトの名無しさん
2009/01/19(月) 09:23:00Core2Duoですが簡単ですか?
0234デフォルトの名無しさん
2009/01/19(月) 09:25:080235デフォルトの名無しさん
2009/01/19(月) 09:31:190236デフォルトの名無しさん
2009/01/19(月) 10:31:140237デフォルトの名無しさん
2009/01/19(月) 12:33:520238デフォルトの名無しさん
2009/01/19(月) 14:54:00アプリに重い処理を乗せたくて起動者全員CPU30%とか10%づつシェアするプログラムを組み込みたいんです
制限かけないとずっと自分が使ってなくてもずっと100%で熱暴走が心配なのでCPU10%を提供に制限したいんです。
どうすればいいと思いますか?
0239デフォルトの名無しさん
2009/01/19(月) 15:36:170240デフォルトの名無しさん
2009/01/19(月) 17:17:46熱暴走が心配ってどんな環境だよ。
「起動者全員」とか「シェアする」とかサーバーアプリなの?
どうしても心配ならユーザー数に応じてSleepでもさせたら?
0241デフォルトの名無しさん
2009/01/19(月) 19:23:570242デフォルトの名無しさん
2009/01/19(月) 20:09:19えっ?
0243デフォルトの名無しさん
2009/01/19(月) 20:29:400244デフォルトの名無しさん
2009/01/19(月) 20:50:46今のCPUは温度が上がりすぎると勝手にクロックとか落とすので、特に問題ないな。
CPU利用率については、WindowsServerならプロセスがどれだけフル回転していようと、
一定時間毎に容赦なく他のプロセスに明け渡すから、無難なレスポンスが確保できそうかな、と。
0245デフォルトの名無しさん
2009/01/20(火) 06:57:04自分の作ったプログラムはいつも全力で走るんですが、CPU見てると常に20%ぐらいでなんかまわってたりするんですが
、タスクマネージャで確認してるだけなんですが、この%って一定時間内のCPU100%使用率ってことなんですか?
そうでないとしたら%制限の方法を教えてください!
0246デフォルトの名無しさん
2009/01/20(火) 07:08:05thx!
今ってCPUというかハードの性能がすごくてほとんどの処理がすぐ終わって待機時間がすごくもったいない気がしたので
そういう部分だけの汎用的なCOMとかで自由に独自のソフトに組み込めたらよくないですか?
10%シェアでも100人いればパソコン10台分ですよね。フリーでそういうのあれば教えてください。
Sleepでどうやるかじっくり考えます。
どうもです
0247デフォルトの名無しさん
2009/01/20(火) 07:56:11そもそも>234辺りの理屈は判っているのだろうか。
0248デフォルトの名無しさん
2009/01/20(火) 10:08:04知的障害者なの?死ぬの?
0249デフォルトの名無しさん
2009/01/20(火) 18:56:450250デフォルトの名無しさん
2009/01/21(水) 08:26:16どうやって実現するかわからないのでターゲットのスレもわからないです。
0251デフォルトの名無しさん
2009/01/21(水) 09:10:06>この板はプログラムを作る人のための板です。
>あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。
0252デフォルトの名無しさん
2009/01/21(水) 09:38:270253デフォルトの名無しさん
2009/01/22(木) 08:41:42そのViewが一つ1枚とその他10枚が別のViewになる構成ってどうやるのがいいのだろう。
CMultiDocTemplateを11個AddDocTemplateすることになるのだろうか。
その場合、クラスを派生して10個にしておかないと10枚の区別がつかない気がするのだが。
ってことで、これから移動するからレスは夜になるが、誰かヒント頼む。
0254デフォルトの名無しさん
2009/01/22(木) 09:50:02たしか複数のAddDocTemplateをすると新規作成時にテンプレ選択ダイアログが出るようになるな
0255デフォルトの名無しさん
2009/01/22(木) 14:10:59ドキュメントごとじゃなくてドキュメントタイプごとに違うリソース使えるようにする
0256253
2009/01/23(金) 00:42:41結局、一つの必ず必要なViewだけドキュメントテンプレートにして、
他の10枚分は全部そのViewから必要に応じて開くようにしてしまった。
考えてみたら、新規作成ならテンプレート選択ダイアログが開くけど
ファイルオープンだとどうせ最初のテンプレートでしか開かないしね。
それとも選択する手段があるのかな?
# うーむ、今更真面目にMFCの勉強し直すのも面倒だなぁ……
0257デフォルトの名無しさん
2009/01/23(金) 10:35:20中身は異なるが同じクラスのオブジェクトなのか、そこらへんで全く
違ってくると思う。
開くファイルとビュー(ウィンドウ)を全てMDIのDoc-View構造に登録して
管理しなければならないかといえば、決してそうではない。
SDIだけど、ペイントブラシのように、開くのは1個の画像ファイルで、
一部を拡大表示するウィンドウを複数同時に表示できるなどというインター
フェースだって作れる。
例えばMDIベースでVisual Studio相当のアプリケーションを作成すると
して、独立した1個がプロジェクトファイル、残りのN個がプロジェクト
を構成するソース/ヘッダファイルだったとして、ソース/ヘッダファイル
はプロジェクトの一部としてだけでなく単独でも開ける。
プロジェクトの一部として開いたソース/ヘッダファイルは、プロジェクト
に相当するドキュメントクラスで管理することになると思う。ソース/ヘッダ
ファイルを単独で開いた場合、インターフェースに統一性を持たせるため、
一時的に無名のプロジェクトを作成し、それに管理させているような形に
なるのでは?
0258デフォルトの名無しさん
2009/01/23(金) 11:33:53このビューを単独でプロジェクトに追加して開くにはどうすればいいですか?
ドキュメントテンプレートでAddにすると、使わないのに.Docも作らなければいけないとおもうんですが。
0259デフォルトの名無しさん
2009/01/23(金) 13:07:32クラスの追加もできない馬鹿は、MFCの参考書でも読んで勉強し直せ
0260デフォルトの名無しさん
2009/01/23(金) 13:28:44ビューを切り替えるだけのときオープンドキュしなきゃいけないので.Docもセットなのが嫌なんですが
0261デフォルトの名無しさん
2009/01/23(金) 13:50:47Viewクラスの使い方ぐらい調べろ、阿呆が
0262名無し募集中。。。
2009/01/23(金) 14:25:44m_pDocTemplate->OpenDocumentFile(NULL) が楽なんじゃないかなぁ
0263デフォルトの名無しさん
2009/01/23(金) 15:35:09>>261
死ね
0264デフォルトの名無しさん
2009/01/24(土) 10:50:590265デフォルトの名無しさん
2009/01/24(土) 10:53:010266デフォルトの名無しさん
2009/01/24(土) 11:33:180267デフォルトの名無しさん
2009/01/24(土) 11:34:220268デフォルトの名無しさん
2009/01/28(水) 16:11:14ダイアログにも"視覚スタイルと色"を反映させたいのですが、
無理でしょうか?
"視覚スタイルと色"を反映させたSDIでも、
ダイアログ(CAboutDlg)だけが浮いたデザインの気がするので、
知ってる方が居られればご教授願いたいです。
0269デフォルトの名無しさん
2009/01/31(土) 00:02:52今更、MFCをやれなんて上長から言われたんだけど、MFCでガリガリ
かけるようになった頃にはVSから姿を消してたら淋しいな
0270デフォルトの名無しさん
2009/01/31(土) 00:05:270271デフォルトの名無しさん
2009/01/31(土) 02:02:34消えて当然のプログラマ。
0272デフォルトの名無しさん
2009/01/31(土) 02:49:03触ってみたけど変わんない
俺、ツリーのドラッグアンドドロップが簡単にできるとか
リストの更新関連がうまくできるようになってるとかそういうの期待したけど
結局、全然改善されてないところがアフォだと思った
今ならノウハウや情報がそろってるMFCのがいいよ
.NETは糞面倒臭い上に情報少ない
んでMFCやってから.NET入っても同じところに気を配らないといけないのは
まったく同じなので情報が豊富なMFCから入ったほうがいいと思う
0273デフォルトの名無しさん
2009/01/31(土) 05:42:340274デフォルトの名無しさん
2009/01/31(土) 08:47:27って.NETでもP/Invokeに逃げたりするか
0275デフォルトの名無しさん
2009/01/31(土) 16:12:580276デフォルトの名無しさん
2009/01/31(土) 16:18:590277デフォルトの名無しさん
2009/02/01(日) 03:21:56凄く汚くなる
C++/CLI単体は悪くないと思ってるけど
0278デフォルトの名無しさん
2009/02/01(日) 03:27:280279デフォルトの名無しさん
2009/02/01(日) 16:47:36MFCでかくなりすぎワロタ
0280デフォルトの名無しさん
2009/02/01(日) 17:11:550281デフォルトの名無しさん
2009/02/01(日) 21:00:50ダイナミックリンクに直せよ
0282デフォルトの名無しさん
2009/02/01(日) 21:19:170283デフォルトの名無しさん
2009/02/01(日) 21:21:56でかいとなんかヤバイの?
0284デフォルトの名無しさん
2009/02/01(日) 22:22:36デカくてなにかいいの?
0285デフォルトの名無しさん
2009/02/01(日) 22:27:35いや、勝手にでかくなるからさ
0286デフォルトの名無しさん
2009/02/02(月) 07:24:22ツリーの(略)とかはWPFではできるよ
ただ、C++/CLIじゃWPF使えないからC++のコードはバッサリ捨てなきゃならないけどね…
0287デフォルトの名無しさん
2009/02/02(月) 20:33:41MFCのコレクションクラスにて質問があります。
MFCのコレクションクラスにCListとCByteArrayってのがあります。
これを使って、たとえば通信電文の様に可変長データをリストに置きたい場合
CList<CByteArray, &CByteArray>と書けば良いのでしょうか?
error C2955: 'CArray' : クラス テンプレート を使用するには テンプレート 引数リストが必要です
ってのが出て、どうしていいかわからないです。
有効な宣言の仕方があれば、教えていただきたいですが・・・・
0288デフォルトの名無しさん
2009/02/02(月) 21:12:11そもそも&の位置が前後逆だな。
直したところでCByteArrayはoperator=の実装が無いからやっぱり駄目だけど。
MFC的には、CList<CByteArray*>って感じにポインタで持つしかないと思う。
これ以上はSTLの出番か?全然詳しくないから答えられないけど。
0289デフォルトの名無しさん
2009/02/02(月) 22:56:09.NETと住み分けて
0290デフォルトの名無しさん
2009/02/02(月) 23:11:43EEでは古いATLになっちゃうのが難だけどMFCじゃ使えないし。
eGUI++は使ったことないから判らないがstd::stringてのが嫌だな。
0291デフォルトの名無しさん
2009/02/03(火) 08:17:48やっぱりSTLで組むしかないのですか・・・
がんばってみたいと思います。
ありがとうございます。
0292デフォルトの名無しさん
2009/02/03(火) 10:26:48CByteArrayの派生クラスを定義して、そいつでoperator =を実装した上で、
CList<CMyByteArray, const &CMyByteArray>とすればいけると思う。
0293デフォルトの名無しさん
2009/02/03(火) 10:37:34MFC のコレクションを使うメリットって何だろう。
0294デフォルトの名無しさん
2009/02/03(火) 16:56:070295デフォルトの名無しさん
2009/02/03(火) 17:52:530296デフォルトの名無しさん
2009/02/03(火) 21:35:340297デフォルトの名無しさん
2009/02/03(火) 23:03:50ラベルを複数行表示させる方法教えてください
0298デフォルトの名無しさん
2009/02/03(火) 23:39:330299デフォルトの名無しさん
2009/02/03(火) 23:52:35ってことは2行までしか表示できないって事?
省略されずに複数行を表示はだめか・・・
0300デフォルトの名無しさん
2009/02/04(水) 03:09:18デバッグ実行時にアサート出してくれる、とかMFC例外クラスのスローとか
ただ統一しないとめっちゃ不便
0301デフォルトの名無しさん
2009/02/04(水) 09:21:26ラベルってヘッダコントロールのテキストのこと?
0302デフォルトの名無しさん
2009/02/04(水) 09:26:350303デフォルトの名無しさん
2009/02/04(水) 13:27:480304デフォルトの名無しさん
2009/02/04(水) 20:35:39プロジェクト作り直すのに凄い苦労する。
なんかいい方法あるかね?
0305デフォルトの名無しさん
2009/02/04(水) 21:38:230306デフォルトの名無しさん
2009/02/04(水) 22:24:36数個なら手で
たくさんあるならPowerShellスクリプトで設定を置換
0307デフォルトの名無しさん
2009/02/04(水) 23:26:08>>303
エクスプローラで言うとファイル名が表示されている部分です
そこに複数行の文字を表示したいと思っています
char sz[] = "AAAAAAAAAAA\nBBBBBBBBBBB\nCCCCCC\nDDDD\nEEEEE"
みたいな感じ、実際表示されるのは
AAAAAAAAAAA
BBBBBBBBBBBCCCCCC...
と表示されてしまっています
アイコンを選択するとちゃんと意図した改行位置で表示されるけど
選択していない状態でも全部ちゃんと表示したいです
0308名無し募集中。。。
2009/02/05(木) 00:15:42と思ったけど、エクスプローラーでもファイル名が省略される場合があるから
自分で実装するしかないんじゃないかな
0309デフォルトの名無しさん
2009/02/05(木) 08:16:03アイコン間隔を変える事である程度は回避できるかもしれないが、複数行で
無制限に表示すると、左右両側のアイコンのラベルや、下側のアイコンに
テキストがかぶる。
しかも、自動改行せず、1行の文字数(ラベル領域の横幅)や行数(ラベル領域
の高さ)を無制限にすると、ラベル領域が重なるのは隣接するアイコンだけ
では済まなくなる。
表示上はそれでも済むけど、常にそういう状態で表示すると、任意のアイ
コンやラベルをマウスでクリックできなくなるから、非選択時は省略表示
するというユーザインターフェースになっているんだと思う。
CViewやCScrollViewなりから、仕様を満足する派生クラスを自分で作る
しかないね。
0310デフォルトの名無しさん
2009/02/05(木) 18:49:10SP1で初めてプログラム始めたのでSP1関係ないかもしれませんが、
テンプレートで作ったドッキングウィンドウの中にあるツールバーのボタンをコンボボックスに変えた後その中のエディット部分の文字列を
取り出すにはどうすればいいんでしょうか?
.h
CMFCToolBarComboBoxButton* m_ComboButton;
.cpp
// OnCreate
m_ComboButton = new CMFCToolBarComboBoxButton(ID_EDIT, GetCmdMgr()->GetCmdImage(ID_EDIT), CBS_DROPDOWN);
m_ToolBar.ReplaceButton(ID_BTN, *m_ComboButton);
// OnButtonClick
CString a;
a = m_ComboButton->GetText();
ヘルプにある手順と、サンプルも見て書きました。ボタンは置き換わるんですが、aが空なんです。GetEditからGetWindowなどもいろいろやりました
どうしても文字列を取得できません。お願いします!
0311デフォルトの名無しさん
2009/02/05(木) 19:10:33サンプルのだけど
CMFCToolBarComboBoxButton* pSrcCombo = NULL;
CObList listButtons;
if (CMFCToolBar::GetCommandButtons(ID_DUMMY_SELECT_ACTIVE_CONFIGURATION, listButtons) > 0)
{
for (POSITION posCombo = listButtons.GetHeadPosition(); pSrcCombo == NULL && posCombo != NULL;)
{
CMFCToolBarComboBoxButton* pCombo = DYNAMIC_DOWNCAST(CMFCToolBarComboBoxButton, listButtons.GetNext(posCombo));
if (pCombo != NULL && CMFCToolBar::IsLastCommandFromButton(pCombo))
{
pSrcCombo = pCombo;
}
}
}
if (pSrcCombo != NULL)
{
ASSERT_VALID(pSrcCombo);
LPCTSTR lpszSelItem = pSrcCombo->GetItem();
CString strSelItem = (lpszSelItem == NULL) ? _T("") : lpszSelItem;
AfxMessageBox(strSelItem);
}
else
{
AfxMessageBox(_T("Show \"Set Active Configuration\" dialog...."));
}
}
0312デフォルトの名無しさん
2009/02/05(木) 21:14:49一度LPCTSTRで取得してからCStringにしてみましたがだめでした。
コンボボックスのポインタのとり方もサンプルのように取得しましたが、だめでした。
CMFCToolBarComboBoxButtonのヘルプでGetTextは編集用のエディットのテキストを返すとあるのに
これで返ってこないのがつらいです。
MFCの常識から考えて何か根本的なところのアドバイスをお願いします!
他にツールバーに並んでるボタンはボタンのメンバで無効とかにできるので、ツールバー上のアイテムの取得は出来てると思うんです。
0313デフォルトの名無しさん
2009/02/05(木) 21:27:43アドバイスでいいのか。
ちゃんとドキュメントを読んで勉強しろ。
理解力があれば解決できるだろ。
0314デフォルトの名無しさん
2009/02/05(木) 22:01:290315デフォルトの名無しさん
2009/02/05(木) 22:16:450316デフォルトの名無しさん
2009/02/05(木) 22:20:12GetEditCtrl()->GetWindowText
で取得できる。
0317デフォルトの名無しさん
2009/02/05(木) 22:31:50pSrcCombo != NULL のelseの方に飛びます。
もうべた貼りしましたがだめでした。
キーでボックスに入力したあとそれを更新してメンバ変数に入れなくてはいけないんでしょうか?
GetText()の戻値がプロテクト変数を返すだけになっていたのですが、どこで入るのかがたどれません
0318デフォルトの名無しさん
2009/02/05(木) 22:43:20を抜いたらいけるだろ?
0319デフォルトの名無しさん
2009/02/05(木) 22:47:01俺は来月から久々にMFCの仕事やりそうだから、VC6レベルでさえかなり不安だ
0320デフォルトの名無しさん
2009/02/05(木) 23:17:42ID_DUMMY_SELECT_ACTIVE_CONFIGURATION
をID_EDITにすると
TRUEには飛びますが、
lpszSelItemが無効なポインタになります。
置き換えたボタンのポインタを取得するだけならGetButton(index)を使って
CMFCToolBarComboboxButton* m_box = (CMFCToolBarComboboxButton*)m_toolbar.GetButton(index);
CString str = m_box.GetItem();
これはどこが問題あるんでしょうか?
あと頻繁に出るんですが、ブレークポイントで、現在の設定ではヒットしません。このドキュメントのシンボルが読み込まれていません。
と出て、右クリで場所の許可で対応してるんですが、これなんですか?関係ありますか?
0321デフォルトの名無しさん
2009/02/05(木) 23:24:300322デフォルトの名無しさん
2009/02/05(木) 23:29:37なんどもここ挫折して後回しにして2か月ぐらいチャレンジしてるんですが、今だにTextが取得できません
取得できると教えてもらえただけでもありがとうです。なにか設定か、全然違うところが原因な気がしてきました。
0323デフォルトの名無しさん
2009/02/05(木) 23:30:19>>311はドロップダウンリストの場合に、リストを変更した時に取得する方法。
任意のタイミングで取得する場合は、
任意なので「CMFCToolBar::IsLastCommandFromButton(pCombo)」は要らない。
よって、TRUEに飛んだら
pSrcCombo->GetEditCtrl()->GetWindowText
で取得する。
0324デフォルトの名無しさん
2009/02/05(木) 23:41:33>>309
ありがとう
時間的に厳しそうなのであきらめます
無制限に全部教示でなくても指定した行数だけは表示してくれるようになってると良かったなぁ
改行位置が結構重要なので省略された行は改行が無視されるのが痛いかった
0325デフォルトの名無しさん
2009/02/05(木) 23:49:59おーできました!ありがとうございました。感動しました。
調べてもらってすいませんでした。じっくり解析します
ありがとうございました!!!
0326デフォルトの名無しさん
2009/02/06(金) 20:12:38ググっても見付かったのは↓くらいで、裏付けに乏しいように思えるのですが。
ttp://www.flounder.com/avoid_mfc_syncrhonization.htm
0327デフォルトの名無しさん
2009/02/06(金) 22:50:36確かにそのページの主張には同意しかねるね。
CMutexについてはタイムアウトを特別視する用途以外(所有権が取得できたかどうかだけを知りたい場合)なら問題なさそうだし。
CSingleLockの再帰呼び出しはそもそも想定外の使い方だと思う。
CreateMutexの記述には待機関数を同じスレッドで繰り返し呼び出してもいいけど、
待機条件を満たす毎にReleaseMutexを呼べと書いてある。
0328デフォルトの名無しさん
2009/02/06(金) 23:00:100329326
2009/02/07(土) 23:58:47ありがとうございます。
やはり欠陥と言うほどではないようですね。
0330デフォルトの名無しさん
2009/02/08(日) 10:00:58ことをしますが、initInstance意外の場所でするときにpDocTemplate->OpenDocumentFile
を使うとき、newとかあたりをどうやってコーディングすればいいか分からないのですが
教えてください。
0331デフォルトの名無しさん
2009/02/08(日) 10:58:250332デフォルトの名無しさん
2009/02/08(日) 16:14:22DT_NOCLIPだけで出来てるところもあるのでDT_NOCLIPを付けたんですが白で塗りつぶされてしまいます。
色を指定しなくてもいいんですが、文字ボックスが出来ないようにしたいんです
0333デフォルトの名無しさん
2009/02/08(日) 16:30:44色はCDC::SetTextColor()
文字ボックスってなんだっけ。
0334デフォルトの名無しさん
2009/02/08(日) 16:31:16// このメンバ関数は、テキストを描画するために、デバイス コンテキストに現在選択されているフォント、テキストの色、背景色を使います。
ちゃんとマニュアル読めよ。
CDC::SetBkColor
CDC::SetBkMode
0335デフォルトの名無しさん
2009/02/08(日) 16:32:330336デフォルトの名無しさん
2009/02/08(日) 16:50:07Brushだと思い込んでた
thx
0337デフォルトの名無しさん
2009/02/08(日) 18:13:27CStaticのなかにCStaticを作った時
中のCStaticにクリックメッセージを送るには,Zオーダーをどうしようが外から中にメッセージを素通りさせるコードを書かない限り
届かないんでしょうか?
塗りつぶしの順序とか考えてたらわけわからなくなって来たんですが、
どうすれば整理できて自由に子、孫などにメッセージが届くようになりますか?
0338デフォルトの名無しさん
2009/02/08(日) 18:32:580339デフォルトの名無しさん
2009/02/08(日) 18:37:01ありがとうございました
0340デフォルトの名無しさん
2009/02/08(日) 19:03:40スタティック=静的。
0341デフォルトの名無しさん
2009/02/08(日) 19:08:47だからなんか作る時はCStaticを基本にしてるんですが、もっといいのあるんですか?
0342デフォルトの名無しさん
2009/02/08(日) 21:10:47パラメータが複雑で嫌気がさすほど、メインウィンドウにいくつものウィンドウがあるのか?
0343デフォルトの名無しさん
2009/02/08(日) 21:14:09いらないメッセージが発生しないようにデフォルトで殺してるだけで、
デフォルト以外がアブノーマルな使い方とは思わないな
0344デフォルトの名無しさん
2009/02/08(日) 21:15:020345名無し募集中。。。
2009/02/08(日) 22:40:540346デフォルトの名無しさん
2009/02/08(日) 22:52:27コントロールも.NETの1/10位しかないし・・・
0347デフォルトの名無しさん
2009/02/08(日) 23:17:34kwsk
0348デフォルトの名無しさん
2009/02/09(月) 00:35:50.netってツリーのドラッグアンドドロップとか
リストコントロールのウィンドウ枠の固定機能とかって楽にできるようになってる?
結構、客から要望くる機能で毎回作らないといけないんだけど・・・
0349デフォルトの名無しさん
2009/02/09(月) 00:52:03コンテナに貼り付けてDock指定するやつのことかな?
0350デフォルトの名無しさん
2009/02/09(月) 01:03:02エクセルを開くんだ
0351デフォルトの名無しさん
2009/02/09(月) 05:58:17今度は子がある部分をクリックしたとき親のクリックが実行されなくなりました。
クリックした場所にある特定の全ウィンドウにクリックを送るにはどうすればいいんでしょうか
0352デフォルトの名無しさん
2009/02/09(月) 07:24:240353デフォルトの名無しさん
2009/02/09(月) 10:00:450354デフォルトの名無しさん
2009/02/09(月) 10:17:48親は「クリックされていない」からな。
クリックされた座標を含むウィンドウを列挙して、それらのウィンドウすべてにメッセージを送る関数を
自前で作るしかあるまい。
0355デフォルトの名無しさん
2009/02/09(月) 14:24:33これはどうすれば直る?
TBSTYLE_NOPREFIX はつけていないんだけど・・・。
0356デフォルトの名無しさん
2009/02/09(月) 16:01:07当然、文字列は「ファイル(&F) 」ってやってるんだよな?
ところで、プルダウンメニューはCMenuだと思うけど、CMenuBarを使ってる
ということは、ツールバーのボタンのキャプションでアンダーバーが表示
されないってこと?
そもそもツールバーやダイアログバーに、そんな機能あったっけ?
0357デフォルトの名無しさん
2009/02/09(月) 17:38:09MFC内部で&を消して描画してるから無理。
&&Fとか&&&Fって書けば表示はされるけどAlt+Fに反応しなくなるからやはり無理。
フューチャーパックは問題だらけだから諦めろ。
0358デフォルトの名無しさん
2009/02/09(月) 17:40:08もちろん。
たとえば IE7 のメニューバー。あれもツールバーじゃん。そこにはアンダーバーがついてる。
他のアプリケーションでも同じ。
だけどCMFCMenuBar を使うと付かない。
Visual C++ 2008 Feature Pack のサンプル見ても付いてないんで仕様なのかなという気もするんだが、
何か見落としているよーな気もしてしっくりこないんだわ・・・。
0359デフォルトの名無しさん
2009/02/09(月) 17:41:58>>357
やっぱ仕様ということね。ふむ。
0360デフォルトの名無しさん
2009/02/09(月) 17:45:34でもおれのVSは2005(´・ω・`)
0361デフォルトの名無しさん
2009/02/09(月) 17:47:250362デフォルトの名無しさん
2009/02/09(月) 17:48:000363デフォルトの名無しさん
2009/02/09(月) 20:19:08バグがあるうちは業務で使えない
0364デフォルトの名無しさん
2009/02/10(火) 18:54:11俺だけなんかな?
0365デフォルトの名無しさん
2009/02/10(火) 19:04:270367デフォルトの名無しさん
2009/02/11(水) 20:44:07CString drag_file(m_lpCmdLine);
if (drag_file != _T("")) {
pDocTemplate->OpenDocumentFile(drag_file);
}
ではファイルが見つからないというメッセージボックスが出てうまくいきません。
MessageBox(drag_file);として見ても、ちゃんとドラッグしたファイルパスが拾えてるのですが・・・
どうすればイイですか?
0368デフォルトの名無しさん
2009/02/11(水) 20:47:540369デフォルトの名無しさん
2009/02/11(水) 21:03:370370デフォルトの名無しさん
2009/02/11(水) 21:21:37Unicodeで開発しているのですが、文字コードのせいとかありますか?
0371デフォルトの名無しさん
2009/02/11(水) 21:46:470372デフォルトの名無しさん
2009/02/11(水) 21:49:21CString drag_file;
drag_file.Format( _T("\"%s\""), m_lpCmdLine);
// To Do...
0373デフォルトの名無しさん
2009/02/16(月) 21:37:19VC2005で、CRichEditCtrlをもったダイアログベースのアプリを作っております。
CRichEditCtrlにShift_JISにないような文字(「もげる」を変換したらでる漢字とか)を
入れて、GetWindowTextWでその文字をCStringに取り込むと、その文字が?になって
しまいます。これを回避する方法はありませんでしょうか?
0374デフォルトの名無しさん
2009/02/16(月) 22:20:44昔と違って、今は簡単にMBCS/Unicode変換しちゃうからなあ。
0375373
2009/02/16(月) 22:47:35↑で解決しました。お騒がせして申し訳ありません。
0376デフォルトの名無しさん
2009/02/17(火) 00:33:49なるほどなあ。
0377デフォルトの名無しさん
2009/02/17(火) 21:49:00子ウィンドウを開くのをやめたい場合ってどうしてます?
0378デフォルトの名無しさん
2009/02/17(火) 23:26:50子ウィンドウとは何物?
0379デフォルトの名無しさん
2009/02/18(水) 07:47:410380デフォルトの名無しさん
2009/02/26(木) 00:55:42起動時に選択されているラジオボタンを(動的に)変更したいのですが、やり方がわかりません。
ダイアログのコンストラクタ中でSetCheckをしても、
コンパイルは通るのですが、デバック中に「Debug Assertion Failed!」
と落ちます。(まだ実体ができてない?)
0381デフォルトの名無しさん
2009/02/26(木) 01:37:19最近MFCやってないからあやふやだ・・・
来週からまた使うことになりそうだからリハビリせねば
0382デフォルトの名無しさん
2009/02/26(木) 01:53:11thx!できました。オーバーライドするのね。
↓参考にしました
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200504/05040016.txt
0383デフォルトの名無しさん
2009/02/28(土) 12:26:30既に見ていないかもしれないが ...
ダイアログ派生クラスに、ラジオボタンに対応するint型のメンバ変数を
割り当てて、DoDataExchange()内でDDX_Radio(pDX,...)でコントロール
に関連付けておけば、ダイアログウィンドウが生成されていないタイミ
ングでも、クラスのオブジェクトが生成された時点で、メンバ変数には
アクセスできるので、メンバ変数の初期値を変更してDoModal()すれば、
ラジオボタンの初期値を変更できるよ。
クラスウィザードでメンバ変数を割り当てると、コンストラクタで「-1」に
初期化されるコードが自動生成されるので、これを0〜の値にすればいい。
0384デフォルトの名無しさん
2009/02/28(土) 19:36:04>初期化されるコードが自動生成されるので、これを0〜の値にすればいい。
VS2008 だと初期値は 0。修正されたのかな。
ちなみに、変数のカテゴリには Value を選ぶこと。
0385デフォルトの名無しさん
2009/03/02(月) 10:18:58リスト(m_strokeList)や配列(m_pointArray)などのメンバは堂々とpublicで、
描画時などは外から直接参照したり操作してるけど、
これってやはり手を抜いているだけでしょうか?
それとも、この程度のものはいちいちカプセル化しないものなのでしょうか?
0386デフォルトの名無しさん
2009/03/02(月) 10:44:120387デフォルトの名無しさん
2009/03/02(月) 11:48:51クラスウィザードでメンバ変数を作ると、意識して設定しない限り public になる。
0388デフォルトの名無しさん
2009/03/02(月) 12:00:410389デフォルトの名無しさん
2009/03/02(月) 20:03:47知っておられる方、情報をお願いします。
0390デフォルトの名無しさん
2009/03/02(月) 20:31:330391デフォルトの名無しさん
2009/03/02(月) 20:32:210392デフォルトの名無しさん
2009/03/02(月) 20:34:250393389
2009/03/03(火) 09:10:56Visual Studio 2008のIDEでは、
派生元へのオーバーライドができないのね・・・手書きなのか・・・
できました!
ありがとうございます!
0394デフォルトの名無しさん
2009/03/03(火) 14:23:17ダイアログ上でレイアウトされたグループボックスにて、
文字色をで変更しようとSetTextColorを使ったのですが、
反映されませんでした。
何かコツみたいなものがあるのでしょうか?
ちなみに環境はVS2008でMFC Feature Packを使っています。
0395デフォルトの名無しさん
2009/03/03(火) 14:56:000396デフォルトの名無しさん
2009/03/03(火) 17:47:13CWnd::OnCtlColor
0397デフォルトの名無しさん
2009/03/07(土) 17:37:02ポップアップメニューを表示しています。
各行で文字位置を合わせたいので固定ピッチのフォント
を利用したいのですが、ポップアップメニューのフォント
はどのようにすれば変更できますか?
ポップアップメニュー作成は、TrackPopupMenuを使っています。
0398デフォルトの名無しさん
2009/03/07(土) 17:53:49OwnerDraw Menu にする
0399デフォルトの名無しさん
2009/03/07(土) 21:48:22afxGlobalData.SetMenuFontで設定するといいらしい。
他にもafxGlobalDataをいじるといろいろできるけど、
これ直接いじっていいんかな?
0400デフォルトの名無しさん
2009/03/07(土) 22:37:040401デフォルトの名無しさん
2009/03/07(土) 23:27:13MFCのソースを追っかけたのに・・・・
思いっきり見落としたらしい。
0402デフォルトの名無しさん
2009/03/08(日) 00:56:41CMFCMenuBar::SetMenuFont() した内容はクリアされるから、再度設定しなおすこと。:-)
0403 ◆8x8z91r9YM
2009/03/09(月) 21:08:28VS2005 MFCでCrystalReport(PUSH型)を扱ってる
参考になりそうなサイトをご存知の方おられましたら
教えていただけませんでしょうか?
C#やVBなどは表示したいデータをDataSetでまとめて
Crystalreportに渡して表示できますが、
それをMFCでどのように実装すればいいのか悩んでおります。。
よろしくお願い致します。
0404デフォルトの名無しさん
2009/03/11(水) 00:51:10ToolbarResetを発行してやると、文字は表示されるにはされるんですが、
カスタマイズ設定も消えてしまうので・・・
0405デフォルトの名無しさん
2009/03/11(水) 02:04:50CMFCToolBar::EnableTextLabels() だと下に表示だよな。
CMFCToolBar::GetButton( nIndex)->m_bText = TRUE; あたりで試してみ。
0406デフォルトの名無しさん
2009/03/11(水) 06:25:28うまくいきません。 ソース 80行程度をアップしてアドバイスを頂いてもよろしいでしょうか?
1週間ぐらい頑張りましたが分からなかったもので・・・。
0407デフォルトの名無しさん
2009/03/11(水) 08:02:460408デフォルトの名無しさん
2009/03/11(水) 09:28:21ただ「うまくいきません」としか説明できないんじゃ答えるつもりはない。
0409デフォルトの名無しさん
2009/03/11(水) 10:47:21状態としてはデバッガ出力ではエラーは帰ってきていませんが
スニファツールで見ると サーバから501エラーが帰ってきています。
サーバ側のPHPテストプログラムの方は $_FILES["upfile"]["tmp_name"]
にも $_FILES['userfile']['error']にも 値が入ってきません。
多分ヘッダの送り方、設定の仕方がおかしいと思うのですが。。。
ソースは以下になります。
0410デフォルトの名無しさん
2009/03/11(水) 10:49:25ろだ使っては
0411デフォルトの名無しさん
2009/03/11(水) 10:49:28#define BOUNDARY "hogehoge"
#define POST_FILE "C:\\TEST.DAT"
#define BUF_SIZE 2048
bool PostData(TCHAR* uri){
bool bRtn = false;
try
{
DWORD dwServiceType = 0, statusCode;
CString strServer, strObject, strBuf, strBoundary = TEXT(BOUNDARY);
INTERNET_PORT nPort;
char szBuf[BUF_SIZE + 1];
if (AfxParseURL(uri, dwServiceType, strServer, strObject, nPort) == false)
{OutputDebugString(TEXT("PostData() AfxParseURL失敗\n")); goto pd_End;}
CInternetSession session(TEXT(APP_NAME));
CHttpConnection* conn = session.GetHttpConnection(strServer,
CHttpConnection::HTTP_VERB_POST, nPort, NULL, NULL);
CHttpFile* file = conn->OpenRequest(CHttpConnection::HTTP_VERB_POST,
strObject, NULL, 1, NULL, NULL,
INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);
0412デフォルトの名無しさん
2009/03/11(水) 10:59:43411の投稿すいませんでした。
ttp://www7.uploader.jp/dl/game/game_uljp00007.txt.html
0413デフォルトの名無しさん
2009/03/11(水) 11:04:14エラー メッセージ : エラー 501/505 - 未実装または未サポート
[HTTP 1.1 を使用する] チェック ボックスをクリックしてオフにし、[OK] をクリックします。
テストして問題が解決したかどうかを調べます。
2002 年 12 月現在、HTTP 1.1 は新しい Internet プロトコルです。
一部の Web サイトでは HTTP 1.0 が使用されているため、HTTP 1.1 を使用した場合、
接続の問題が発生することがあります。
0414デフォルトの名無しさん
2009/03/11(水) 11:44:28プログラムに問題がある
設定が間違ってる
使い方が間違ってる
ネット上にトラブルがある
メールを送った相手に問題がある
みたいにありとあらゆる原因が考えられるわけだけど
いきなりプログラムのソース見ろと言われても
設定が間違ってる
使い方が間違ってる
ネット上にトラブルがある
メールを送った相手に問題がある
だったら見るだけ無駄だろ
0415デフォルトの名無しさん
2009/03/11(水) 11:49:360416デフォルトの名無しさん
2009/03/11(水) 14:01:28・グローバル関数だし、
・コメントないし、
・goto ラベル使い放題だし、
・for(;;)だし・・・ (while() 使えよ)
0417デフォルトの名無しさん
2009/03/11(水) 14:15:34そういう関係ないところつっこむからソース出したがらない質問者が増える
0418デフォルトの名無しさん
2009/03/11(水) 17:29:12手抜きしないできれいに書いてあるサンプルあったら見てみたい
0419デフォルトの名無しさん
2009/03/11(水) 17:32:03> ・グローバル関数だし、
> ・コメントないし、
コミュニケーション能力重視とか、ヒューマンスキル重視の現場では、
ありがちだ。 業務で引き継ぐと悲惨なパターン。
しかも極端な場合、グローバル変数の名前が「i」なんて場合もある。
> ・for(;;)だし・・・ (while() 使えよ)
個人的には「while(1)」の方が好みだけど、「for(;;)」の方が推奨
されているらしい。
しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」
はやめてほしい。
0420デフォルトの名無しさん
2009/03/11(水) 22:46:05>しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」
そりゃ無茶や。
全く脱出しないループで外部から殺してもらうってことなら兎も角、
ループ内の何かの事象で脱出したくなることくらいあるだろよ。
0421デフォルトの名無しさん
2009/03/11(水) 22:52:57while(1)はMS-C V6がwarning吐いてたから、おれはfor(;;)使うよ。
>>420
そういう場合forに脱出条件を入れろという説がある。
おれは基本的に嫌いだけどね。
0422デフォルトの名無しさん
2009/03/11(水) 23:05:32...;
someStatus = someFunction();
if (someStatus) break;
...;
...;
}
--
よくありがちなこんなコードを否定するのかな?
0423デフォルトの名無しさん
2009/03/11(水) 23:25:55無限ループの可能性を残すコードを、おれ個人は書かないけど。
0424デフォルトの名無しさん
2009/03/11(水) 23:30:58やっぱfor (;;)とbreakはセットで使ってるね
以下VC6のMFC
SRC\AFXMEM.CPP(322): for (;;)
SRC\AFXMEM.CPP(371): for (;;)
SRC\APPUI1.CPP(172): for (;;)
SRC\ARCCORE.CPP(816): for (;;)
0425デフォルトの名無しさん
2009/03/11(水) 23:35:02MFCでコントローラに追加した文字列のメモリ管理ってどうなってるんでしょうか?
例えば、以下のような場合、FuncA()関数を抜けたときに
strのアドレス先のメモリが解放されて、コンボボックスで
strの文字列が参照できなくならないのでしょうか?
試したところ問題ないようですが、不思議です。
void FuncA() {
CString str;
m_pCmbBox->AddString(str); //メンバ変数であるコンボボックスに文字列追加
}
0426デフォルトの名無しさん
2009/03/11(水) 23:45:01CBN_ERRSPACE が通知されてくる。
これはMFCの質問じゃないな。
0427デフォルトの名無しさん
2009/03/11(水) 23:50:26すみません、もう一歩だけお願いします。
調べるなら、C++のメモリ管理で調べればいいでしょうか?
0428デフォルトの名無しさん
2009/03/11(水) 23:51:14描画のタイミングが関数抜けた後だから
文字列は渡し終わってるから問題なし
0429デフォルトの名無しさん
2009/03/12(木) 00:10:04まとめるとこうでしょうか。
・コントローラに文字列を渡すと、コントローラが新たにメモリを割り当てる。
・この場合、関数を抜けた後も、描画タイミングで割り当てられたメモリが参照されるので問題なし
ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能
コントローラのメモリ管理について調べてみます。
ありがとうございました。
0430デフォルトの名無しさん
2009/03/12(木) 00:18:04controllerじゃなくてcontrolだぞ。
0431デフォルトの名無しさん
2009/03/12(木) 00:28:17訂正thx。気をつけますw
0432デフォルトの名無しさん
2009/03/12(木) 00:44:32これは単にスコープの問題
0433デフォルトの名無しさん
2009/03/12(木) 10:43:00スコープが外れても寿命が続くのなら大丈夫。
だから例えば、staticでも(一代限りは)使える。
0434デフォルトの名無しさん
2009/03/12(木) 20:06:01変数で作成したなら、関数を抜けた時点で変数の寿命が尽き、DeleteObject()
を呼んでいなくてもデストラクタから(メンバ変数のm_hObjectを使って)強制
的にDeleteObject()が呼び出され、(GDIオブジェクトとそのハンドルが)破棄
される。
CFont *pFont=new CFont;
などとやった場合、ポインタ変数の寿命が尽きても、newしたオブジェクト
自体はdeleteはされないので、プロセス終了まで、紐が切れた凧のように
メモリ空間に残る。
95系だとプロセス終了でも解放されず、リソースリークになるんだっけか?
static で宣言したオブジェクトでも、
if(s_FontStatic.GetSafeHandle())
s_FontStatic.DeleteObject();
s_FontStatic.CreateFontIndirect(...);
と破棄する手順を踏めば、何回でもリサイクルできる。
0435デフォルトの名無しさん
2009/03/14(土) 02:34:290436デフォルトの名無しさん
2009/03/14(土) 10:05:36CMFCToolbar って、CDialogBar よりも美味しいの?
スタティックテキスト相当な機能なら、わざわざウィンドウを置かなくても
CString型のメンバ変数を追加して、ツールバーの描画処理を自前でやれば
いいだけのような肝。
0437デフォルトの名無しさん
2009/03/17(火) 23:37:17つCStatic::Create
0438デフォルトの名無しさん
2009/03/22(日) 15:54:16例えばCEditが10個並んでいるとして、5番目のタブオーダーのCEditにフォーカスがある時に、
4番目のタブオーダーのコントロールIDを調べたいんですが。
"タブオーダー MFC"でググってもタブオーダーを変更する方法しか見つからなくて。
タブオーダーがらみのAPIって無いんですかね?
0439デフォルトの名無しさん
2009/03/22(日) 16:23:08if ( pWnd->GetStyle() & WS_TABSTOP) UINT nID = pWnd->GetDlgCtrlID(); // こいつがそう。
else pWnd = pWnd->GetWindow( GW_HWNDPREV);
以下繰り返しってな感じで取得できないかな。
実際には while ループするほうがお得だろうが。
0440デフォルトの名無しさん
2009/03/22(日) 17:14:26どうもありがとうございます。
GW_HWNDPREVというのはウインドウのZオーダー順であるだけでなく、
Window上のコントロールのタブオーダー順でもあるんですね。
0441デフォルトの名無しさん
2009/03/22(日) 21:59:09MFCでアプリを作っているのですが、
動作確認のため、コンソールも起動しております。
_cprintf_sや_cscanf_s関数を使っているのですが、
_cscanf_s関数でバックスペースのキーを入力すると、
プログラムが無限ループで暴走してしまいます。
普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには
どうすればよいでしょうか?
0442デフォルトの名無しさん
2009/03/22(日) 22:07:520443名無し募集中。。。
2009/03/23(月) 09:08:39コンソールならダイアログにEditコントロールを置いて表示・入力するって感じになりそうだけど
デバッグ表示だけならTRACEマクロが便利
値の入力は・・・ちょっと試すだけならブレイクポイントで値の代入とか
0444デフォルトの名無しさん
2009/03/23(月) 21:24:49詳しい説明書ないかお?
0445デフォルトの名無しさん
2009/03/24(火) 10:07:580446デフォルトの名無しさん
2009/03/24(火) 17:14:26SP1非対応でよければMicrosoft Pressの「プログラミングVisual C++.NET Vol.1/2」
Vol.2の最後にちょろっと.NETの説明があるけど、それ以外はMFCの説明になってる
0447デフォルトの名無しさん
2009/03/24(火) 20:59:37ドキュメント化されていない情報が山ほどあるし。
別に全部目を通さなくても、疑問に思った箇所だけで十分。
0448デフォルトの名無しさん
2009/03/27(金) 13:56:06CDialogを継承したCxxxDialogというクラスを作って、
そこにWM_UNINITMENUPOPUPというメッセージが来たときのハンドラを作成したいのですが、
VC++の開発環境から追加しようと思っても、CxxxDialogクラスのプロパティのメッセージのリストには出てきません。
クラスのプロパティのメッセージの一覧には、限られたメッセージしか扱ってないようです。
ここにないメッセージのハンドラを追加したい場合はどうしたらいいのでしょうか?
0449デフォルトの名無しさん
2009/03/27(金) 13:57:480450デフォルトの名無しさん
2009/03/27(金) 14:10:54ON_MESSAGE( WM_UNINITMENUPOPUP, &OnUnInitMenuPopup)
xxxDialog.h に
afx_msg LRESULT OnUnInitMenuPopup( WPARAM wParam, LPARAM lParam);
xxxDialog.cpp に
LRESULT CxxxDialog::OnUnInitMenuPopup( WPARAM wParam, LPARAM lParam)
{
// ToDo...
return 0L;
}
0451デフォルトの名無しさん
2009/03/27(金) 14:58:19できました!感謝です。
0452デフォルトの名無しさん
2009/03/28(土) 00:16:42BCBのTDrawGridみたいなものないでしょうか
条件はwin+exeのみで実行出来てCListView(だったかな)以外です
0453デフォルトの名無しさん
2009/03/28(土) 00:21:43TDrawGirdとやらに充分近づいたと納得できるまで、CListCtrlを拡張する。
0454デフォルトの名無しさん
2009/03/28(土) 19:29:060455デフォルトの名無しさん
2009/03/28(土) 20:34:31作成というか、ハンドルを取得するなら、
m_pPictメンバにIPictureインターフェースのポインタが入っているから、
ここからget_Handleで取り出すのが一番早いかな。
0456デフォルトの名無しさん
2009/03/29(日) 00:07:59thx
�@get_Handleでハンドル取得
�AHICONでキャスト
�BCopyIconで複製
でいけた
0457デフォルトの名無しさん
2009/03/31(火) 20:43:190458デフォルトの名無しさん
2009/03/31(火) 20:46:190459デフォルトの名無しさん
2009/03/31(火) 20:49:560460デフォルトの名無しさん
2009/03/31(火) 20:51:05ここからファイルパスってとれないかな?
0461デフォルトの名無しさん
2009/03/31(火) 20:51:530462デフォルトの名無しさん
2009/04/01(水) 00:53:27IPictureDispって、デバイスコンテキストみたいな感じで
データソースがファイルとは限らないんじゃない?
ファイルパスの保持はこのオブジェクトの役目ではないような気がする。
0463デフォルトの名無しさん
2009/04/02(木) 21:39:410464デフォルトの名無しさん
2009/04/06(月) 09:20:30ウィザード使うと訳が分からなくなるので、手動で最低限必要なところだけ書いてMFCを使いたいのですが
0465デフォルトの名無しさん
2009/04/06(月) 09:35:480466デフォルトの名無しさん
2009/04/06(月) 09:44:110467デフォルトの名無しさん
2009/04/06(月) 10:04:13ありがとうございます!
標準講座MFCという本を買ってみようと思います。
0468デフォルトの名無しさん
2009/04/06(月) 21:59:32そのテキストにある改行を Find(_T('\n', 0) と書いて検索したのですが-1しか
返ってきません。文字セットはUnicodeを使っていますが、マルチバイトでも
結果は同じでした。
地味にwcsstrとかを使わないと駄目でしょうか?
0469デフォルトの名無しさん
2009/04/06(月) 22:29:440470デフォルトの名無しさん
2009/04/06(月) 22:38:180471デフォルトの名無しさん
2009/04/06(月) 23:21:520472デフォルトの名無しさん
2009/04/07(火) 00:06:49\nと\rの違い、解ってる?
0473デフォルトの名無しさん
2009/04/07(火) 00:09:240474デフォルトの名無しさん
2009/04/07(火) 00:44:17CStringをメモリダンプしたら0dだけだったので\rにしただけです。
0475デフォルトの名無しさん
2009/04/07(火) 00:47:370476デフォルトの名無しさん
2009/04/07(火) 01:33:030477デフォルトの名無しさん
2009/04/07(火) 17:00:26その問題解決で合ってる。
煽ってる人はおかしいね。
0478デフォルトの名無しさん
2009/04/07(火) 17:31:070479デフォルトの名無しさん
2009/04/07(火) 19:14:270480デフォルトの名無しさん
2009/04/07(火) 19:23:56>Unicodeだと
と明示しているわけだが。
>>477
>煽ってる人はおかしいね。
あまり親切ではないが、教えてくれてるんだろう。
0481デフォルトの名無しさん
2009/04/07(火) 21:35:210482デフォルトの名無しさん
2009/04/07(火) 21:52:44以下の手順で、ダイアログと関連付けられているはずのクラスが
ClassWizard上からは参照できなくて困っています。
1.リソースのダイアログ上で右クリックしてClassWizardを選択
2.新規クラス名を求められるので、「既存のクラスの選択」を選ぶ
3.「クラスに関連付けられていません」と表示される上、クラスを選ぶ
リストにクラス名がひとつも表示されないので、選択できない。
(今、手元にVC++がないので、多少手順がちがうかもしません。)
プログラムを実行すると問題なく動きます。
また、ダイアログに関連付けられているはずのクラスのヘッダファイルを見ると、
ClassWizardで生成したと思われる関数("//{{AFX_MSG"コメント内にOnXXX関数がある)
が書かれています。
原因や対処法などわかりましたらよろしくお願いします。
0483デフォルトの名無しさん
2009/04/07(火) 22:18:39とてつもなく昔の話なのでうろ覚えだが、VC6ではクラスウィザードはしょっちゅう破損するから
いつも何かのファイルを消して対応してたような気がする。
なんだっけなぁ、拡張子がclwみたいやつだったかなぁ・・・
0484デフォルトの名無しさん
2009/04/07(火) 22:34:06ありがとうございます。
clwファイルは、問題のダイアログの箇所が、Class=?になってました。
(普通は関連したクラス名が書かれているような)
試しに手でクラス名を書いたら、reloadのエラーメッセージが半永久的に…
clwを削除して、ビルドすれば再作成されるのでしょうか?
0485デフォルトの名無しさん
2009/04/07(火) 22:37:02バカが。
0486デフォルトの名無しさん
2009/04/07(火) 22:37:57やってごらんよ。必要ならバックアップをとった上で
0487デフォルトの名無しさん
2009/04/07(火) 22:39:370488483
2009/04/07(火) 22:44:44当時は、周りの人たちはみんな知ってたしMLやWeb上でもFAQ扱いだったから
正確な情報知ってる人が颯爽と現れてくれないかなと思ってたんだけど。
0489デフォルトの名無しさん
2009/04/07(火) 23:12:590490デフォルトの名無しさん
2009/04/07(火) 23:19:25そこまでヒントでてたら自分で調べるもんだろ
しかも職業プログラマに手取り足取り無料サポートする必要あるのか?
0491デフォルトの名無しさん
2009/04/08(水) 01:04:590492デフォルトの名無しさん
2009/04/08(水) 01:23:220493デフォルトの名無しさん
2009/04/08(水) 01:28:050494名無し募集中。。。
2009/04/08(水) 01:54:05昔からncbを消したりclwを消さないと変な挙動になる事はあるよね
0495デフォルトの名無しさん
2009/04/08(水) 07:04:290496482
2009/04/08(水) 23:13:46clwを削除してリビルドしたところ、ClassWizardが直りました。
VC++自体に不慣れで、ファイルを消すということは盲点でした。
>>495
次からそうします。
0497デフォルトの名無しさん
2009/04/09(木) 18:02:47CChildView::PreCreateWindowの
cx.cx を変えてもサイズが変わらず
CMainFrame::PreCreateWindowの
cx.cx を変えても外枠のサイズが変わり、クライアント部分が小さくなり、
CRect rect = CRect( 0,0,640,480 );
AdjustWindowRectEx( rect , cs.style , TRUE , cs.dwExStyle );
cs.cx = rect.Width();
cs.cy = rect.Height();
と、書いてみたのですが、
ステータスバーやツールバーの部分が計算に入れられてないので
やや狭いという感じになるのです。
なにか、いい方法はありませんか?
0498デフォルトの名無しさん
2009/04/09(木) 18:25:420499デフォルトの名無しさん
2009/04/09(木) 18:55:070500デフォルトの名無しさん
2009/04/09(木) 19:18:22でも、むずかしめなサンプルが載ってる本がすくないんだお( ^ω^)
VC++6のころの本をあさるしかないんだお( ^ω^)おまけにネットワークをカバーしてる本もすくないんだお( ^ω^)
Impressの赤い分厚い本のシリーズでMFCの本があればよかったとおもうんだお( ^ω^)
ハーバーと汁とのMFCの本はあまりおもしろくないお( ^ω^)
0501デフォルトの名無しさん
2009/04/10(金) 13:57:340502デフォルトの名無しさん
2009/04/10(金) 18:05:020503デフォルトの名無しさん
2009/04/10(金) 18:12:12何も分からず.NET.NETうるさいから
そういう人に売れてるんじゃね
0504デフォルトの名無しさん
2009/04/10(金) 18:14:09という事実はない。
0505デフォルトの名無しさん
2009/04/10(金) 18:29:120506デフォルトの名無しさん
2009/04/10(金) 19:04:20.Netの何を超えるの?くそ加減?
0507デフォルトの名無しさん
2009/04/10(金) 20:25:52うん
0508デフォルトの名無しさん
2009/04/10(金) 23:32:500509デフォルトの名無しさん
2009/04/10(金) 23:50:150510デフォルトの名無しさん
2009/04/11(土) 00:38:18ただより高いものなし。12万打して、VSPRo買ったほうがはるかに有益。
0511デフォルトの名無しさん
2009/04/11(土) 01:03:06文字セットはUnicodeで、第一引数にFR_DOWN、第二引数にはFINDTEXTEXWを使っています。
chrg.cpMinに0、chrg.cpMaxに-1、lpstrTextにCString::GetBufferの戻り値を入れてます。
何か足りないものがあるんでしょうか?
0512デフォルトの名無しさん
2009/04/11(土) 01:45:04脳みそ、知識、技術、考える力。
好きな物を選べ。
0513デフォルトの名無しさん
2009/04/11(土) 02:09:380514デフォルトの名無しさん
2009/04/11(土) 03:15:430515デフォルトの名無しさん
2009/04/11(土) 03:27:41なっていないことは確認できています。
0516デフォルトの名無しさん
2009/04/11(土) 09:45:32VS2005だと、リッチエディットコントロールは
常にクラス名が"RichEdit20A"に固定されていた気がする。
で、VS2008のMFCだと、FindTextはEM_FINDTEXTEX呼び出しに変換されていたので
それ以前のVer.でも同じなんじゃないかなあ。
で、何が言いたいかと言うと、クラスとメッセージに妙な関係があるわけで。
x64Vista SP1/VS2008 SP1 でテストしてみた結果は下記の通り。
Unicode-ANSI変換時に化けちゃってるのかねえ。
ちなみにANSI/Unicode、x86/x64で違いは無かったので省略。
・RichEdit20A
OK : SendMessageA/EM_FINDTEXTEX
NG : SendMessageA/EM_FINDTEXTEXW
NG : SendMessageW/EM_FINDTEXTEX (VS2005?)
OK : SendMessageW/EM_FINDTEXTEXW
・RichEdit20W
NG : SendMessageA/EM_FINDTEXTEX
NG : SendMessageA/EM_FINDTEXTEXW
OK : SendMessageW/EM_FINDTEXTEX (VS2008)
OK : SendMessageW/EM_FINDTEXTEXW
今時ANSIビルドも無いだろうし、EM_FINDTEXTEXWを直接呼んだほうが早いか。
クラス名弄るよりよっぽど楽だし。
0517デフォルトの名無しさん
2009/04/11(土) 12:06:37指摘の通り、SendMessageWでEM_FINDTEXTEXWで呼び出してみましたが、やはり-1しか返って
きませんでした。
あと、CRichEditCtrl::FindTextの宣言を調べてみたら、#ifdef UNICODEでFindTextWになっていました。
0518デフォルトの名無しさん
2009/04/11(土) 17:28:05ダメだ。
おまえは、いろいろ分かってなさ過ぎる。
0519デフォルトの名無しさん
2009/04/11(土) 19:02:330520デフォルトの名無しさん
2009/04/11(土) 19:19:45何がわかっていないのか、ご教示願えれば幸いです。
0521デフォルトの名無しさん
2009/04/11(土) 21:41:37FINDTEXTEXW ft;
ZeroMemory(&ft, sizeof(ft));
ft.chrg.cpMin = 0;
ft.chrg.cpMax = -1;
ft.lpstrText = strFind;
long pos = richEditCtrl.SendMessage(EM_FINDTEXTEXW, FR_DOWN, (LPARAM)&ft);
richEditCtrlはCRichEditCtrlクラスの変数。
これで動作しないなら現ソースを全てupするしかないな。
俺が調べた限りでは、EM_FINDTEXTEXWが最強っぽいのだけどなあ。
0522デフォルトの名無しさん
2009/04/11(土) 21:48:25期待通りの動きが確認できました。ありがとう御座いました。
0523デフォルトの名無しさん
2009/04/12(日) 13:01:42中の人が::SendMessageしてるだけだから、どれ使ってもできない方がおかしい。
0524デフォルトの名無しさん
2009/04/12(日) 13:03:530525デフォルトの名無しさん
2009/04/13(月) 17:08:02スプラッシュスクリーンをどうしています?
自作ですか?
それともCSplashWndに代わるクラスがありますでしょうか?
0526デフォルトの名無しさん
2009/04/13(月) 17:21:110527デフォルトの名無しさん
2009/04/13(月) 18:27:52MFCアプリケーションにて、
ダイアログ操作による選択を行う場合、
CDocument派生クラスのポインタを
対象のダイアログの引数で参照させることは一般的でしょうか?
それとも、AfxGetApp()の様なグローバルな関数があるのでしょうか?
0528デフォルトの名無しさん
2009/04/13(月) 18:54:210530デフォルトの名無しさん
2009/04/13(月) 20:21:001.ダイアログのインスタンスを作成
2.必要に応じてインスタンスに現在の設定内容を渡す
3.表示
4.インスタンスから変更された設定内容を取り出す
こんな感じ。
UIとメンバ変数の内容交換はDDX/DDVでやれ、と。
そこらへんは、コントロールに対して「変数の追加」とかやれば勝手にやってくれる。
0531527
2009/04/13(月) 20:25:03やはりそうか・・・
引数などで参照させて
ダイアログ内でCDocument派生系を操作するのではなく、
ダイアログによる操作後、手前でCDocumentを操作するのですね?
プログレスダイアログ風な事を考えるのは邪道だと、、、
0532デフォルトの名無しさん
2009/04/13(月) 22:09:13俺なら、こんな風にやっちゃったりするけど。
class CMyDlialog : public CDialog
{
...
private:
MyData& mydata;
public:
CMyDlialog(MyData& mydata, CWnd* pParent = NULL)
: CDialog(CMyDlialog::IDD, pParent), mydata(mydata)
{}
...
};
あとアプリケーション共通データは、CDocumentに無理に持たせず
シングルトンクラスにしてどっからでも参照できるようにしたりもする。
これは賛否分かれるかもしれんが、意外とその方がメンテナンス性よかったりする。
0533デフォルトの名無しさん
2009/04/13(月) 22:31:06theApp そのものがグローバルなのだから。
0535デフォルトの名無しさん
2009/04/13(月) 23:24:340536デフォルトの名無しさん
2009/04/14(火) 00:21:59一理ある。でも他アプリでも使う可能性が0.1%でもあるなら
CxxxAppではなくCxxxAppが保持する独立したobjectの方が
良いと思う今日この頃。532に一票。
0537デフォルトの名無しさん
2009/04/14(火) 00:40:41変更後に必ずUpdateAllViewsしたくなるようなデータだったらCDocumentに持たせるのが妥当だし。
0538デフォルトの名無しさん
2009/04/14(火) 01:10:11>良い
それも CxxxApp のデータであることに変わりはあるまいw
0539デフォルトの名無しさん
2009/04/14(火) 01:12:49MFC以外に移植するときはそのオブジェクトを使いまわせるように、って意味でしょ
0540デフォルトの名無しさん
2009/04/14(火) 01:13:46まあとにかくCxxxAppのメンバには変わりないが、まるごと切り取れるように、ってこと
0541デフォルトの名無しさん
2009/04/14(火) 08:46:34ファイルの読み書きをするプログレスバーのようなものをイメージすればいいのかな
0542デフォルトの名無しさん
2009/04/15(水) 16:48:140543デフォルトの名無しさん
2009/04/15(水) 17:05:060544デフォルトの名無しさん
2009/04/16(木) 14:23:370545デフォルトの名無しさん
2009/04/16(木) 21:29:03VisualStudio2005でVC++のプログラムを書いていて、
GUI操作可能なプログレスダイアログを作ろうと思ってます。
そこでVisualStudioヘルプのGetImageサンプルコードに含まれる
ProgressDlgを参考にしようと思ってるんですが、この実装方法だと
独自に派生したコモンコントロールのクラス(例えばCButtonから
派生したCMyButtonのような)をプログレスダイアログ上に配置する
にはどうすればいいんでしょうか。
ダイアログプロシージャ内でDDXを呼び出すのかと思ったのですが
どのメッセージをどう受ければいいのかがわかりません。
あるいはもっと使いやすくて安全なサンプルコードがあれば、
それを紹介していただくだけでも構いません。
よろしくお願いします。
0546デフォルトの名無しさん
2009/04/16(木) 22:36:470547デフォルトの名無しさん
2009/04/16(木) 22:39:000548デフォルトの名無しさん
2009/04/16(木) 23:00:55何か使えないような特殊な事情でもあるんだろうか?
それとも単純に派生したクラスの使い方がよくわからないということ?
0549545
2009/04/16(木) 23:19:46いつも自分がやってる方法は下記のとおり。
(1) リソースエディタでダイアログの外観を適当に編集した後、
右クリック→クラスの追加でそのダイアログに相当するクラス
(CDialogの派生クラス)を作る。
(2) リソースエディタ上に戻ってダイアログ上のボタンを右クリック→
メンバ変数の追加を選び、CButtonクラスの変数として(1)のクラスの
メンバに追加する。
(3) (1)のクラスのヘッダにCMyButtonの宣言を含むヘッダを#include
した上で、(2)の型宣言をCButtonからCMyButtonに書き換える。
こうすることで、DoDataExchange関数の中のDDXがリソース上の
ボタンのIDとCMyButton型のメンバ変数を結び付けてくれるから、
後は何もしないでもCMyButtonの挙動になります。
0550545
2009/04/16(木) 23:22:28そもそもCDialogの派生クラスじゃないんですよ。
HWND型のメンバ変数を持っておいて、クラスが作られるとき
リソースIDを指定してダイアログを作成し、そのメンバ変数に
結びつけるという、いわばダイアログの簡易実装みたいなこと
をやってて、ボタンの挙動なんかはそのクラス内で走らせてる
プロシージャでIDCANCELとかのメッセージを直接受け取って
処理してるんです。
こういう場合、ボタンのリソースIDとCMyButtonクラスとを
どうやって結びつければいいのかわからない、というのが
質問の中身です。
0551545
2009/04/16(木) 23:40:24それでいいので、もっと使いやすくて安全なコードが
あるなら、このサンプルには取り立ててこだわらない
んですけど。
0552デフォルトの名無しさん
2009/04/16(木) 23:54:510553デフォルトの名無しさん
2009/04/17(金) 08:01:36CDialogBarを使っていて、メインウィンドウの左右どちらかにドックできるようにしています。
そために、そのダイアログバーのリソースは縦長でデザインしました。
上下にもドックできるようにしたいのですが、上下にドックしたときには横長になるようにしたいのです。
ドックする位置によってリソースを使い分ける方法ってあるのでしょうか。
0554デフォルトの名無しさん
2009/04/17(金) 10:03:270555デフォルトの名無しさん
2009/04/17(金) 11:21:130556デフォルトの名無しさん
2009/04/17(金) 16:45:020557デフォルトの名無しさん
2009/04/17(金) 21:54:23あんまり関係ないけど
0558545
2009/04/18(土) 01:59:06ありがとうございます。
WM_INITDIALOGのメッセージを処理する箇所で
その関数を呼び出すことで、結びつけることが
できました。
0559デフォルトの名無しさん
2009/04/19(日) 10:54:49・CSplitterWndで静的分割ウィンドウが複数分けられていて、
あるペインではCTreeViewが貼り付けられている。
・別のペインで何らかのUI操作中に、このCTreeViewの表示を
排他をかけずに更新させたい。
・CTreeViewのオブジェクトをスレッド化?しなければならないと思うけど
どのようにすればよいのでしょうか?
AfxBeginThreadとかRUNTIME_CLASSとか使用するものと思っていますが、
実装のしかたがよくわかりません(;_;)
0560デフォルトの名無しさん
2009/04/19(日) 11:08:46>排他をかけずに更新させたい。
すまんが解りやすく言ってくれ。「排他をかけずに」とはどういう意味か
0561デフォルトの名無しさん
2009/04/19(日) 11:28:02日本語下手ですみません。
今の処理は、CTreeViewのペインと別ペインはシーケンシャルに動作しています。
というか、CTreeViewのペインの処理とその結果表示が終わるまで、画面全体が
グレイ表示になってしまい何も操作できないようになっています。
これを「排他している」と表現しました。
今回任された対応は、CTreeViewの処理&結果表示を実行している最中でも、
他ペインの操作をできるようしたいため、「排他をかけずに」と表現しました。
対応としてCTreeViewのオブジェクトをどうにかしてスレッド化して、
非同期で処理しなければならないのでは?と推測していますが、
なにぶんMFCのスレッド化がよく理解できていません。
(AfxBeginThreadとかRUNTIME_CLASSとか使用する?)
0562デフォルトの名無しさん
2009/04/19(日) 11:38:16そういうことなら、CTreeViewのオブジェクトを別スレッドにするのではなく、CTreeViewでおこなっている処理を
別スレッド(ワーカースレッド)にすればいい。
詳細はヘルプの「マルチスレッド : ワーカー スレッドの生成」を読むといいだろう。
ヘルプがなきゃ↓を参照。(同内容)
http://msdn.microsoft.com/ja-jp/library/69644x60(VS.80).aspx
0563デフォルトの名無しさん
2009/04/19(日) 12:03:12ご指導感謝いたします。
ご提示のURL拝読いたしました。
AfxBeginThreadで、クラスのスレッドではなく、関数のワーカースレッドを
作成して、また、その関数にCTreeViewのオブジェクトを渡して処理させてみます。
なんだが、光明が差した気分です。
貴重なご意見ありがとうございました。
0564デフォルトの名無しさん
2009/04/19(日) 18:03:44別スレッドにMFCオブジェクトは渡さない方が良いです。
ハンドルで渡してスレッドの中で作成したCTreeViewオブジェクトにアタッチするか、
ハンドルを渡しといてPostMessageなどでメインスレッドに処理させて下さい。
詳しくは下記参照
http://msdn.microsoft.com/ja-jp/library/h14y172e(VS.80).aspx
0565デフォルトの名無しさん
2009/04/19(日) 22:14:03アドバイス感謝いたします。
>別スレッドにMFCオブジェクトは渡さない方が良いです。
>ハンドルで渡してスレッドの中で作成したCTreeViewオブジェクトにアタッチするか、
>ハンドルを渡しといてPostMessageなどでメインスレッドに処理させて下さい。
現在の実装は、CTreeViewをメインフレーム内に作成していますので、
後者のCTreeViewのハンドル(m_hWnd?)をワーカースレッドに渡しておいて、
そのワーカースレッド内でPostMessage/PostThreadMessageなどを使用して、
メインフレームへ処理させるようにしてみます。
ありがとうございました。
0566デフォルトの名無しさん
2009/04/23(木) 13:11:56MFCアプリケーションにて、自作でメッセージを定義し、
メッセージハンドルによる関数呼び出しを考えています。
呼び出される関数のハンドラに向けてメッセージを送信する場合で、
WPARAM, LPARAMにGlobalAlloc関数で生成したHGLOBALをキャストして送る事は
一般的にありえるんですかね?
それともタブー?
0567デフォルトの名無しさん
2009/04/23(木) 13:47:52ただ、自身にGlobalAllocして送るというのは設計的にどうだろう。
解放のタイミングを考えると、送った先でGlobalAllocすることも視野にいれるべきかと。
0569デフォルトの名無しさん
2009/04/23(木) 15:51:04MfcでC#とかにあるDataGridViewコントロールはありますか?FlexGridは使いにくくていやです。
0570デフォルトの名無しさん
2009/04/23(木) 16:05:030571デフォルトの名無しさん
2009/04/23(木) 19:35:58そう思っている奴は世界中に居るだろうから、
CodeGuruを探せば似たようなのがいくつか見つかるはず。
0572566
2009/04/23(木) 20:01:08結局、vectorコンテナを基とするHGLOBALを管理するクラスを作成し、
CWinApp系クラスのメンバとしました。
間接的にGlobalAlloc/GlobalFreeを行い、
同時にハンドルをvectorに登録したので、
最悪開放し忘れても、対処できるようにしました。
この構成で、しばらく実験してみようと思います。
ご意見、ありがとうございました。
0573デフォルトの名無しさん
2009/04/25(土) 01:43:26ActiveXのMicrosoft ImageList ControlからHIMAGELISTに登録した複数のアイコンの情報を渡したいと思っています
環境はVS2005です。どなたかご教授よろしくお願いします
尚、以下のことを試してみましたが、できませんでした
ImageList_GetImageCountでイメージの数を調べた所0となっていました
// HIMAGELISTに変換(m_imagelistはMicrosoft ImageList Controlの変数)
HIMAGELIST hImage = (HIMAGELIST)m_imagelist.get_hImageList();
// INDEXを指定してアイコンを取得
m_hIcon = ::ImageList_GetIcon(hImage, 2, ILD_TRANSPARENT);
0574573
2009/04/25(土) 01:47:35・「ActiveXコントロールを挿入」→「Microsoft ImageList Control 6.0」でコントロール追加
・16*16、24bitの適当なアイコンを3つ挿入
・「変数の追加」で変数名m_imagelistにしてラッパークラス作成
0575デフォルトの名無しさん
2009/04/25(土) 14:45:07どこに挿入したのかさっぱり判らない。
0576デフォルトの名無しさん
2009/04/25(土) 14:59:20「誰が」「なぜ」「いつ」「どこで」「何を」「どのようにして」
0577573
2009/04/25(土) 16:17:25以下のようにして挿入しています
1. デザイナ上で「ActiveXコントロールを挿入」→イメージリストコントロール追加
2. コントロールを選択→プロパティページを開→プロパティページダイアログボックスが表示
3. 「イメージ」タブを選択→「ピクチャの挿入」ボタンクリック→図の選択ファイルダイアログから画像を指定
>>576
説明不足で申し訳ありません。以下になります。
私が
ボタンコントロールに表示しているアイコンを変更するため
ボタンクリック時に
Microsoft ImageList Controlから
「ピクチャの挿入」で挿入した複数のアイコン情報を
(どのようにして)←今模索中です
ボタンコントロールに渡したい
0578デフォルトの名無しさん
2009/04/25(土) 22:48:17MFCのイメージリストじゃなくてActiveXのイメージリスト使うと何かいいことあるんだっけ?
MFCの画像つきのボタンクラスじゃなくて、そういう方法だと何か意味があるんだっけ?
0579デフォルトの名無しさん
2009/04/26(日) 00:46:12その最初のアイコンはどうやって表示したんだ?
0580デフォルトの名無しさん
2009/04/26(日) 01:23:10コードをいじらずに画像の追加やマスクの設定ができるからです
利用者の負担を減らしたいと思いまして
>MFCの画像つきのボタンクラスじゃなくて、そういう方法だと何か意味があるんだっけ?
自作のボタンコントロールにアイコンを表示する機能をつけようというのが前提なので・・
0581デフォルトの名無しさん
2009/04/26(日) 01:26:34最初のアイコンはイメージリストとは別にファイルから読み込んで表示しています
0582デフォルトの名無しさん
2009/04/26(日) 01:39:140583デフォルトの名無しさん
2009/04/26(日) 01:41:16環境によって動かないというのも困りますので
利便性は落ちますがMFCのイメージリストを使って実装することにします
ありがとうございました
0584デフォルトの名無しさん
2009/04/26(日) 07:35:54「Microsoft ImageList Control」って
MSCOMCTL.OCXに含まれているやつを指しているんだよな。
これはVB6.0用だから、VC6.0ならともかくそれ以降で使用される事は一切考慮されていない。
あくまでVB6.0の互換目的でOSに付属しているだけだから、当てにしないほうが良い。
0585おれ
2009/04/26(日) 15:14:33CDialog を継承したクラスを
Create() すると、以降の処理が重くなるってあり得る?
class CMyDialog : public CDialog
{
...
}
を、
CMyClass::func()
{
...
CMyDialog *dialog = new CMyDialog();
dialog->Create(); // *1
*1の行をコメントアウトする/しないで、処理が重いんだ。でもCPU使用率とかI/Oに差はない。
なんでだろう。。。
0586デフォルトの名無しさん
2009/04/26(日) 18:59:47*1の行をコメントアウトする/しないで、何がどう変わるか理解しているか?
0587デフォルトの名無しさん
2009/04/27(月) 00:31:38あるコントロールのウインドウハンドルが分かっていて、
それがエディットコントロールかどうかを知るにはどうしたらいいんでしょうか?
0588デフォルトの名無しさん
2009/04/27(月) 01:44:460589デフォルトの名無しさん
2009/04/27(月) 06:48:310590デフォルトの名無しさん
2009/04/27(月) 09:26:18しかもMFCじゃなくてwin32apiだが?
int GetClassName(
HWND hWnd, // handle of window
LPTSTR lpClassName, // address of buffer for class name
int nMaxCount // size of buffer, in characters
);
0591デフォルトの名無しさん
2009/04/27(月) 12:34:36ありがとうございました。うまくいきました。
0592おれ
2009/04/30(木) 20:45:06Dialogを表示する/しない
の差だと思っているが間違ってる?
表示してもイベント待ちになるだけで、処理が重くなるってことはないかと思ってたんだが。。。
0593デフォルトの名無しさん
2009/04/30(木) 21:09:25間違っている。ダイアログ(ウィンドウ)を作成する/しないの違い。
CMyDialog *dialog = new CMyDialog();
はオブジェクトを生成するだけでウィンドウは作成しない。
0594デフォルトの名無しさん
2009/04/30(木) 22:09:30OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("JPEG (*.jpg)|*.jpg|BMP (*.bmp)|*.bmp||"), this);
if (dlg.DoModal() == IDOK) {
AfxMessageBox(dlg.GetPathName());
}
というテストルーチンを実行し、
「BMP (*.bmp)」を選択した状態で拡張子を付けないで「保存」を押すと、
「bmp」の拡張子が付加されたファイルパス名が表示されます。
CFileDialogのコンストラクタをMSDNで読む限りは、
lpszDefExtに入れてある文字列「jpg」が付加されるのではと思ったのですが、
この引数はなんのためにあるのでしょうか?
もちろん、この動きのほうが、
「BMP (*.bmp)」を選択してるのに拡張子に「jpg」が付いてしまう
というような動きにならずに便利だとは思うのですが、
lpszDefExtがなんのためにあるのかわからず、
上記のような選択式の場合には何を入れておけばよいのか
わからなくなったため、質問させていただきました。
よろしくお願いいたします。
0595デフォルトの名無しさん
2009/04/30(木) 22:13:27を追加してみ
0596デフォルトの名無しさん
2009/05/01(金) 17:05:12Toolbarを編集するとき
セパレータを追加するにはどうすればいいでしょうか?
0597デフォルトの名無しさん
2009/05/01(金) 17:06:120598デフォルトの名無しさん
2009/05/01(金) 17:07:22できました!
ありがとうございます!
0599デフォルトの名無しさん
2009/05/01(金) 21:17:39「すべてのファイル (*.*)|*.*|」を選択した状態で
「保存」を押してみたところ、「jpg」が自動で付きました。
ここで使われるものだったのですか。
ということは、「*.*」を入れないときには、
lpszDefExtには何を入れても無意味ということになるのですね。
0600デフォルトの名無しさん
2009/05/01(金) 21:29:19>lpszDefExtには何を入れても無意味
そうではなく、君がフィルタでlpszDefExtとは別に「*.bmp」と「*.jpg」の拡張子を指定しているから。
フィルタを指定する場合は、lpszDefExtは NULL で足りる。
0601デフォルトの名無しさん
2009/05/02(土) 09:15:190602デフォルトの名無しさん
2009/05/02(土) 14:38:29タブAについてるボタンを押された時と同じ処理をタブCでもしたい場合は
タブCにつけたボタンで同じ処理をかかなければいけないのでしょうか?
0603デフォルトの名無しさん
2009/05/02(土) 14:51:010604デフォルトの名無しさん
2009/05/02(土) 15:01:240605デフォルトの名無しさん
2009/05/02(土) 15:13:04両方から同じ関数を呼べばいいだろ
0606デフォルトの名無しさん
2009/05/02(土) 15:36:27あふぉな質問したらどう返すんだろうなぁと思っただけでw
0607デフォルトの名無しさん
2009/05/02(土) 22:33:450608デフォルトの名無しさん
2009/05/03(日) 03:28:33END_MESSAGE_MAP()
の後ろの
urn 0;
ってどういう意味ですか?
0609デフォルトの名無しさん
2009/05/03(日) 10:54:41ウチでは見たことがない。
消し忘れた return 0; のゴミじゃないのか?
0610デフォルトの名無しさん
2009/05/03(日) 13:03:440611デフォルトの名無しさん
2009/05/03(日) 21:16:28このダイアログバーの右上にある×(閉じる)ボタンを押した時のイベントはどうやって検知すればいいのでしょうか?
WM_CLOSEやらWM_DESTROYやらWM_KILLFOCUSやらありえそうな大体のイベントに対応した
プログラムを書いてTRACE文で出力させるようにして試しましたが、
検知出来ませんでした。(最初の数回のみシステムの挙動によってイベント発生しているようですが、
その後自分で閉じたり出したり何回しても検知してません。)
ダイアログバーを×ボタンで消して再表示すると前回移動させた位置に表示してくれるってことは
非表示にしているだけなのでしょうか?
なんにせよ検知方法が分かりません。
誰か教えてくださいお願いします。
0612デフォルトの名無しさん
2009/05/03(日) 21:21:540613デフォルトの名無しさん
2009/05/03(日) 21:30:570614611
2009/05/03(日) 23:59:08すいません。初心者なものでよく分からないのですがどこのソースを見ればいいんでしょうか?
>>613
Spy++使うと、自分のPCが固まってしまってctrl+alt+delも効かなくなり、
パソコン強制リセットボタンするしかなくなることが多々あるので怖くて使ってません。
0615デフォルトの名無しさん
2009/05/04(月) 00:20:34MFCのソース。HDDにインストールされているからそれを読め。
0616デフォルトの名無しさん
2009/05/04(月) 16:01:28デスクトップPC3台では問題なく動くのに、
ノートpc(EeePC701)だと、起動時ウインドウが表示される前にエラー終了します。
エラー報告のウインドウをみると、エラー著名のmodnameにcomctrl32.dllと表示されてます。
debugビルドのプログラムだとエラーになりません。
vs2005で、OSはすべてXPproSP3です。
ノートはメモリ2GでHDDも要領あまってます。
どんなところに問題ありそうですか?
0617デフォルトの名無しさん
2009/05/04(月) 16:04:23つーかcomctrl32.dllを使わないMFCアプリではどうなの?
0618616
2009/05/04(月) 16:06:55昨日その辺でいろいろ調べたんですが、
debugビルドのexeファイルだと動きますし。
XPsp3が入っているのでそれはないかと。
0619デフォルトの名無しさん
2009/05/04(月) 16:10:380620デフォルトの名無しさん
2009/05/04(月) 16:16:05ノートPCとデスクトップPCでの相違点(ハードウェア・ソフトウェア環境双方)をピックアップしてみる。
どちらか一方にインストールされているソフトがあるとかね。
デバッグ版で動くなら、最適化なしでビルドしてみるという手もある。
0621616
2009/05/04(月) 16:21:33他の2つは動きます。
動かないプログラムも、改良途中の今はソースがないバージョンのやつは起動します。
0622デフォルトの名無しさん
2009/05/04(月) 16:40:440623616
2009/05/04(月) 16:49:19そうですよね。もっと大きくて複雑な市販のソフトは通常に動作するわけですから。
やっぱりバグってたまたま動くのって、ポインタの初期化してないとか、その他、どんなところ見るのが普通でしょうか。
0624デフォルトの名無しさん
2009/05/04(月) 17:16:43どこまで実行できたか確認しようぜ。
あとイベントビューアは当然チェックしてるんだろうな
0625デフォルトの名無しさん
2009/05/04(月) 17:17:58なら>>620の言うとおり、最適化はずしてみ。
0626616
2009/05/04(月) 17:30:20どこまで動くかコード削りながら探してます。
イベントビューアのエラー内容は、エラー報告に書いてあるのと同様でした。comctl32.dllのバージョンとエラー発生アドレス
が書いてあって、ググっても調査すすまなかったです。
ビルドの最適化設定は、動くプログラムと同じ設定なんですよ。バグをやっぱり見つけたい感じです。
0627名無し募集中。。。
2009/05/04(月) 17:38:180628デフォルトの名無しさん
2009/05/04(月) 17:42:57>やっぱりバグってたまたま動くのって、ポインタの初期化してないとか、その他、どんなところ見るのが普通でしょうか。
ポインタだけでなく変数の初期化もチェック
リストビューなら構造体も色々使ってるだろうし。
0629デフォルトの名無しさん
2009/05/04(月) 17:46:13そうじゃねーだろ、切り分けのためにやってみろって言ってるんだよ。
何でも試してみて違いから何かを得られないなら何日デバッグしても見つからんだろうよ
0630616
2009/05/04(月) 17:53:00リストビューのソートで、三角形のソートマークを上下に切り替えているんですけど、
ソートマークの部分をすべて削ったら、動きました。
コードの内容をすぐに思いだせないので、とりあえず、内容は後で検証してみます。
前バージョンのやつは、ソートマーク付いているのに、なんでエラーにならないのか、ちょっと不思議なんですが。
ソートマークの部分なんて最近は点でいじっていなかったのに・・・
0631616
2009/05/04(月) 17:53:30m_pHdrCtrl = ListCtrl.GetHeaderCtrl();
m_pHdrCtrl->SetImageList(&m_imageH);
for(int i=0;i<5;i++)
{
m_pHdrCtrl->GetItem(i, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.fmt= HDF_STRING;
m_pHdrCtrl->SetItem(i, &curItem);
}
for(int i=5;i<8;i++)
{
m_pHdrCtrl->GetItem(i, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.fmt= LVCFMT_RIGHT | HDF_STRING;
m_pHdrCtrl->SetItem(i, &curItem);
}
0632デフォルトの名無しさん
2009/05/04(月) 17:53:38if((SORT_ITEM_DATA.iSubItem)<5)
{
m_pHdrCtrl->GetItem(SORT_ITEM_DATA.iSubItem, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.iImage= SORT_ITEM_DATA.blSortFlag;
curItem.fmt= HDF_BITMAP_ON_RIGHT | HDF_IMAGE | HDF_STRING;
m_pHdrCtrl->SetItem(SORT_ITEM_DATA.iSubItem, &curItem);
}
else
{
m_pHdrCtrl->GetItem(SORT_ITEM_DATA.iSubItem, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.iImage= SORT_ITEM_DATA.blSortFlag;
curItem.fmt= LVCFMT_RIGHT | HDF_IMAGE | HDF_STRING;
m_pHdrCtrl->SetItem(SORT_ITEM_DATA.iSubItem, &curItem);
}
0633デフォルトの名無しさん
2009/05/04(月) 18:05:39細かく見てないので、ぱっと見で。
curItem はどこで宣言して、初期化はどうなってる?
あと、GetItem()する前にmaskにフラグ設定していないのは拙いんでは?
0634616
2009/05/04(月) 18:06:14int i=0;
m_pHdrCtrl->GetItem(i, &curItem);
これだけでノートPCだけエラーになります。
なんなんだ。
0635616
2009/05/04(月) 18:11:58CImageList m_imageH;//ヘッダー用
HDITEM curItem;
curItemは、リストビューのメンバ変数として、ヘッダーファイルで、上のように書いてあるだけで初期化してないです。
勉強してきます。
0636616
2009/05/04(月) 18:28:03curItem.pszText が無効値になっていたので、 = NULL;をいれたら、ノートPCでも動くようになりました。
ありがとうございました。
for(int i=0;i<5;i++)
{
curItem.pszText = NULL;
m_pHdrCtrl->GetItem(i, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.fmt= HDF_STRING;
m_pHdrCtrl->SetItem(i, &curItem);
}
for(int i=5;i<8;i++)
{
curItem.pszText = NULL;
m_pHdrCtrl->GetItem(i, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.fmt= LVCFMT_RIGHT | HDF_STRING;
m_pHdrCtrl->SetItem(i, &curItem);
}
0637616
2009/05/04(月) 22:29:51Getitemなんかせずに、変えたいところだけをmaskで選択して、setitemすればよかったんですね。
かなりいい加減なことしていたな・・・
0638デフォルトの名無しさん
2009/05/04(月) 22:39:380639デフォルトの名無しさん
2009/05/05(火) 03:58:22IsWindowでアクセス違反アサートで止まってしまいます。
マルチドキュメントのときはうまくいっていたんですが、シングルのときは違いがあるんでしょうか?他に違いがわからないんです
0640デフォルトの名無しさん
2009/05/05(火) 08:17:13SDIのことだったら当然メインフレームは存在する。
子インスンタンス〜IsWindowでアクセス違反アサートの部分は
何について語ってるのか理解不能。
0641デフォルトの名無しさん
2009/05/05(火) 10:01:44って何?
0642デフォルトの名無しさん
2009/05/05(火) 10:07:170643デフォルトの名無しさん
2009/05/05(火) 12:45:12class CMainFrame : public CFrameWndEx
{
CFileView m_wndFileView;
}
class CFileView : public CDockablePane
{
CThumbnailStatic m_ThumbnailStatic;
}
class CThumbnailStatic : public CStatic
{
void OnCreate{ASSERT(((CMainFrame*)AfxGetMainWnd())->m_wndFileView != NULL};
}
((CMainFrame*)AfxGetMainWnd())だけでもエラーになるんです。
0644デフォルトの名無しさん
2009/05/05(火) 12:55:29ならば、(CMainFrame*)AfxGetMainWnd() するとエラーになるのは当然。
なぜか?
AfxGetMainWnd() の実体がまだ存在していないからだ。
0645デフォルトの名無しさん
2009/05/05(火) 13:42:10OnCreateつながりで一通りの子が全てCreateされてからトップのMainFrameの実体ができるってことですか?
ということは、子のOnSizeとかOnPaintはMainFrameが出来る前に一度呼び出されているってことなんでしょうか?
フラグを立てて初回は実行しないようにしたんですが、同じエラーでます。MainFrameが出来上がるまでに
何回スルーしなきゃいけないんでしょうか
0646デフォルトの名無しさん
2009/05/05(火) 13:53:06なぜちゃんとしたコードを示さない? 二度手間だろーが。
>MainFrameが出来る前に
親がいないのに子が生まれるわけないだろ。
ちゃんとしたコードを示せ
0647デフォルトの名無しさん
2009/05/05(火) 14:09:50このm_ThumbnailStaticはどこでCreateしているの?
0648デフォルトの名無しさん
2009/05/05(火) 19:12:36どこがいけないのか見当もつかないので
最小コードで再現しました。
MFCのSDIウィザードのひな形に3行追加しました。
//MainFrm.h
class CMainFrame : public CFrameWndEx
{
CString path;
}
//MainFrm.cpp
CMainFrame::CMainFrame()
{
path = _T("aaaaaa");
}
void CClassView::AdjustLayout()
{
CString aaa = ((CMainFrame*)AfxGetMainWnd())->path;
}
これはIsWindowで引っかかるんじゃないんですがじゃないんですがエラーでます
CStringData* GetData() const throw()
{
return( reinterpret_cast< CStringData* >( m_pszData )-1 );
}
ここに飛んで止まります
何がいけないんですか?
0649デフォルトの名無しさん
2009/05/05(火) 19:40:030650デフォルトの名無しさん
2009/05/05(火) 20:03:27おまえの頭
0651デフォルトの名無しさん
2009/05/05(火) 20:34:56の次はmfc90ud.dllの
//cstringt.h
// Copy constructor
CStringT( const CStringT& strSrc ) :
CThisSimpleString( strSrc )
{
}
//atlsimpstr.h
CSimpleStringT( _In_ const CSimpleStringT<BaseType, !t_bMFCDLL>& strSrc )
{
CStringData* pSrcData = strSrc.GetData();
CStringData* pNewData = CloneData( pSrcData );
Attach( pNewData );
}
//atlsimpstr.h
CStringData* GetData() const throw()
{
return( reinterpret_cast< CStringData* >( m_pszData )-1 );
}
ここで最後止まるんです。これはどういうエラーですか?
mfc90ud.dllでハンドルされていない例外
0xC0000005場所0x000003f4読み込み中アクセス違反
とでます。
0652デフォルトの名無しさん
2009/05/05(火) 21:01:33どういう関係にあるのかもわからんのだよ。
0653デフォルトの名無しさん
2009/05/05(火) 21:05:040654デフォルトの名無しさん
2009/05/05(火) 21:08:250655デフォルトの名無しさん
2009/05/05(火) 21:13:310656デフォルトの名無しさん
2009/05/05(火) 21:18:15AfxGetMainWndでNULL帰ってくる可能性を考慮して作ってあるから
真似しとけば問題ない
CWnd* pMainWnd = AfxGetMainWnd();
if (pMainWnd != NULL &&
0657デフォルトの名無しさん
2009/05/05(火) 21:22:43なぜなら、CWinApp::m_pMainWnd に値が代入される前にも CClassView::AdjustLayout() が呼ばれるから。
if ( AfxGetMainWnd() != NULL) CString aaa = ((CMainFrame*)AfxGetMainWnd())->path;
とすればエラーは生じないはずだ。
0658デフォルトの名無しさん
2009/05/05(火) 21:37:31いつもフラグで初回実行回避とかやってました
勉強になりましたどうもです!
0659デフォルトの名無しさん
2009/05/05(火) 21:39:26>>638
0660デフォルトの名無しさん
2009/05/05(火) 21:44:27最初、林本で動くけど意味はわからない状態で、次に標準MFC本で大まかな流れはわかるが細かい挙動がわかるようにはなりませんでした
もっと徹底的な本はありますか?
0661デフォルトの名無しさん
2009/05/05(火) 21:48:480662デフォルトの名無しさん
2009/05/05(火) 21:52:27細かい挙動は、ソースを遡ればわかるようになる。これは冗談ではない。
0663デフォルトの名無しさん
2009/05/05(火) 22:27:020664デフォルトの名無しさん
2009/05/05(火) 22:41:23・Windows のプログラミングについての知識があること
・C++ によるプログラミングの基礎知識があること
・オブジェクト指向プログラミングの基礎を理解していること
これは http://msdn.microsoft.com/ja-jp/library/e4y1ezf5(VS.80).aspx に書いてあることなんだが、
これができてるならソース読めば内容はわかるだろ?
つまりは、MFCを勉強する前にこれを勉強しなきゃダメってことだ。
0665デフォルトの名無しさん
2009/05/06(水) 01:26:380666デフォルトの名無しさん
2009/05/06(水) 04:19:07Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\winctrl4.cpp(77):
Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\winctrl4.cpp(132):
VS2008での話だがな
0667デフォルトの名無しさん
2009/05/06(水) 16:11:24AfxEndDeferRegisterClass()の中からRegisterClass()で登録している関数は
wndcls.lpfnWndProc = DefWindowProc;
こんな風になっているんですが?
#こんな関数を登録しているのも謎なんが・・・
#DefWindowProcを登録したらWM_*をうけれなくなるんじゃないの?
0668デフォルトの名無しさん
2009/05/06(水) 16:19:17サブクラス化され、メッセージはサブクラスプロシージャによって処理されている。
だから、クラス登録時のプロシージャは DefWindowProcでもいっこうにかまわない。
MFCだけでなく、独自のクラスライブラリを作る際にもよくあるパターン。
0669デフォルトの名無しさん
2009/05/06(水) 16:41:10あれ?CreateWindowして初めてサブクラス化する時に使うHWNDが取得出来るんじゃないの?
それにCreateWindowした時に発生するWM_CREATEはなんでサブクラス化したプロシージャにくるんだろ?
0670デフォルトの名無しさん
2009/05/06(水) 19:35:200671デフォルトの名無しさん
2009/05/06(水) 19:38:060672デフォルトの名無しさん
2009/05/06(水) 20:28:25SetWindowsHookExのWH_CBTで受け取るコールバックに、
HCBT_CREATEWNDというのがある。
0673デフォルトの名無しさん
2009/05/06(水) 20:33:07これどうやればいいんでしょうか
0674デフォルトの名無しさん
2009/05/06(水) 20:48:21この元画像は、もともとCBitmapで読み込んでいるんじゃないのか?
0675デフォルトの名無しさん
2009/05/06(水) 20:48:58そのビットマップの内容は更新される。
0676デフォルトの名無しさん
2009/05/06(水) 20:53:08CBitmapを保持するだけで次にそのままDCに送れば拡縮された状態ってことですね
ありがとうございました
0677667,669
2009/05/07(木) 00:52:26なるほどね。イベントに引っ掛けるから"フック"ね。
確かに、_AfxCbtFilterHook中にウインドウプロシージャをセットするコードがあった。
勉強になった。ありがとう
0678デフォルトの名無しさん
2009/05/07(木) 02:42:21SRCCOPYの指定がおかしいんでしょうか?
0679デフォルトの名無しさん
2009/05/07(木) 03:43:450680デフォルトの名無しさん
2009/05/07(木) 04:24:40CImage.StretchBltに変えてCImageに書き込まれるように書き換えたんですがエラーがでます。
この考え方はおかしいですか?コンパイルは通るんです
あとSelectOblectの戻り値が現在のオブジェクトとなってるので違う方法も試したんですが詰まりました
これもコンパイル通るんですがAttachで止まります。元画像を縮小したサムネイルだけを画像系のインスタンスで保持しておきたいんです
CImage imgSave;
void CStaticBox::OnPaint()
{
if(imgSave.IsNull){
CPaintDC dc(this);
CDC m_memDCMain;
CBitmap m_bmpMain;
m_memDCMain.CreateCompatibleDC(&dc);
m_bmpMain.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
m_memDCMain.SelectObject(&m_bmpMain);
m_memDCMain.SetStretchBltMode(HALFTONE);
CDC myDC;
myDC.CreateCompatibleDC( &m_memDCMain );
CImage img;
img.Load(activeFullPath + fileName);
myDC.SelectObject( img );
m_memDCMain.StretchBlt( left+10, top+10, width-20, height-20, &myDC, 0, 0, img.GetWidth(), img.GetHeight(), SRCCOPY );
HBITMAP* imgBMP = ( HBITMAP* )m_memDCMain.SelectObject( CImage() );
imgSave.Attach( *imgBMP );
}
}
0681デフォルトの名無しさん
2009/05/07(木) 05:57:29bmpMainを外に書くだけでした
0682デフォルトの名無しさん
2009/05/07(木) 13:15:18オブジェクト指向プログラミングするなら、グローバル変数はあまり使わないほうがいい。
0683611
2009/05/07(木) 22:28:50このスレが真っ先に出てくるので後続の人の為に残しときます。
×ボタンを押すとダイアログバーでWM_WINDOWPOSCHANGINGイベントが発生し、
void ダイアログバーのクラス::OnWindowPosChanging(WINDOWPOS* lpwndpos)
の追加した関数に渡される変数を判定し
if(lpwndpos->flags & SWP_HIDEWINDOW)
{
この部分に閉じるボタン押下時処理を書きます。
}
これはShowControlBarをフレームウィンドウで使用して閉じた時にも発生しますが、
アプリケーション終了時は発生しません。
>>612
>>613
親切丁寧なアドバイスありがとうございました!!
0684デフォルトの名無しさん
2009/05/07(木) 23:52:42C++ならこう書くのか〜って辞書引きながらやれば、一挙に2つ覚えちゃうよね。ついでにC++も余分なページよんだりしながらさ。
0685デフォルトの名無しさん
2009/05/08(金) 00:27:54俺がMFC始めた頃なんて、Javaは生首が回り始めた頃だったからな。
0686デフォルトの名無しさん
2009/05/08(金) 05:33:39folderImg.LoadFromResource(AfxGetInstanceHandle(), _T("folder.png"));
これ実行したらExpression:hBitmap != 0;
とかいうエラーが出ました
リソースファイルに.pngファイル入れるだけじゃだめなんですか?
0687デフォルトの名無しさん
2009/05/08(金) 07:43:08そもそも本当に"folder.png"というリソースIDなのか?
CImage::LoadFromResourceは::LoadImageを呼び出すので、
結局PNG画像の読み出しには対応できないのだけどね。
IStream経由で読み込ませるようにお膳立てしてやる必要がある。
あと、リソースハンドルの取得用にAfxGetResourceHandleというのがある。
0688デフォルトの名無しさん
2009/05/08(金) 13:16:33あたりでググれば、いくらでもでてくるだろーに。
0689デフォルトの名無しさん
2009/05/10(日) 06:19:55CImage img;
img.LoadFromResource(GetModuleHandle(NULL), IDB_PNG1);
GetModuleHandle(NULL)でも
AfxGetApp()->m_hInstanceでも
AfxGetInstanceHandle()でも
AfxGetResourceHandle()でも
この行でエラーになります
どいういうことですか?
IDB_PNG1はリソースビューでPNGフォルダの中に入ってるんです
ソリューションエクスプローラの中のリソースファイルフォルダの中にもfolder.pngが入ってます
0690デフォルトの名無しさん
2009/05/10(日) 07:22:14687をもう一度よく読みなおせ。
0691デフォルトの名無しさん
2009/05/10(日) 12:35:32VSのバージョンとかOSとかは何なん?
0692デフォルトの名無しさん
2009/05/10(日) 12:58:310693デフォルトの名無しさん
2009/05/10(日) 15:04:561. FindResource関数でリソースハンドルを取得
2. SizeofResource関数でサイズを取得
3. LoadResource関数でリソースを読み出しLockResource関数でをロック
4. GlobalAlloc関数でメモリを確保
5. GlobalLock関数でメモリをロック
6. CopyMemory関数でリソースを確保したメモリにコピー
7. CreateStreamOnHGlobal関数でストリームを作成
8. Bitmap(またはImageクラス)のFromStreamメソッドでBitmapオブジェクトを作成
0694デフォルトの名無しさん
2009/05/10(日) 15:08:560695デフォルトの名無しさん
2009/05/11(月) 00:24:260696デフォルトの名無しさん
2009/05/11(月) 10:05:03;' ':;,.,.,.,.,.,,,;' ';,
,:' : :、
,:' / ,,. 、.\ ノ( ::::::::',
:' ∩ ∩ ⌒ :::::i.
i ''' (_人_) '''' * :::::i
: {+ + +} :::::i
`:,、  ̄ ̄ ::::::::: /
,:' : ::::::::::::`:、
,:' : : ::::::::::`:、
0697デフォルトの名無しさん
2009/05/14(木) 22:34:350698デフォルトの名無しさん
2009/05/15(金) 00:44:51Document/Viewでもイヤな感じなのに、
ダイアログクラス上で全部やってるソースとか見ると発狂しそうになる。
0699デフォルトの名無しさん
2009/05/15(金) 01:32:52それはあれか、FireWireはよくてi-Linkはイヤとかいう類か?
ともかく最後の一行だけは共感できる。 MFCあんま関係ないけど。
0700デフォルトの名無しさん
2009/05/15(金) 12:43:27Control と View を分離しる!という御意見なんじゃね?
知らんけど。
0701デフォルトの名無しさん
2009/05/15(金) 13:26:26M-C-V1
|-V2
|-V3
[Document/Viewの場合]
M--VC1
|-VC2
|-VC3
Controllerの処理は、Viewがちゃんと抽象化されていれば一つにまとめることができるはずなのに、
Document/Viewの場合は同じようなControllerの処理をViewごとに重複して書くので無駄。
0702名無し募集中。。。
2009/05/15(金) 17:06:32抽象化したViewを作って派生させれば良いんじゃないの
0703デフォルトの名無しさん
2009/05/15(金) 18:37:47環境はVC++.NETです。
ダイアログ上に配置したピクチャーボックスの中でLBUTTONDOWNを検知した時に、
setCaptureして、カーソルをドラッグすることで別ウィンドウの内容を変化させ、
LBUTTONUPを検知したときにReleaseCaptureするプログラムを作ろうとしているのですが、
イベントハンドラを追加しようとしてもピクチャーボックスにはマウスクリックイベントしか追加できません。
ピクチャーボックス内のマウスダウンイベントを検知するのは不可能なのでしょうか?
可能であれば出来るだけそれを使いたいと思ってますが不可能であれば、ダイアログにたいするマウスダウンイベントを
検知して、マウス座標をGetMessagePosやScreenToClientなどを使って、該当ピクチャーボックス範囲内かどうかを
判定して代用するしかないのでしょうか?
よろしくお願いします。
0704デフォルトの名無しさん
2009/05/15(金) 18:48:200705デフォルトの名無しさん
2009/05/15(金) 20:33:44特定の種類のクラスまたはウィンドウだけに適用されるメッセージを指定するためのフィルタを変更できます。
でできなかったっけ?
0706703
2009/05/15(金) 20:48:30リソースエディタから該当ダイアログ(厳密にはダイアログバー)上のピクチャーボックスのプロパティを開き、
表示カテゴリの「Notify」をTrueに設定しましたが状況は変わりません。
これとは別物でしょうか?
該当ダイアログを生成しているCreate文にSS_NOTIFY スタイルを付けて見ましたが、
やはりイベントハンドラの追加で指定できるメッセージは
STN_CLICKED
STN_DBLCLK
STN_ENABLE
STN_DISABLE
NM_THEMECHANGED
のみです。
0707デフォルトの名無しさん
2009/05/15(金) 20:55:40CStaticの派生にして、そこにマウスイベントのメッセージハンドラを追加すれば?
0708703
2009/05/15(金) 21:11:35いまいちCstaticの派生にするという意味が分からないのですが、
ダイアログ上のピクチャーボックスのみの為に新たにクラス作成するという事でしょうか?
その場合、新たに作ったクラスはそのままでは機能しないかと思いますが、
(サブダイアログクラスであれば、Createメソッドで実体を作りますが、コントロールのクラスは良く分かりません)
上記認識が正しいのであれば、簡単な説明のあるURLか検索キーワードを教えていただけないでしょうか?
0709デフォルトの名無しさん
2009/05/15(金) 21:24:512. リソースエディタで、当該ピクチャーボックスを「CMyStatic」のメンバ変数として追加する。
0710デフォルトの名無しさん
2009/05/15(金) 21:27:26>「CMyStatic」のメンバ変数として追加する。
「CMyStatic」型のメンバ変数として追加する。
0711デフォルトの名無しさん
2009/05/15(金) 21:41:16と俺も思ったのだが、VS2008だと派生クラスが選択肢に出なかった。
とりあえずCStaticで追加しておいて、
クラス名だけ派生クラスのものに直接書き換えておけばOKだと思う。
0712デフォルトの名無しさん
2009/05/15(金) 21:45:05選択肢はでないけど、「変数の種類(V)」のコンボボックスに直接書き込めるだろ。
このコントロールはドロップダウンコンボであって、ドロップダウンリストじゃないんだから。
0713703
2009/05/15(金) 21:58:11ピクチャーボックスをDDX変数にするということでしょうか?
0714デフォルトの名無しさん
2009/05/15(金) 22:03:20念のため言っておくが、そのピクチャーボックスのIDは、もちろん IDC_STATIC 以外だろうな。
0715703
2009/05/15(金) 22:08:44IDは一応全部オリジナルに設定しています。
まだプログラム歴浅くて、DDX変数などを使い慣れてません。
(リソースエディタで右クリックから変数追加してもコントロール変数とか
チェック出来なくなってる・・・)
とりあえず色々あがいて見ます。
ありがとうございました。
0716703
2009/05/15(金) 23:40:59CRect myrec;
this->GetDlgItem(IDC_PICT_1)->GetWindowRect(myrec);
ScreenToClient(myrec);
後はpoint.x point.yがmyrec.left right top bottomの中に所属するか判断して
コード記述することにしました。
0717デフォルトの名無しさん
2009/05/15(金) 23:45:03myrec.PtInRect( point);
0718703
2009/05/15(金) 23:49:37これでいけた。
0719703
2009/05/20(水) 20:57:53もう一歩ごとに躓いてます。
ダイアログバー(ツールバー)でのドラッグなどのアクションを検知して、
ビュークラスでの表示内容をリアルタイムに変化させたいのですが、
ダイアログバーからビュークラスの関数を起動する方法が分かりません。
・最初に考えた案
ダイアログバークラスにメンバとしてビュークラスオブジェクトのポインタを持たせる。
↓
コンパイル時にヘッダファイルなどが循環参照してしまう。色々調べて見ても、
仮に無理やりやれたとしても、あまりプログラムとして美しくない作りなんではないか?
・次に考えた案
どうしても無理だったらsendmessageみたいなものを調べて使って、メッセージをやりとりする
プログラムにすべきなのか?
↓
なんとなく、有り得ないんじゃないかと却下。
・現在の最終有力候補
よく見たらアプリケーションクラスの変数参照できてる(theApp)。
アプリケーションクラスで関数作ってダイアログバーからアクションしてビューに反映したい場合は、
アプリケーションクラスを中継すればいいのではないか?
↓
これが、MFCのプログラミングにおいて正しい方法、定石的な方法なのかアドバイスお願いします。
0720デフォルトの名無しさん
2009/05/20(水) 21:24:12記述法がまずいんだと思う。
>メッセージをやりとりする
ダイアログバーとビューで直接メッセージをやりとりするなら、
どちらかのポインタがどちらかに必要になる。つまり、「最初に考えた案」に戻ることになる。
>現在の最終有力候補
最も簡単ではあるが、バーの挙動をCWinAppクラスが知っている必要はない。
中継方法でやるとすれば、バーとビュー双方のポインタを取得できるフレームウィンドウクラスあたりか。
僕なら最初の案でやるか、フレームウィンドウを中継するか、かな。
0721デフォルトの名無しさん
2009/05/20(水) 23:26:190722703
2009/05/20(水) 23:28:04すばやい回答ありがとうございます。
たしかにAppクラスが行うべき処理というよりはフレームウィンドウクラスがやるべきかと思います。
また、Viewクラスのポインタを持つのはオブジェクト志向なプログラムという点では好ましくないかとも思いました。
で、問題はダイアログバーからフレームウィンドウクラスのメンバ関数を実行する手段で、
フレームウィンドウクラスのヘッダファイルをダイアログバーのクラスでインクルードすると色々エラーがでてコンパイルできず、
かといってフレームウィンドウクラスをインクルードしなければメンバ関数なんて実行出来ない・・・。
関数ポインタを使うのか・・とか言う以前に、Viewクラスのポインタ持つのとやってることが同じ・・・。
やはり諦めてアプリケーションクラスにViewコントロール用の新規オブジェクトを持たせるほうがよいか・・・。
いやそれならフレームウィンドウクラスに持たせるべきか・・。
足掻いて試行錯誤してみます。
0723703
2009/05/20(水) 23:33:25ググって見てもツールバーは大抵イベントハンドラを追加して、
フレームウィンドウでクリックイベントを受けているのですが、
自分の場合マウスムーブイベントを取りたいのにそれの追加方法が調べてもイマイチ分かりませんでした。
ためしにフレームウィンドウにマウスムーブメッセージ取得する内容を入れてみてもどうも検知してる様子が無い。
マウスムーブはビュークラスかサブダイアログクラスじゃないと取れないんじゃないかと自分は勝手に結論付けています。
0724デフォルトの名無しさん
2009/05/20(水) 23:37:28CFrameWnd* pFrame = (CFrameWnd*)AfxGetMainWnd(); // フレームウィンドウオブジェクトのポインタを取得
CMyView* pView = (CMyView*)pFrame->GetActiveView(); // ビューオブジェクトのポインタを取得
>フレームウィンドウクラスのヘッダファイルをダイアログバーのクラスでインクルードすると色々エラーがでてコンパイルできず、
ヘッダにインクルードする必要は生じない。やはり記述法がおかしい。
0725703
2009/05/20(水) 23:53:01記載の方法であっさりいけました。
ただ自分がダイアログバーのクラスのヘッダにインクルードするのにこだわってたのは、
一度取得したポインタを一度読んだ後はずっと保持したかったからですが、
マウスムーブイベントだと瞬間的に無数にポインタの設定と破棄が何千何万と繰り返される事になると思いますが、
心配するほど影響は無いのでしょうか?
0726デフォルトの名無しさん
2009/05/21(木) 00:18:37保持するのは「ポインタ」なんだから、ヘッダにインクルードする必要はないんだ。
クラスの前方宣言、あるいは先送り宣言と呼ばれるものについて一度調べてみ。
0727703
2009/05/21(木) 00:22:33ありがとうございました。
0729名無し募集中。。。
2009/05/21(木) 00:27:33クラス内にhoge *m_pHogeというメンバ変数を記述するのはエラーにならない
cppのほうでclass hogeのヘッダをインクルードして、m_pHogeを使えばいい
0730デフォルトの名無しさん
2009/05/21(木) 00:39:07なるべく使わない方法を心がけるほうがいいぞ
0731デフォルトの名無しさん
2009/05/21(木) 00:43:160732デフォルトの名無しさん
2009/05/21(木) 06:24:13この継承して作っていく方式がどうしてもポインタ保持をしなければいけない仕組みにしてしまう
そうでなかったらなかなかやらないんだけどね
0733デフォルトの名無しさん
2009/05/21(木) 21:45:43>ポインタの保持はプログラム設計的には大罪だから
お前は何を言っているんだ
0734デフォルトの名無しさん
2009/05/21(木) 22:43:43インスタンス消えても気づかないで爆死確定だぜ
保持はしないで引数で渡すのが正しいプログラム
0735デフォルトの名無しさん
2009/05/21(木) 22:46:39それはプログラマの個人的な大罪
0736デフォルトの名無しさん
2009/05/22(金) 06:29:33でもこれスマートポインタとか使って逃げると今度は構造的な不具合が酷い
死なないだけで値やステータスが知らずに変わってることで起きる不具合に
悩まされる
俺的結論としては保持しないのが一番
0737デフォルトの名無しさん
2009/05/22(金) 06:30:29もう保持しまくり
0738デフォルトの名無しさん
2009/05/22(金) 11:01:57>でもこれスマートポインタとか使って逃げると
逃げるなよ。立ち向かえよ。
>俺的結論としては
ヘタレめ。
0739デフォルトの名無しさん
2009/05/22(金) 13:28:52それはおまえの頭の欠陥だよ。
どんな仕様で実装しようが、問題なく組むのがプログラマの仕事だ。
結論として、おまえにはポインタさえ使いこなせないということだ w
0740デフォルトの名無しさん
2009/05/22(金) 17:18:550741デフォルトの名無しさん
2009/05/22(金) 17:29:530742デフォルトの名無しさん
2009/05/22(金) 20:50:44スマポ使っても落ちないだけ
知らない間に値が変わってるバグは放置状態になる
0743デフォルトの名無しさん
2009/05/22(金) 21:20:31って結構前に誰か書いていた記憶がある。
.NET出た頃か、もしかするとそれより前かもしれない。
0744デフォルトの名無しさん
2009/05/26(火) 08:26:420745デフォルトの名無しさん
2009/05/29(金) 04:30:21・・・ やべぇ この人 コナンみたいな推理力だ・・・ 世の中には、こんな鉄人がおるのか!!!
0746デフォルトの名無しさん
2009/06/01(月) 20:46:06スマートポインタ使ったところで結局参照数の管理しなきゃいけないからな
通常のポインタ使いこなせずリーク起こすような奴は
スマートポインタでも問題起こすだろ
>>743
そんな基本はねえよ
どう考えてもケースバイケースだ
0747デフォルトの名無しさん
2009/06/02(火) 03:02:47「参照数の管理しなきゃいけない」って意味がよく分からないのだけど。
0748デフォルトの名無しさん
2009/06/02(火) 07:22:350749デフォルトの名無しさん
2009/06/02(火) 12:11:34そいつは真性のヴァカだ。スマポ自体理解してないと思われ。ほっとけ。
そもそも、気にくわないなら、スマポを自分で実装するなんて発想もないに違いない。
0750747
2009/06/02(火) 16:04:33いまの話って、そういうスマートポインタを使用する側の話じゃないの?
>>749が言ってるのはよく意味が分からん。普通は自分で実装しないだろ。
0751デフォルトの名無しさん
2009/06/02(火) 16:16:37自分で実装した場合どんなふうにするか、を考えるのも内部を理解する一つの手だと思うけどね。
0752デフォルトの名無しさん
2009/06/02(火) 16:18:46まあ、俺もshared_ptrの中身を覗いてみたことはあるよ。自分で完璧に作るのは大変そうだなとは思ったが。
0753デフォルトの名無しさん
2009/06/02(火) 18:51:51参照数を管理する、・・・とは言わんか
0754デフォルトの名無しさん
2009/06/02(火) 19:00:090756デフォルトの名無しさん
2009/06/06(土) 17:18:510757デフォルトの名無しさん
2009/06/09(火) 21:28:46CTreeCtrlを継承して自作のチェックボックス付きツリーを作成しようとしています。
特定アイテムのみにチェックボックスを付けたいのですが、スタイルを指定するとすべてのアイテムに対して
チェックボックスが付きます。
1階層目はチェックボックスなし、2階層目は有りなど、個別にチェックボックスを付けることは可能でしょうか?
0758デフォルトの名無しさん
2009/06/09(火) 21:32:240759757
2009/06/09(火) 21:47:30返信ありがとうございます。
自分でチェックボックスのイメージを作成して、アイテムに付けるということですよね。
すべての階層のアイテムにチェックボックスとは別にイメージをつける必要があります。
2個のイメージを並べて表示させることは可能ですか?
イメージとしては、エクスプローラー風のディレクトリツリー(絵付き)で特定アイテムのみにチェックボックスを付ける
ことをやりたいと思っています。
0760デフォルトの名無しさん
2009/06/10(水) 18:37:540761デフォルトの名無しさん
2009/06/10(水) 18:51:030762デフォルトの名無しさん
2009/06/11(木) 12:06:54ダイアログアプリで、タブコントロールを使ってます。
なので、タブ指定時に子ダイアログの作成、操作を行います。
子ダイアログの操作(ボタン選択)をした時に、 親のダイアログのオブジェクト操作
(例えば、親ダイアログのボタンのグレーアウトなど)を行うときは、
1,子から親のウィンド(GetParent())を取得して、直接操作を行う。
2,子から親にSendMessege()でメッセージを送り、親側で操作を行う。
1,2のどちらが定石なのでしょうか? それともどちらでも問題ないとか?
0763デフォルトの名無しさん
2009/06/11(木) 12:37:19手間を省こうとすれば、子ダイアログオブジェクトの作成時に親ダイアログのthisポインタを渡すので、
GetParent() せずに、それをそのまま使うかな。
0764デフォルトの名無しさん
2009/06/11(木) 16:29:52以前、先輩から、子ダイアログから親を操作するのは、あまり良くないという
話を聞いたので、一般的な定石はどちらなのかな??と思い質問しました。
0765デフォルトの名無しさん
2009/06/11(木) 16:48:32ダイアログのボタンをグレーアウトしたいと思ったら
グレーアウトする処理をどこに書くか考えればわかるだろ
0766デフォルトの名無しさん
2009/06/11(木) 18:33:480767デフォルトの名無しさん
2009/06/11(木) 18:53:35「子ダイアログの操作(ボタン選択)をした時に」とあるので、その関数のトリガーを引くのは子ダイアログ。
0768デフォルトの名無しさん
2009/06/11(木) 19:11:08クラスの巨大化とSRP違反を避けるために
分けるのは普通だろ
Oberverパターンで子からの呼び出し受けとるのが最も標準的だな
0769762
2009/06/11(木) 19:16:47>>766, 767
タブコントロールを使用した場合、
タブの切り替えを、現状のダイアログの上に子ダイアログ(枠なし)を新たに作成して、
表示、非表示で切り替えています。 ↓これを参考に作成しました。
ttp://www.g-ishihara.com/mfc_ta_01.htm
例えば、タブ内のダイアログ(子) の"実行"ボタンを押した場合、
親ダイアログの一部のオブジェクト(ボタンやエデットボックスなど)を使用不可にしたいと思っています。
767さんの言われるとおりなら、親のボタンは親の関数で実行する。
子から親の関数を直接的に呼ぶのではなく、メッセージを送信して間接的に処理依頼をする方法の方が
良いとのことですよね?
0770名無し募集中。。。
2009/06/11(木) 19:44:34メッセージが適切な場合もあるが、煩雑になって見難いソースになるほうがイヤだが
親のボタンのグレーアウトまで子ダイアログクラスに記述するのは美しくない、かな。
0771767
2009/06/11(木) 20:59:31>良いとのことですよね?
パブリックな親オブジェクトの関数を子オブジェクトから呼ぶ、という意味。>>770氏の書いてるのと同じだね。
メッセージ送信は「ウィンドウ」に対しておこなうわけだから、今回のようにオブジェクトを確定的に取得できる
場合は迂遠な方法になってしまうよな。
0772デフォルトの名無しさん
2009/06/13(土) 07:16:10例えばチェックボックスが3つなら、8パターンあり、返す値としては8個になります。4つなら、16個です。
こういう関数を実現するにあたり便利な関数などあれば教えていただければ幸いです。
0773デフォルトの名無しさん
2009/06/13(土) 08:48:08ということで以下終了
0774デフォルトの名無しさん
2009/06/13(土) 16:08:570775デフォルトの名無しさん
2009/06/14(日) 02:16:01わざわざ返り値でやる意味あんのかね?
まぁ、俺の感知するところではないから、>>773が正しいでやっぱ終了だな。
0776デフォルトの名無しさん
2009/06/14(日) 03:37:310777名無し募集中。。。
2009/06/14(日) 13:12:20value = ( m_Check1 ? 1 : 0 ) + ( m_Check2 ? 2 : 0 ) + ( m_Check3 ? 4 : 0 ) ;
0778デフォルトの名無しさん
2009/06/14(日) 13:16:320779デフォルトの名無しさん
2009/06/14(日) 20:21:16普通過ぎて、そういう「便利な関数」があるかと言われれば無い
て事でしょ
0780デフォルトの名無しさん
2009/06/16(火) 12:11:16CArray , vector(STL) , その他 どれを使うのが普通ですか?
特にシリアル化は必要ないです。
0781デフォルトの名無しさん
2009/06/16(火) 12:24:39用途に応じて使い分ければいいだけ。
0782デフォルトの名無しさん
2009/06/16(火) 12:26:11それが分からんなら、動くことを優先して、どれでもいいから使え。
あと、くだらん質問しに来るな、ドアホゥ
0783デフォルトの名無しさん
2009/06/16(火) 12:47:120784デフォルトの名無しさん
2009/06/16(火) 13:30:11何を使うのか教えてもらえなきゃ組めないなら、設計通りに組むただのオペレーター。
おまえ、プログラマには向いてないよ>>780
0785デフォルトの名無しさん
2009/06/16(火) 22:34:230786デフォルトの名無しさん
2009/06/17(水) 01:25:18このダイアログにClass Nameを設定したいのですが、グレーアウトしていて出来ません。
どうすればよいのでしょうか?
ヒントだけでも下さい。お願いします。
0787デフォルトの名無しさん
2009/06/17(水) 07:11:49http://support.microsoft.com/kb/251059/en-us
探せば案外簡単に見つかるものだね。
0788デフォルトの名無しさん
2009/06/22(月) 22:02:290789デフォルトの名無しさん
2009/06/23(火) 18:33:02if( (CMainFrame*)AfxGetMainWnd() != NULL )
をしてもずっとTRUEにならないんですが、どうすればメインフレームを取得できるんですか?
0790デフォルトの名無しさん
2009/06/23(火) 18:54:200791デフォルトの名無しさん
2009/06/23(火) 19:05:220792デフォルトの名無しさん
2009/06/23(火) 19:32:53・・・orz
0793デフォルトの名無しさん
2009/06/24(水) 18:35:38別のダイアログクラスからnewしたCClientDCを使用し
表示などを行っても問題はないのでしょうか?
教えてください。
0794デフォルトの名無しさん
2009/06/24(水) 18:47:36それぞれのデバイスコンテキストがどのウィンドウのものであるか、把握できているのかね?
0795793
2009/06/24(水) 19:02:32別のダイアログクラスで使用しても正しく表示できているので
問題がないのならば使用したいと思っています。
0796デフォルトの名無しさん
2009/06/24(水) 19:08:10そこがおおいに問題。
0797793
2009/06/24(水) 19:10:460798デフォルトの名無しさん
2009/06/24(水) 19:19:450799793
2009/06/24(水) 19:50:080800名無し募集中。。。
2009/06/24(水) 20:55:27人のものに対して勝手にアクセスするのはよろしくない。
人からいじられる事を想定した切り口(関数とか)を用意してあげるとか、方法はいくつかある。
0801デフォルトの名無しさん
2009/06/25(木) 01:19:18こういう考え方だと、いつまでたってもスパゲティ的なプログラムしか組めなくなるから注意されたし。
0802デフォルトの名無しさん
2009/06/26(金) 09:28:05フェットチーネにすると、クリーム系じゃないソースは絡み難くなるよ。
0803デフォルトの名無しさん
2009/06/26(金) 12:53:56ダイアログを終了するところで落ちます。
以下の、コードはダメなのでしょうか?
OnInitDialog()時にワークスレッドを作成して、そこでダイアログの描写処理、
処理後にスレッド側でOnOk()などでダイアログを終了します。
//簡単な例(大分省いています・・)
class CTestDlg : public CDialog {
public:
virtual BOOL OnInitDialog(){
//初期化時にワークスレッド作成
AfxBeginThread( CTestDlg::BeginTread, this );
}
//ワークスレッド
bool TreadFunc() {
//ここでダイアログの描写処理()
//例えば30秒間タイマーを表示するなど・・
//ダイアログを閉じる
OnOk(); //<-うまくモーダル・ダイアログを閉じることができない・・・・
}
static UINT AFX_CDECL BeginTread(LPVOID pParam) {
CTestDlg* pObj = (CTestDlg*)pParam;
pObj->TreadFunc();
}
};
//呼び側
CTestDlg cDlg;
cDlg.DoModal
0804デフォルトの名無しさん
2009/06/26(金) 12:59:58・なぜ別スレッドにしているの?
・なぜOnInitDialog()内で処理しようとするの?
・何もせず、単に数秒後に閉じるだけのダイアログをサンプルとして作ってみた?
0805デフォルトの名無しさん
2009/06/26(金) 13:35:090806デフォルトの名無しさん
2009/06/26(金) 13:47:32趣味のプログラミングなら勝手にしてくれ。
0807名無し募集中。。。
2009/06/26(金) 14:04:410808デフォルトの名無しさん
2009/06/26(金) 14:35:45それはメインスレッドで閉じないとだめだ。
ダイアログが表示されたぞ→メインスレッドでワーカーの終了を待つ→メインスレッドでOnOK()
ところで、「ダイアログが表示された」って、いつわかるんだっけ・・・
CWinThread* thread;
BOOL CTestDlg::OnInitDialog() {
thread = AfxBeginThread(.・・・);
}
void CTestDlg::ダイアログが表示されたあとにメインスレッドで実行される何か()
{
//スレッドの終了までブロック
::WaitForSingleObject(thread->m_hThread, INFINITE);
//ダイアログを閉じる
OnOK();
}
0809803
2009/06/26(金) 14:35:50>・なぜ別スレッドにしているの?
>・何もせず、単に数秒後に閉じるだけのダイアログをサンプルとして作ってみた?
本当は、数秒かかる処理(複数回)を確認するために、プログレスバーを使用して
状態確認を行い、処理終了後に自動でダイアログが閉じることが目的です。
ダイアログクラスに処理を埋め込むのも微妙だと思いますが・・
>・なぜOnInitDialog()内で処理しようとするの?
DoDoModal()時に確実に呼ばれるみたいなので、とりあえずここに入れてみました。
他に適切なイベントハンドラがありますか?
一応、趣味で作成しています。MFCは初心者です。
>>807
WM_CLOSEでうまくダイアログが閉じましたありがとうございます
0810デフォルトの名無しさん
2009/06/26(金) 14:46:31処理のみを別スレッドとし、処理が終了したらダイアログに「終わったよ」と教えてやる。
それを受けて、ダイアログは自身で閉じるようにする。
別スレッドでダイアログを閉じてはダメ。
0811デフォルトの名無しさん
2009/06/26(金) 14:49:33途中経過のプログレスバー表示もPostMessageを使ったほうがいいよ。
ワーカースレッドから進行状況をWindowにPostMessageして、
メインスレッドでは、ポストされた進行状況に従ってプログレスバーを更新するようにする。
ワーカースレッドでプログレスバーを更新するとはまるよ。
0812デフォルトの名無しさん
2009/06/26(金) 20:16:21ワーカースレッドはメインスレッドがメッセージを処理してくれない為に
SendMessageから帰って来れなくてデッドロックとか、良くあるパターン。
0813デフォルトの名無しさん
2009/06/26(金) 20:25:550814デフォルトの名無しさん
2009/06/26(金) 20:41:26これを称して自業自得という。
0815デフォルトの名無しさん
2009/06/26(金) 22:54:44ダイアログを閉じる以外の操作でも必ずといっていいほど何らかの不具合がおきる
0816名無し募集中。。。
2009/06/27(土) 00:52:590817デフォルトの名無しさん
2009/06/28(日) 00:37:190818デフォルトの名無しさん
2009/06/28(日) 00:39:38そうすれば自ずと分かる
0819デフォルトの名無しさん
2009/06/29(月) 03:05:480820デフォルトの名無しさん
2009/06/29(月) 15:26:540821デフォルトの名無しさん
2009/06/30(火) 23:03:34CString$ sz
ってやる人いるけど
CString* sz
じゃだめなの?
0822デフォルトの名無しさん
2009/06/30(火) 23:07:04でした
0823デフォルトの名無しさん
2009/06/30(火) 23:14:58ケースバイケース。単純に LPCTSTR として渡す場合もある。
0824デフォルトの名無しさん
2009/06/30(火) 23:23:510825デフォルトの名無しさん
2009/06/30(火) 23:38:38リソースキットについてるサービス化ツールを使えばいいのかな?
0826デフォルトの名無しさん
2009/07/01(水) 00:26:35まずやってみろ、屑
0827デフォルトの名無しさん
2009/07/01(水) 07:22:47ポインタ渡し → 受け取った関数でnullチェックが必要
参照渡し → nullはこない
0828デフォルトの名無しさん
2009/07/01(水) 10:00:49void Hoge(CString& rStr)
{
if (&rStr == NULL) {
TRACE("NULL\n");
}
else {
TRACE("%s\n", rStr);
}
}
CString* pStr = NULL;
Hoge(*pStr);
0829デフォルトの名無しさん
2009/07/01(水) 10:17:12NULLをデリファレンスしようとした時点で花から悪魔。
0830デフォルトの名無しさん
2009/07/01(水) 10:53:050831デフォルトの名無しさん
2009/07/01(水) 18:41:43&でアドレスとってNULLチェックなんて
誰もしないよね
0832デフォルトの名無しさん
2009/07/01(水) 21:11:05代わりに何がくるの?
0833デフォルトの名無しさん
2009/07/01(水) 22:06:370834デフォルトの名無しさん
2009/07/01(水) 22:18:10かまって欲しいだけだろ。
スルー推奨。
0835デフォルトの名無しさん
2009/07/01(水) 22:27:00いちいちgetbufferしなくていいから便利だよな
CWnd::GetWindowText
int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;
void GetWindowText( CString& rString ) const;
0836デフォルトの名無しさん
2009/07/01(水) 22:39:31CStringが参照カウント管理されていなかった時代の名残かな。
0837デフォルトの名無しさん
2009/07/01(水) 22:55:190838デフォルトの名無しさん
2009/07/01(水) 23:32:33いや、nullの場合だってあるじゃん
unko=NULL;
hoge(unko);
こんなん?
0839デフォルトの名無しさん
2009/07/01(水) 23:39:10お前はそもそもを間違えてる
0840デフォルトの名無しさん
2009/07/01(水) 23:45:16さらっと説明してくれマジで
0841デフォルトの名無しさん
2009/07/01(水) 23:57:04おまえの書きたいのはこうだろ
Foo* unko=NULL;
hoge(*unko);
>>838じゃポインタ渡しだ
全然会話の流れに乗れてない
0842デフォルトの名無しさん
2009/07/02(木) 00:17:22それで渡すと中身には何がくるわけ?
0843デフォルトの名無しさん
2009/07/02(木) 00:25:54void GetWindowText( CString* rString )
違いわからん
0844デフォルトの名無しさん
2009/07/02(木) 00:39:230アドレスへの参照
0845デフォルトの名無しさん
2009/07/02(木) 00:56:58// GetWindowText( CString* rString ) の悪例
int n;
CString* p = (CString*)&n;
GetWindowText( p); // コンパイルエラーにならない
0846デフォルトの名無しさん
2009/07/02(木) 01:03:30結局、チェック必要になるんと違うのん?
0847デフォルトの名無しさん
2009/07/02(木) 01:22:350848デフォルトの名無しさん
2009/07/02(木) 07:40:54チェックが必要なのは
*演算子をやる前
0849デフォルトの名無しさん
2009/07/02(木) 07:46:01Foo* unko=NULL;
hoge(*unko);
というコードは、hogeとは無関係に、このコード自体が不正。
なので「これで正しく動くかどうか」等は、hoge関数が責任を持つことではない。
0850849
2009/07/02(木) 07:46:51ずっと同じ話題だったのか。
0851デフォルトの名無しさん
2009/07/02(木) 09:32:34NULLで初期化した実体を渡してるだけ
あほすぎる
0852デフォルトの名無しさん
2009/07/02(木) 19:03:41そうかなぁ?
仮にその関数100回呼び出すとしたら
必ず100回同じチェックすることになるでしょ?
非効率じゃない?
必ず同じチェックがてめーで必要になるならてめーの中でやれよ
ってのが俺流
0853デフォルトの名無しさん
2009/07/02(木) 19:51:57CString や std::string のように、普通はポインタを使わないようなオブジェクトを渡すときに、
foo(CString*)のような、ポインタ渡しの関数を書くのはヘタクソ。
0854デフォルトの名無しさん
2009/07/02(木) 20:17:15実用的じゃねぇもの使ってもしょーがねーじゃん
0855デフォルトの名無しさん
2009/07/04(土) 17:05:08動的配列の違いがわからないんですが
0856デフォルトの名無しさん
2009/07/04(土) 17:22:49>>780-785
0857デフォルトの名無しさん
2009/07/05(日) 17:36:10どういう構造で組めばいいんでしょうか?
0858デフォルトの名無しさん
2009/07/05(日) 18:05:460859デフォルトの名無しさん
2009/07/05(日) 20:40:06MSDNのkb99562にサンプル載ってるよ
0860294
2009/07/05(日) 20:43:28orz
0861デフォルトの名無しさん
2009/07/05(日) 21:27:21thx!
0862デフォルトの名無しさん
2009/07/08(水) 03:28:04ダイアログバーを使用してツールバーのような物を作り、そのダイアログバーにツリーコントロールを配置したのですが、
ダイアログバーゆえになのか、通常のダイアログに配置したコントロールのように自動でDDX変数を追加する事が出来ません。
その為、CTreeCtrlクラスオブジェクトのメンバ変数を作ってもそのコントロールと関連付け出来ず、アクセス出来ません。
色々悩んで調べた後に辿り着いたのが
(ツリーコントロールのメンバ変数).Attach( this->GetDlgItem(IDC_TREECONTROL1)->GetSafeHwnd() );
を実行後にメンバ変数から操作し、最後に
(ツリーコントロールのメンバ変数).Detach();
とすることで一応動かせたのですが、これがベストなのでしょうか?
もしくは偶然動いただけで想定外動作を起こしかねない方法なのでしょうか?
ダイアログバーに配置したツリーコントロールが表示されているということは
MFCプログラムのどこかの段階でそのコントロールをCreateしているはずで、
どこかにその時のオブジェクトがあるんじゃないかとは思ったのですが未熟な自分には
どこなのかまったく分かりませんでした。
どなたかアドバイスお願いします。
0863デフォルトの名無しさん
2009/07/08(水) 09:18:12ttp://support.microsoft.com/kb/185672/ja
CDialogBarを派生させてOnInitDialogやDDXが使えるようにしている。
0864名無し募集中。。。
2009/07/08(水) 12:28:19MS謹製の方法もあるんだな
0866デフォルトの名無しさん
2009/07/10(金) 20:19:12再頒布可能パッケージをインスコしないと
他のPCで実行できないのですか?
0867デフォルトの名無しさん
2009/07/10(金) 21:12:45自分で試せ、バカ
0868デフォルトの名無しさん
2009/07/10(金) 23:47:05バカいうなアホ
0869デフォルトの名無しさん
2009/07/11(土) 11:37:450870デフォルトの名無しさん
2009/07/14(火) 01:33:45そのような事は可能でしょうか?
0871デフォルトの名無しさん
2009/07/14(火) 02:51:440872デフォルトの名無しさん
2009/07/14(火) 10:23:18昔NT3.5対応させなきゃならなかったから
ListViewとTreeViewをListBoxサブクラス化して作ったなあ・・・
0873デフォルトの名無しさん
2009/07/14(火) 13:17:44ありがとう
0874デフォルトの名無しさん
2009/07/14(火) 14:17:270875デフォルトの名無しさん
2009/07/15(水) 16:14:46複数のプロジェクトで使い回したいのですが、
リソースが絡んでいるため、ソースとヘッダだけのときのように、
共通の場所に置いたものを各プロジェクトに追加するような使いかたができません。
このような場合、どのような方法があるのでしょうか。
おとなしくプロジェクトごとのrcファイルに
ダイアログ部分を毎回記述していくことになるのでしょうか。
0876デフォルトの名無しさん
2009/07/15(水) 16:26:23.rc2ファイルにしておいて、インクルードすれば?
.rcファイルの終わり近くに、
#include "res\\***.rc2" // Microsoft Visual C++ 以外で編集されたリソース
とあるでしょ?
0877デフォルトの名無しさん
2009/07/15(水) 17:25:19もしかしてできる?
なんでプロジェクトで1枚なんだ?
ほかの人と被ったときにやたらと編集が面倒くせぇよ
0878デフォルトの名無しさん
2009/07/15(水) 17:34:000879デフォルトの名無しさん
2009/07/15(水) 23:06:53リソースは個別にリソースエディタ(外部ツール)で編集し、>876のように.rcでインクルードすればいいよ。
0880デフォルトの名無しさん
2009/07/15(水) 23:12:50マジすか?
0881デフォルトの名無しさん
2009/07/15(水) 23:38:40名前の衝突さえ起こらなければ
いくらでも追加できるんだから
リソースエディタも複数リソース対応してるぞ
0882デフォルトの名無しさん
2009/07/16(木) 08:57:41その場合、ダイアログ自体や各コントロールのIDはどこに記述するのですか?
通常ならresource.hに勝手に入ってしまうのですが。
0883デフォルトの名無しさん
2009/07/16(木) 09:00:00あ、番号が競合しないように、そこだけは要注意ね。
0884デフォルトの名無しさん
2009/07/16(木) 09:12:59根本的な質問で申し訳ありませんが、
外部のリソースエディタというのはそもそも何ですか?
0885デフォルトの名無しさん
2009/07/16(木) 13:43:33リソースエディタがなんなのか、よく考えていろいろググって、それから氏ね
0886デフォルトの名無しさん
2009/07/16(木) 18:55:300887デフォルトの名無しさん
2009/07/16(木) 21:15:510888デフォルトの名無しさん
2009/07/16(木) 21:41:34CDialog::OnInitDialog() をオーバーライドして、そこに必要なコードを書く。
0889デフォルトの名無しさん
2009/07/18(土) 13:09:29でもダイアログの変更ができません、OnInitDialog()内でコントロールと同様に
MoveWindow()で変更しようと思ったのですが
動作させるとエラーが出てしまいます
0890デフォルトの名無しさん
2009/07/18(土) 13:40:08どんなエラー?
0891デフォルトの名無しさん
2009/07/18(土) 13:44:18winocc.cppのここで止まります
if (m_pCtrlSite == NULL)
::MoveWindow(m_hWnd, x, y, nWidth, nHeight, bRepaint);
0892デフォルトの名無しさん
2009/07/18(土) 15:42:41CWnd* pWnd = NULL;
pWnd->MoveWindow( 0, 0, 0, 0); // アクセス違反
0893デフォルトの名無しさん
2009/07/18(土) 15:58:09CWnd* ttdlga = GetDlgItem(IDD_TTDLG);
ttdlga->MoveWindow(0,0,PictWidth,PictHeight+80,1);
IDは間違ってないと思うんですけど
0894デフォルトの名無しさん
2009/07/18(土) 16:11:13>IDは間違ってないと思うんですけど
CWnd* ttdlga != NULL をチェックしてみ。
それと、IDD_TTDLGが自身のダイアログなら、このコード自体不要。
MoveWindow(0,0,PictWidth,PictHeight+80,1); // これだけでいい。= this->MoveWindow(0,0,PictWidth,PictHeight+80,1);
それとも、別のウィンドウでこのコードを実行しているのか?
0895デフォルトの名無しさん
2009/07/18(土) 16:24:42これでできましたありがとうございます。よく考えたらそうですよね・・・助かりました
0896デフォルトの名無しさん
2009/07/20(月) 15:57:56ダイアログ上に配置したスクロールバーの場合はできるのですが、
WS_HSCROLL | WS_VSCROLLを追加して作ったビューにくっついてるスクロールバーのハンドラ(?)の取得方法が分かりません。
CScrollbar *pCScrollbar = ************;
***********←ここの部分はどうやって書けばよいのでしょうか。
よろしくお願いします。
0897デフォルトの名無しさん
2009/07/20(月) 16:31:02独立したスクロールバーではないので、バー単体でのハンドルは存在しない。
GetScrollPos / SetScrollPos 等の、CWnd のスクロール関数を使って操作されたし。
0898デフォルトの名無しさん
2009/07/20(月) 19:15:51迅速なご回答本当にありがとうございます。
エラーエラーで困っていたので万感の思いです。
0899デフォルトの名無しさん
2009/07/21(火) 12:57:530900デフォルトの名無しさん
2009/07/21(火) 13:25:56この際、無駄なレスは不要。
0901デフォルトの名無しさん
2009/07/21(火) 16:20:05>>898 が他所で恥かかないようにとの心配りじゃないかw
0902デフォルトの名無しさん
2009/07/23(木) 22:32:57itemにHDF_OWNERDRAWをつけて、DrawItemをオーバーライドしたところ、
item自体は描画できるんですが、item枠や、item間の区切りが、
DrawItem抜けた後で勝手に上書きで描画されてしまうようです。
これをやめさせる方法ってないでしょうか?
別案で、OnPaintオーバーライドして全部自前描画、ってのもやってみました。
こちらだと区切りまで含めて自分で描けるんですが、
OwnerDrawの時は引数として渡されてくる、Itemのhoverやpushの状態等
を取得する方法がわからず、詰まってしまいました。
どなたか、助言をお願いします。
0903デフォルトの名無しさん
2009/07/28(火) 12:36:58初歩的なことで申し訳ありませんが、ダイアログがサイズ変更可能な状態で、
指定以下のサイズに縮小できないようにするには、どのようにすればよいでしょうか?
ご教授お願いいたします。
0904デフォルトの名無しさん
2009/07/28(火) 12:40:060905903
2009/07/28(火) 13:59:58ありがとうございます。
解決しました(^^
0906デフォルトの名無しさん
2009/08/01(土) 22:31:01ダイアログAとダイアログBを準備しておいて、
・アプリケーションを起動するとダイアログAが開く
・ダイアログA内の『次へ』というボタンをクリックするとダイアログBが開く
・ダイアログBが開くとダイアログAは非表示になる
というセットアップウィザードのようなプログラムを作成したいです。
ボタンを押した際の処理に、
m_pDlgB = new CダイアログB;
m_pDlgB->Create(IDD_ダイアログB, this);
m_pDlgB->ShowWindow(SW_SHOW);
ShowWindow(SW_HIDE);
と書いているのですが、これだとタスクバーからアイコンが消えてしまいます。
タスクバーにアイコンを残す方法は何かありますか?
それとも、セットアップウィザードのように画面が切り替わるプログラムの場合
は何か他に方法があるのでしょうか。
0907デフォルトの名無しさん
2009/08/01(土) 22:39:21>タスクバーにアイコンを残す方法
CダイアログBのOnInitDialog() で SetIcon( hIcon, FALSE) する。
>何か他に方法があるのでしょうか。
ウィザード形式のプロパティシートを利用する。
0908906
2009/08/02(日) 11:40:28>CダイアログBのOnInitDialog() で SetIcon( hIcon, FALSE) する。
やってみたのですが、この方法でもタスクバーからアイコンは消えてしまうようでした。
>ウィザード形式のプロパティシートを利用する。
これでできました!ありがとうございます。
それと、単純にリソースのプロパティのApplicationWindowの項目を
Trueにすればよかったみたいです。
ありがとうございました!
0909デフォルトの名無しさん
2009/08/04(火) 11:15:42アプリケーションの種類:SDI,プロジェクト形式:MFC標準のフレームワークで、
ツールバーのアイコンを大きい/小さいを入れ替えたいと思っています。
※大きいアイコンと小さいアイコンは別々にリソースを用意するつもりです。
また、この時メニューバーの
[表示(V)]→[ツールバーとドッキングウィンドウ(T)]→[カスタマイズ...]
で表示される「カスタマイズ」ダイアログ内、「オプション」タブにある、
「大きいアイコン」チェックボックスに対応させて入れ替えたいと思いますが、
そんな事可能なんでしょうか?
もし、可能であれば、オブジェクト名とそのメンバ。
もしくはサンプルを教えていただけませんか?
0910デフォルトの名無しさん
2009/08/04(火) 11:29:15今、ソースを読んでる時間ないから思いつきだけど。:-)
あるいは、大きいアイコンのツールバーと小さいアイコンのツールバーを別個に用意して
表示/非表示で切りかえるとか。
0911デフォルトの名無しさん
2009/08/04(火) 13:24:35やりたいことだけ考えて、あとは教えてもらおうとか、プログラマとしては屑だな。
普通は試行錯誤して自分で組むもんだ。
氏んだ方がいいんじゃないか。つか、氏ね。
0913デフォルトの名無しさん
2009/08/04(火) 13:37:54すり替えの方法で、
サンプルのIEDemoとかで調べてみます。
>>911
そうですね。
くれくれではなく、少しは精進します。
0914デフォルトの名無しさん
2009/08/04(火) 13:38:140915デフォルトの名無しさん
2009/08/04(火) 17:12:240916デフォルトの名無しさん
2009/08/04(火) 17:19:260917デフォルトの名無しさん
2009/08/04(火) 17:31:130918デフォルトの名無しさん
2009/08/06(木) 06:05:520919デフォルトの名無しさん
2009/08/06(木) 10:26:40サーバー側からクライアント側にCSocketを使用してCString配列のデータを送信しているのですが、
送信途中でPunpMessage関数に入ってしまい、送信速度が遅くなってしまいます。
一つ配列を送信するごとにSleep(1);をはさめばうまくいくこともあるのですが、
やはり不安定ですし、送信速度も遅くなってしまいます。
どうやったらPunpMessage関数に入らず、すばやく送信できるのか教えてください。
また、そのような問題を解決するサンプルプラグラム等ありましたら教えていただけると助かります。
0920919
2009/08/06(木) 10:28:22↑は一つCString配列を送信するごとにの誤りでした。すみません。
0921デフォルトの名無しさん
2009/08/06(木) 10:38:26>PunpMessage関数
そもそもこういった関数は存在しない。スペルミスであることはわかるが、
CSocket::PumpMessages() なのか CWinThread::PumpMessage() なのか不明。
ま、いずれにしろメンバ関数なので、無効化だけを狙うならオーバーライドしてしまえばよい。
0922919
2009/08/06(木) 10:58:12CSocket::PumpMessagesでした。すみません。
やはりオーバライドが良いですよね・・・
ただ、オーバーライド自体よく解っていないので、がんばってやってみますけど、
もし解らなかったらもう一回質問に来るかもしれません。その時はよろしくお願いします。
あと、自分で調べて原因っぽいものを見つけたので、一応貼っておきます。↓
http://support.microsoft.com/kb/154649/ja
0923デフォルトの名無しさん
2009/08/06(木) 13:39:58解決するにはどうしたらいいの?
0924デフォルトの名無しさん
2009/08/06(木) 14:21:590925デフォルトの名無しさん
2009/08/06(木) 15:05:12直接の原因を調べることだろうな
0926デフォルトの名無しさん
2009/08/06(木) 22:24:26どうやったら一番早いでしょうか?
毎回CStringで連結してたらあまりに遅かったので、
char配列のバッファAに16kBまで書き込んで、次にCStringのバッファBで16回連結し、
それを16回分たまるごとにCStringのバッファCで連結して最後にテキストボックスに出すようにしたら
少しは早くなりましたが…
0927デフォルトの名無しさん
2009/08/06(木) 23:41:35小分けにする理由はあるの?
0928デフォルトの名無しさん
2009/08/06(木) 23:58:140929926
2009/08/07(金) 00:43:38やはり大きい領域で連結操作すると重いみたい。
CString一段から二段に増やしたら時間短縮した。
それ以上増やしてもあんまり変わらなかったけど。
0930デフォルトの名無しさん
2009/08/07(金) 00:50:0610001文字の領域を確保して10000文字の領域からコピーして
10000文字の領域を破棄してるから遅くなると考えてなるべく小分けするって
手法をとったんだろ?
javaでも似たような動作したな
毎回こういう文字列オナニークラスみるたびに思うけど
汎用設計下手糞すぎる奴がなんでこんなもの手をだすんだろね
0931デフォルトの名無しさん
2009/08/07(金) 06:50:06なんかズレてるな
>char配列のバッファAに16kBまで書き込んで
これを24MBのchar配列にして
CStringの連結を一回も行わずに
テキストボックスに渡すのは駄目なのか?
0932デフォルトの名無しさん
2009/08/07(金) 17:22:25最初から大きめに領域取っておけば、
不足するたびに何度も領域増やすような頭の悪い状況は避けられる。
0933デフォルトの名無しさん
2009/08/07(金) 17:34:39char 配列で十分だろーに。
使いたいなら CFixedStringT というのもある。
0934デフォルトの名無しさん
2009/08/07(金) 18:09:03いろいろとサイトを拝見してたところ簡単な方法で、
OnSysCommand()内で、最小化時に
ShowWindow(SW_HIDE)で本体を隠し、CDialog::OnSysCommand()が呼ばれる前に
終了する方法を見つけましたが、この方法で特に動作的に問題は無いでしょうか?
サンプルを作成してみたところ、正常に動作しているように見えます。
void CTest::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
switch(nID){
case SC_MINIMIZE:
//ここで終了
ShowWindow(SW_HIDE);
return;
}
CDialog::OnSysCommand(nID, lParam);
}
}
0935デフォルトの名無しさん
2009/08/07(金) 18:21:40CDialog::OnSysCommand() が何をしているのか調べるとわかる。
0936デフォルトの名無しさん
2009/08/07(金) 19:02:30アプリ主なシステムコマンド(最小化、最大化、クローズなど)のデフォルト処理を行っているんですよね。
それを飛ばして、勝手にウインドを隠すこと自体、問題ないのか少し不安になり質問しました。
クローズボタンの無効化などで、OnSysCommand()を呼ばずに終了する方法は見たことはあるのですか・・・・
0937デフォルトの名無しさん
2009/08/07(金) 19:18:29難しく考えなくていい。
CDialog::OnSysCommand() は メッセージを DefWindowProc() に渡しているに過ぎない。
DefWindowProc() は処理されないメッセージを処理する関数。
原則として、処理をしたメッセージをこの関数に渡す必要はない。
0938934,936
2009/08/08(土) 09:39:20ありがとうございます。参考になりました。
メッセージ処理を行っているだけで、特に必要なければ、
飛ばしてもよいのですね。
0939926
2009/08/09(日) 01:36:51いや、十分な大きさの配列宣言したら実行時エラーが出てしまって…
(その後、malloc系の関数で別途メモリを確保したら一応できましたが)
240万文字を保持するにはCStringとかにするしかないのかなと思ってしまっていました。
それに、毎回240万文字出さなくちゃいけないわけではなくて、
そのプログラムをある特定の目的で使ったときのみその必要があるだけで、
通常は24文字が数十からせいぜい数百くらいしか生成されないんです。
そして正確な必要量は、確率で決まるので実行するまで不明という仕様。
で、926の書き込みの後さらに試行錯誤した結果、文字列の生成・連結の実行時間は既にかなり短縮できていて、
現状では実行時間のほとんどがCEditのSetWindowTextに費やされていたことがわかりました。
ちょっと私の実力ではCEditに代わるものをなんとかするとか無理なので、あきらめることにします。
お騒がせしました。
0940デフォルトの名無しさん
2009/08/09(日) 14:10:34>そして正確な必要量は、確率で決まるので実行するまで不明
char* lpString = new char[必要量];
// to do ...
delete [] lpString;
0941デフォルトの名無しさん
2009/08/09(日) 16:00:27これはおかしい
上限は仕様で決めなければならない
だってランダムで明らかにPCのスペックを上回る量だったらどーすんだよ
HDDに一時的に保存しておく必要だってでてくるし
本当は上限はあるにはあるんだけど概算を出すのが面倒だからやってないだけだろ
嘘をつくな
嘘をつくと後で大変なことになるぞ
自分にとってもよくない
0942デフォルトの名無しさん
2009/08/09(日) 16:04:290943デフォルトの名無しさん
2009/08/09(日) 16:14:56内容変わらないじゃん
0944デフォルトの名無しさん
2009/08/09(日) 18:57:31そもそも数メガのテキストを渡すとか
まともなパフォーマンスにならなかった気がする
テキスト渡すだけでフリーズしかけ、
スクロールする度にフリーズしかけ・・・
0945デフォルトの名無しさん
2009/08/10(月) 01:10:03一文字増えるだけで大変なことになる
0947926
2009/08/10(月) 04:08:59仕様上の上限は>>926にある通り2400万字。
24文字のテキストが生成されるルーチンは、理論上は果てしなく続く可能性があるけれど、
100万回で強制的に打ち切る仕様です。
24文字のデータを生成するルーチンだけに関して言えば、「必要量」は不明です。
その「打ち切る」処理まで含めて言えば24MBが必要量の上限となりますが、
それってむしろ必要量というよりは十分量のような気が。
0948デフォルトの名無しさん
2009/08/10(月) 10:51:46MFCからはほど遠い内容になってきているから、もうそのくらいにしとけ。
0949デフォルトの名無しさん
2009/08/10(月) 16:25:29VS2008のVC++MFCで
ボタンクリックでピクチャーコントロールにjpgファイルの画像をサイズを変えて表示しています。
以下ソース
CImage img;
CImage img2;
HDC hdc;
img2.Create(80,60,24);
img.Load("jpgファイルのフルパス");
hdc = img2.GetDC();
SetStretchBltMode(hdc, HALFTONE);
img.Draw(hdc, 0, 0, 80, 60);
img2.ReleaseDC();
m_xcPic01.SetBitmap( (HBITMAP)img2 );
img.Destroy();
img2.Detach();
img2.Destroy();
jpgファイルが変わる毎に、画面上の画像も切り替えたいので
上の処理を呼び出して、画面を切り替えてます。
しばらく動かしていたところで気付いたのですが、
メモリの使用量がかなり多くなっていました・・・
ファイルロード側のDestroyやリサイズ後側のDetach、Destroyだけでは解放してくれないのでしょうか?
わかる方、または参考になるサイトやスレをご存知の方、よろしくお願いします。
0950デフォルトの名無しさん
2009/08/10(月) 16:50:43メモリの使用状況との関連は不明だが
>img2.Detach();
>img2.Destroy();
この場合、img2.Detach() によってオブジェクトに関連付けられている HBITMAP が切り離されてしまうので、
img2.Destroy() は何も機能しない。
したがって、m_xcPic01 に関連付けた HBITMAP をどこかで DeleteObject() してやる必要がある。
0951デフォルトの名無しさん
2009/08/10(月) 16:57:51レスありがとうございます。
つまりは以下の様にすれば・・・とのことでしょうか?
CImage img;
CImage img2;
HDC hdc;
img2.Create(80,60,24);
img.Load("jpgファイルのフルパス");
hdc = img2.GetDC();
SetStretchBltMode(hdc, HALFTONE);
img.Draw(hdc, 0, 0, 80, 60);
img2.ReleaseDC();
m_xcPic01.SetBitmap( (HBITMAP)img2 );
img.Destroy();
img2.Detach();
//img2.Destroy(); //コメントアウト
::DeleteObject(img2); //追加
まずは、コレで動作を確かめてみます。
ありがとうございます。
0952デフォルトの名無しさん
2009/08/10(月) 17:05:13すでに Detach() されているのだからこれも無意味。
m_Bitmap = img2.Detach(); // m_Bitmap は HBITMAP 型のメンバ変数として宣言する
m_xcPic01.SetBitmap( m_Bitmap);
// 不要になった時点で
::DeleteObject( m_Bitmap);
0953デフォルトの名無しさん
2009/08/10(月) 17:38:00ありがとうございます。
さっそく動作を確かめてみます。
0954デフォルトの名無しさん
2009/08/12(水) 13:48:47ダイアログバーのOnVScrollなどでスクロールイベントを拾ってます。
動かして見るとスクロールバーをいくらスライドさせてもドラッグしているボタンを
離すと元の初期位置に戻ってしまいます。
スクロールイベント検知時にはSetScrollPosでnPosの値をちゃんと設定しています。
念のために直後にGetScrollPosで値をTRACE出力して確認しましたが、ちゃんと設定されています。
このGetScrollPosで取得した値をTRACEで出しながら確認したのですが、ドラッグ中は正しい値がちゃんと取れています。
でもドラッグを中断してボタンを離した瞬間に、何故かスクロールイベントがnPosが0で発生し、
その0によって上書いてしまします。
苦肉の策でnPosが0の時は上書き処理をしない条件式を入れると期待通り動きます。
初期処理としてSetScrollRangeで最大値500を入れたのに、GetScrollLimitでみると勝手に501にしてくれています。
これはnPosが0が来たら無視するプログラムを作れというマイクロソフトの意図なのでしょうか?
それとも自分が何か間違っているのでしょうか?
0955954
2009/08/12(水) 14:18:08初期値をSetposで0にすると、最初に描画された画面では意図した場所にスライダーが
設定されてません。
でも初期値を50にするとちゃんと意図した位置にスライダーが設定されて描画されてます。
MSDNの説明には1からスタートで0は無効ともマイナスを設定しては駄目ともありませんし、
プログラム中はマイナスになっても機能してます。
マイクロソフトのプログラマーがsetposの引数が0だったら処理しないみたいな
バグを仕込んでいるのではないかと邪推してしまいます。
0956デフォルトの名無しさん
2009/08/12(水) 15:08:09nSBCodeはちゃんとみてる?
0957954
2009/08/12(水) 16:33:29ページ移動や左右クリックによって細かい処理変更を行う意図はなく、
純粋に値だけ正しければいいと思ったので、nPosの値のみみて
nSBcCodeは意識していません。
これが関係しているのでしょうか?
0958デフォルトの名無しさん
2009/08/12(水) 16:52:57いらないnSBcCodeは無視するようにしないとnPos=0で何回も飛んでくるだろ
0959デフォルトの名無しさん
2009/08/12(水) 16:53:21TBM_SETRANGE に当たるもんな
TBM_SETRANGE
wParam = (WPARAM) (BOOL) fRedraw;
lParam = (LPARAM) MAKELONG(lMinimum, lMaximum);
ちなみに設定時のMAKELONGってWORD指定じゃね?
WORD指定って
16ビット符号なし整数(unsigned short型/2バイト)
ってことはマイナスなしじゃね?
っていい加減なこと言ってたらスマンコ
0960954
2009/08/12(水) 20:53:17this->UpdateData(TRUE);
if( *pScrollBar == m_ddxHScroll && nPos != 0)
{
m_ddxHScroll.SetScrollPos(nPos);
}
this->UpdateData(FALSE);
CDialogBar::OnHScroll(nSBCode, nPos, pScrollBar);
}
今はこんな感じになってます。
スクロールバーの矢印クリックだろうが直接指定だろうが、左右の隙間クリックだろうが、
ショートカットキーだろうがnPosにはその時の実際の値が入っているという理解は間違いでしょうか?
0961デフォルトの名無しさん
2009/08/12(水) 21:26:16間違い。
nPos の値を使うのは、nSBCode == SB_THUMBPOSITION or SB_THUMBTRACK のときだけ。
詳しくは http://msdn.microsoft.com/ja-jp/library/e14hhbe6.aspx あたりを読め。
0962デフォルトの名無しさん
2009/08/13(木) 00:11:26>他にもスライダーコントロールのレンジをー300〜100に設定し、
>初期値をSetposで0にすると、最初に描画された画面では意図した場所にスライダーが
>設定されてません。
>でも初期値を50にするとちゃんと意図した位置にスライダーが設定されて描画されてます。
ウチでは問題なく設定される。
おそらく君は、スライダの再描画フラグをTRUEにしていない。
m_wndSlider.SetRange( -300, 100, TRUE); // 再描画フラグはTRUE。
m_wndSlider.SetPos( 0);
スライダーコントロールの、そもそものスライダの初期値は 0。
再描画フラグをFALSEにしたまま範囲を変更して、その後初期値を 0 に設定しても、
スライダの値そのものは変化していないのだから、再描画されないのは当然と言えば当然。
よって「意図した場所にスライダーが設定されてません」なとど言わなきゃいけないハメになる。
初期値を 50 にすれば、もともとの値から変化しているのだから、再描画フラグが FALSE でも
スライダの位置は再描画されるので
「でも初期値を50にするとちゃんと意図した位置にスライダーが設定されて描画されてます」
などとのたまうコトになる。
バグを仕込んでいるのではないかと邪推する前に、道理を考えるべし。
0963954
2009/08/13(木) 01:05:11修正すると全て上手く動きました。
この問題だけに一日悩みました・・・。
ありがとうございました。
0964デフォルトの名無しさん
2009/08/19(水) 01:02:27CWinApp::ProcessShellCommand
をオーバーロードすればいいんでしょうか?
0965デフォルトの名無しさん
2009/08/19(水) 01:23:59CCommandLineInfo::ParseParam() を「オーバーライド」する。
0966デフォルトの名無しさん
2009/08/19(水) 01:37:16CCommandLineInfoオブジェクトのデータメンバに値をセットしてるだけで
実際の動作はCWinApp::ProcessShellCommandの方で行われてるようなんですが
(設定はCCommandLineInfoクラスで、実行はCWinAppクラスで、という形になっている)
CCommandLineInfoクラスの中で処理コードを書いちゃってもいいものなんでしょうか…。
というよりも、CWinAppオブジェクトを参照できないから
theAppのパラメータ等に依存するコードはかけないような・・・。
0967デフォルトの名無しさん
2009/08/19(水) 02:14:38独自のコマンドライン引数の処理をするには CCommandLineInfo::ParseParam() をオーバーライド
して CCommandLineInfo::m_nShellCommand に独自の値をセットし、その値の時には独自の処理をおこなうように
CxxxApp でコーディングする。言いかえると、CCommandLineInfo::m_nShellCommand が既定の値のときだけ
CWinApp::ProcessShellCommand() が実行されるようにする。
>msdnを読む限り
CCommandLineInfo::ParseParam() の解説に
「ほかのフラグやパラメータ値を処理するには、派生クラスでこの関数をオーバーライドします。」と書いてある。
面倒くさければ、CWinApp::ProcessShellCommand() 相当の関数を自作して、コマンドライン引数に対する
すべての処理を自分で書けばよい。
>というよりも、CWinAppオブジェクトを参照できないから
>theAppのパラメータ等に依存するコードはかけないような・・・。
意味不明。
蛇足ながら、CWinApp::ProcessShellCommand() は仮想関数ではないから
オーバーライドは成立しない。( だから >>964 は不可)
0968デフォルトの名無しさん
2009/08/19(水) 03:19:400969デフォルトの名無しさん
2009/08/19(水) 04:01:18どうやって解決したものか、自分で直接呼び出してもいいけど正式リリース版待ったほうがいいか
0970デフォルトの名無しさん
2009/08/19(水) 11:06:170971デフォルトの名無しさん
2009/08/19(水) 12:12:05すげぇ、ヴァカすぎるwww
こんなヴァカでもプログラム組んでるのか。
もう少し勉強して出直してこい。少なくともOSのせいでOnIdleが呼ばれないとか、
そんな発想してるうちはダメだろw
0972デフォルトの名無しさん
2009/08/19(水) 13:02:32少し突っ込んで調べたらちゃんと呼ばれてたわ
どうもOnIdle内で起こすイベント待機スレッドが起きてなかっただけだった これはこれで問題だが
>>971
今OSごとの動作チェックしてて7以外はまともに動いてたんだよ(・ω・)゙許せハゲ
0973デフォルトの名無しさん
2009/08/20(木) 14:39:58上手くいきません。
リソースエディタでFormViewのダイアログを作成編集し、それを右クリックして、
CDialogを基本クラスとしてクラス作成(仮:CMyDialog)をしています。
そしてCMainFormのヘッダにてCMyDialog MyDialog;と宣言し、
同OnCreate関数最後にて
MyDialog.Create(該当ダイアログID,this);
MyDialog.DoModal();
すると「Debug Assertion Failed!」という内容のダイアログが出て
File:dlgcore.cpp
Line:450
という内容が表示されます。Createを省略するとエラーダイアログは出ませんが、
何事も無かったかのようにDIALOGがまったく表示されません。
モードレスとして表示すろと(CreateしてShowWindow)SDIのフォーム内部に
ドッキングした感じで表示されますがダイアログとして機能していません。
ただ単にアプリケーション開始直後にモーダルダイアログを出したいだけなのですが、
どうすれば良いのでしょうか?
またダイアログ表示を仕込む箇所(OnCreate)は適切なのでしょうか?
ネットで調べてもいまいち解決に繋がるものが見つかりませんでした。
また書いてある通りいやっても上手くいきませんでした。
どなたか教えてくださいよろしくお願いします。
0974973
2009/08/20(木) 14:54:32dlgcore.cppの450行目はすでにモードレスとして作られた物をモーダルとして
動かそうとしているという感じの内容っぽいです。やはりCreateは要らないのだと思います。
そして戻り値を見るとどうもIDOKがこっちが一切ダイアログ触ってないのに
返されてスルーされているみたいです。
0975デフォルトの名無しさん
2009/08/20(木) 15:04:57>ただ単にアプリケーション開始直後にモーダルダイアログを出したい
>MyDialog.Create(該当ダイアログID,this);
>MyDialog.DoModal();
MyDialog.DoModal() が要らない。
MyDialog.Create() して、MyDialog.ShowWindow( SW_SHOW);
0977975
2009/08/20(木) 15:10:37斜め読みしてたから、書き忘れた。
>起動後最初の一回のみ自作のモーダルダイアログを表示したいのですが、
メインウィンドウが表示される前に、メインウィンドウとの関連性がないものであれば、
CxxxApp::InitInstance() 内で表示すればいい。
0978973
2009/08/20(木) 15:19:43しかし、ためしにAppクラスのInitinstanceの最後でDoModalでやってみましたが、
起動後本の一瞬だけやはりフォームの左上にドッキングしてはりついた感じでチラっと見えた後、
すぐに見えなくなりました。
しかしその後フォームをマウスクリックなどしようとするとモーダルダイアログが出ているときに
下の画面を触ろうとする時の「ポンッ」という音だけが聞こえるが一切操作できず、
相変わらずダイアログは見えていない状態になります。
0979973
2009/08/20(木) 15:45:00表示しようとするダイアログのプロパティのスタイルを「子」から「ポップアップ」
にすれば意図通りに動きました。
果たしてこれが正解は分かりませんが、こんな秘密コマンドみたいな仕様普通分かりません・・・。
ただ単にダイアログ表示したいだけなのに・・・。物凄い基本機能なのに・・・。
0980デフォルトの名無しさん
2009/08/20(木) 15:49:22それさえもすっ飛ばして勘でやるからそういうことになる。
そんな基本中の基本もわからないで秘密コマンドとか笑われるぞ。
0981デフォルトの名無しさん
2009/08/20(木) 15:54:04MFCというのは文字通り Foundation Class だから、WindowsAPIの上に分厚い化粧(=Foundation)を
塗りたくったものにすぎない。だから、MFCの基本はWindowsAPIにあって、
WindowsAPIによるWindowsプログラミングの基礎ができていないと使いこなすのは難しいかもな。
逆に言うと、WindowsAPIによるWindowsプログラミングの基礎をマスターしていると、MFCを解するのは
すごく楽になる。
0982デフォルトの名無しさん
2009/08/20(木) 21:23:14>にすれば意図通りに動きました。
スタイルプロパティを「子」にして使うほうが用途的には少ないんだけど、なんで
こんなところで躓くのかな? 不思議。
0983デフォルトの名無しさん
2009/08/20(木) 21:47:45化粧品におけるファンデーションてのは化粧の下地って意味だから、
MFC=化粧じゃなくて、MFC=基礎クラス。
まぁ、MFCは慣れれば強力だけど敷居は高いから、始めたばっかのヤシが
ダイアログ表示するだけで「秘密コマンド」とか言い出すのも無理ないな。
0984デフォルトの名無しさん
2009/08/20(木) 22:02:490985デフォルトの名無しさん
2009/08/20(木) 22:16:30ちょっと違う。ファンデーションのつきをよくするためにその下に塗るのが化粧下地。
0986デフォルトの名無しさん
2009/08/20(木) 22:24:33色々悩んだ結果
UpdateWindow();
Invalidate();
とかやらないとすぐに再描画されないらしい
と半日かかったw
なんか俺、こういうのばっかだ
0987デフォルトの名無しさん
2009/08/20(木) 22:32:10CMFCToolBar上のボタンをコンボに置き換えたいということで以下の様にコードを追加しました。
CMainFrame::OnCreate()にて
if( !m_wndToolBarReplace.CreateEx( this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC ) ||
!m_wndToolBarReplace.LoadToolBar( IDR_TOOLBAR_TEST ) )
{
TRACE0( "ツールバーの作成に失敗しました。\n" );
return -1;
}
・・・
m_wndToolBarReplace.EnableDocking( CBRS_ALIGN_TOP );
EnableDocking(CBRS_ALIGN_ANY);
DockPane( &m_wndToolBarReplace );
・・・
CMainFrame::OnToolbarResetにて
UINT nToolBarID = ( UINT )wp;
if( nToolBarID == IDR_TOOLBAR_TEST )
{
m_wndToolBarReplace.ReplaceButton( ID_BTN_1, //先頭のボタンのID これを置き換えたい
CMFCToolBarComboBoxButton( ID_BTN_1, GetCmdMgr()->GetCmdImage( ID_BTN_1 ), CBS_DROPDOWNLIST ) );
}
とやってもボタンが置き換わらないのですが、他に何が必要なのでしょうか。
「ツールバー上のボタンを置き換える」についてのヘルプとMFCFeaturePackのサンプルについても見てみたのですが、
ボタンの置き換えについての手順はこれ以外に見当たらず、足止め状態です。
識者の方何とぞご指導くださりませ。
0988デフォルトの名無しさん
2009/08/20(木) 22:52:430989デフォルトの名無しさん
2009/08/20(木) 23:16:52コード変更後にレジストリはクリアした?
してないなら一度すべて削除する。
0990デフォルトの名無しさん
2009/08/20(木) 23:26:32おそらく >>989 が正解。
CWinAppExをベースにしていると、LoadState / SaveState のおかげで
レジストリを削除しないとその後に変更した部分が反映されない。
0991デフォルトの名無しさん
2009/08/20(木) 23:39:45レジストリですか。。クリアしてませんでした。
確かにツールバーの位置については最初から保持してるなぁとは思っていましたが。。
ありがとうございます。感謝!
0992デフォルトの名無しさん
2009/08/21(金) 00:07:10ちなみに、CMainFrame::OnViewCustomize内でも置き換え処理してる?
ここでも置き換え処理しておけば、カスタマイズダイアログ上でもコンボボックスになるよ。
0993987
2009/08/21(金) 00:29:45OnViewCustomizeについては操作できないようにするつもりなので何もしていなかったのですが、
ついさっきテストプロジェクトで試してみたところツールバーもカスタマイズダイアログ上でも置き換えできました。
置き換えたコンボがDisableだったけど・・・ようやく一歩進めました。
感謝です!
0994デフォルトの名無しさん
2009/08/21(金) 09:17:02CControlBarは独自のドッキングバー作るのに散々格闘したわ
CDockBarとCDockContextのドキュメントをなぜ出さなかったMSめ( ´ω`)
レス数が950を超えています。1000を超えると書き込みができなくなります。