■MFC相談室 mfc17d.dll■
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2006/11/21(火) 10:38:31前スレ
■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/
0883デフォルトの名無しさん
2007/07/02(月) 13:57:13ダイアログはMFCの機能じゃないだろ。
0884デフォルトの名無しさん
2007/07/02(月) 14:07:30printfとかあるし。
0886デフォルトの名無しさん
2007/07/02(月) 14:43:48え?CDialogしか使ってないのに>>874みたいなこと書いてるの?
そりゃ失礼。
ママー変なおじさんが来たよ〜〜〜
0887874
2007/07/02(月) 14:57:010888デフォルトの名無しさん
2007/07/02(月) 15:23:35馬鹿にされるのは仕方ないかもな。
0889デフォルトの名無しさん
2007/07/02(月) 20:07:22VC6で簡単にエクセルのようなグリッドコントロールが使いたいのですが・・・
0890デフォルトの名無しさん
2007/07/03(火) 10:36:47VC6には、FlexGridのMSバンドル版である、MS-FlexGridがバンドルされていたと思いますが。
Excel(つーかMSOfficeSuite)をインストール済みなら、Excel由来のコントロールも使えると思うし。
0891デフォルトの名無しさん
2007/07/03(火) 12:45:41MFC 使ってるんだが、そんなオカシイこと言ってるか?
0892デフォルトの名無しさん
2007/07/03(火) 12:49:250893デフォルトの名無しさん
2007/07/03(火) 16:05:18CDialogだけってことはあまりないだろ
配置するコントロールもMFCクラスだし
文字列操作とかファイル操作とか
見えない処理でもMFCクラスを使う
機会はある。
0894デフォルトの名無しさん
2007/07/04(水) 01:17:10お前マジでそんなものも作れないの?
0895デフォルトの名無しさん
2007/07/04(水) 01:41:46ここ数日煽りばっかりやってるけど
何か嫌なことでもあったの?
0896デフォルトの名無しさん
2007/07/04(水) 03:14:33使ってみたいひといる?
0897デフォルトの名無しさん
2007/07/04(水) 06:15:52すまん
解説キボン
0898デフォルトの名無しさん
2007/07/04(水) 07:53:230899デフォルトの名無しさん
2007/07/04(水) 08:53:260900デフォルトの名無しさん
2007/07/04(水) 09:26:040901デフォルトの名無しさん
2007/07/04(水) 11:10:170902デフォルトの名無しさん
2007/07/04(水) 18:31:10どうせならMFCだけでなく、ATL::CWindowからATL::CWindowImplあたりのカバーをしてくれ。
そうすればVC++以外でWTLが使えるようになる。
0903デフォルトの名無しさん
2007/07/05(木) 00:03:59解説キボンの前にどこまで考えたのまったく考え付かないわけ?
まったく考えつかない場合目茶低レベルなので以下の質問に答えて欲しい。
TreeViewとかTreeCtrlとかは使ったことあるの?
あるならそれを自前で実装するとしたらどうすればいいか考えてみればいい。
FileDialogも似たようなもの。
TreeViewもヒントにならない場合初歩にも達していないので以下の質問をさせてもらう。
普通のViewに好きなようにアイコンは表示できるのできないの?
これができないならお手上げ、できるなら上の質問に答えられるレベルになればなんとかかんとか思いつくようになれるだろ
良い実装になるかどうかしらんが解説キボンなどと書かなくはなるだろ
0904デフォルトの名無しさん
2007/07/05(木) 00:19:310905デフォルトの名無しさん
2007/07/05(木) 01:16:46MFC設計者アホだろ
0906デフォルトの名無しさん
2007/07/05(木) 04:45:05つーか、あれ、SDKそのままで手を加えてないだけだと思うが。
0907デフォルトの名無しさん
2007/07/05(木) 07:43:04え?いきなりtreeの話始めてるけど
基本方針ってどういうのを想定して言ってるの?
話が全く見えないんだけど?
つまり、FileDialogをどうにかこうにかして使うんじゃなくて
既存FileDialogはもう全く駄目なので自分が望む理想のFileDialogを自作するって言ってる?
0908デフォルトの名無しさん
2007/07/05(木) 09:04:28http://msdn2.microsoft.com/ja-jp/library/dk77e5e7(VS.80).aspx
20*(MAX_PATH+1)+1とかやってたけど問題無かったがなぁ…
ってちゃんと検証したか覚えて無いがw
0909デフォルトの名無しさん
2007/07/06(金) 01:15:34WM_CLOSE、EndDialogどれも落ちる気配が無いです…
0910デフォルトの名無しさん
2007/07/06(金) 01:54:452048?マジすか?
なんもできないじゃないですかw
やっぱり自分で作るしかないですかね
0911デフォルトの名無しさん
2007/07/06(金) 09:41:20これ対応するにはカスタムテンプレートじゃなくてフックのほうを使うのかな
0912デフォルトの名無しさん
2007/07/07(土) 16:45:11char szItem[定数][可変長];
これと等価のものはどの様に書いたらイイデツカ
0913デフォルトの名無しさん
2007/07/07(土) 17:12:28std::vector<std::vector<char> >
0914デフォルトの名無しさん
2007/07/07(土) 21:40:05といいつつこれも違うんだが、CStringArrayを勧めてみる。
0915デフォルトの名無しさん
2007/07/08(日) 11:29:41クラシックスタイルになってしまいます。
アイコンつきのボタンをXPスタイルで表示させるにはどうすればいいんでしょうか?
0916デフォルトの名無しさん
2007/07/08(日) 12:49:261. オーナードロー+Theme系APIで全部自前描画
方法としては一番正しそう。だが面倒。
2. NM_CUSTOMDRAWで中身描画部分だけオーバーライド
BS_BITMAP/BS_ICONはオフにしておくこと。
2005だと手作業で追加作業が必要だったので、念のためメモしとく。
*このメッセージはCC6.0以降でしか送られてこない事に注意
// BEGIN/END_MSG_MAP
ON_NOTIFY(NM_CUSTOMDRAW, コントロールID, ハンドラ)
// ハンドラ
afx_msg void Handler (NMHDR * pNotifyStruct, LRESULT * result)
// ハンドラ実装
const NMCUSTOMDRAW& nmcd = *(const NMCUSTOMDRAW *)pNotifyStruct;
if ( dwDrawStage == CDDS_PREPAINT ) {
// ここでnmcd.hdcに自前描画
*result = CDRF_SKIPDEFAULT;
}
else {
*result = CDRF_DODEFAULT;
}
0917デフォルトの名無しさん
2007/07/08(日) 14:55:24レスありがとうございます
自前で描画するしかないんですねorz
Theme系APIについて全く無知なので先は険しそうです
0918デフォルトの名無しさん
2007/07/09(月) 08:14:29たしかVC6はCStringはクラステンプレートになっていなかったはず。
0919デフォルトの名無しさん
2007/07/09(月) 18:01:07現在、複数のコントロールバーの状態を、CFrameWnd::SaveBarStateを使わずに、
アプリケーションのINIファイルやレジストリとは無関係の任意のINIファイル、
任意のセクションに、WritePrivate系の関数で保存できないかと試行錯誤しています。
CDockStateの解説を見てみたところ、Serializeで保存できると書いてあったので、
CMemFileでメモリ上にシリアル化し、そのバイト列をそのまま
WritePrivateProfileStructで吐き出してしまう方法を思いつきました。
以下のようなコードになっているのですが、CMemFileを使うこと自体も初めてで、
このような方法でよいものなのか、わからない状態なのです。
こういう方法でコントロールバーの状態を保存した場合、
なにか問題の起こる可能性はありますでしょうか?
もしくは、もっと的確な方法はありますでしょうか?
CDockState state;
GetDockState(state);
CMemFile file;
CArchive ar(&file, CArchive::store);
state.Serialize(ar);
int bufSize = file.GetLength();
BYTE* pBuf = file.Detach();
CString strBufSize;
strBufSize.Format(_T("%d"), bufSize);
WritePrivateProfileStruct(_T("SECTION"), _T("BUFFER"), pBuf, bufSize,
_T(".\\DockState.ini"));
free(pBuf);
0920デフォルトの名無しさん
2007/07/09(月) 19:44:400921デフォルトの名無しさん
2007/07/10(火) 11:27:58どのように取得したらよいでしょうか?
theApp.m_hInstance
をGetModuleFileNameに渡してみたのですがDLLも
パスが取得できず、呼び出し元のパスが取得されてしまいます。
よろしくお願いします。
0922デフォルトの名無しさん
2007/07/10(火) 12:41:290923デフォルトの名無しさん
2007/07/10(火) 12:50:500924デフォルトの名無しさん
2007/07/10(火) 12:54:28MFCでしょ?(マイクロソフトの製品)
.NET Frameworkクラスライブラリは、何からできてるの?
0925デフォルトの名無しさん
2007/07/10(火) 12:59:490926デフォルトの名無しさん
2007/07/10(火) 13:22:04Win32に相当するのが.NET Framework
0927デフォルトの名無しさん
2007/07/10(火) 14:38:38で、.NET Frameworkは下請けとしてWin32 APIを呼んでいるはず。
そうでなければ、.NET Frameworkと同じ仕掛けを使えば、システムコール
を使わずにシステムを直接操作できる「セキュリティホール」が存在する
ことになる。
マイクロソフトは、将来的にはMFCやWin32APIを捨てて、.NET Frameworkを
ネイティブなAPIにしたいようだけど、そうなればWindowsエミュレータを
提供しない限り、過去のWindows資産は動かなくなるわけで、下手をすると
Windowsで大きくなってきたMicrosoftの足元をすくうことにもなりかねない。
0928デフォルトの名無しさん
2007/07/10(火) 16:39:57(長くなるのでエラー処理は省いています。)
m_wndSplitter.CreateStatic(this, 1, 2);
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext);
m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CSplitWndTestView), CSize(0, 0), pContext);
上記のような左右分割のスプリットウィンドウは問題ないのですが、
m_wndSplitter.CreateStatic(this, 2, 1);
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CSplitWndTestView), CSize(0, 0), pContext);
上記のような上下分割のスプリットウィンドウを作成仕様とすると、CSplitterWnd::IdFromRowColの下記Assertに引っかかってしまいます。
ASSERT(col < m_nCols);
ちなみにASSERTだけが問題らしく、リリースビルドの場合は問題なく動作しています。
何か書き方に問題がありますでしょうか?
環境はWindowsXP SP2 + Visual Studio 6.0 SP6です。
0929デフォルトの名無しさん
2007/07/10(火) 16:43:15>.NET FrameworkはMFCやATL/WFC等に代わるライブラリ
いや Framework っつーくらいで、実行環境だから。
>ネイティブなAPIにしたいようだけど、
諦めたとか言ってなかったっけ?
つかスレ違いだ。
0930デフォルトの名無しさん
2007/07/10(火) 16:58:34デバッガ持ってないの?
0931デフォルトの名無しさん
2007/07/10(火) 17:25:37の意味を考えればすぐわかりそうなもんだが。
0932デフォルトの名無しさん
2007/07/10(火) 20:01:21>>915=>>917です。その後の経過を報告します。
まず[1.]の方法を試してみましたが、
ボタンの上にポインタがあることを検知できないことに加えて、
Theme系のAPIを使うと、当然ながらWin2k上で動かない、
という問題が発覚しました。
次に[2.]の方法を試してみましたが、
こちらはXP上ではそれっぽく表示され、
2k上ではアイコンなしのボタンとして表示されます。
理想はXPでも2kでもアイコンが表示され、かつXP上ではXPのスタイルに
なることなんですが、現状の選択肢だと[2.]の方法で妥協するか、
全部古いスタイルに統一してしまうか、になりそうです。
それとまた質問なんですが、DrawThemeBackground関数に渡す
BP_PUSHBUTTON とか PBS_NORMAL 等はどこに定義されているんでしょうか?
今回は0,1,2...と渡して実際に動かして試しました。
0933デフォルトの名無しさん
2007/07/10(火) 22:41:21tmschema.h
uxtheme.hの頭の方に、どこで定義されているかは書いてあるんだけどね。
CC6.0以降は自前描画、それより前はBS_ICON+SetIcon、
と使い分けるのが無難かな。多少面倒だけど。
0934デフォルトの名無しさん
2007/07/10(火) 22:45:57[1]では、Windows 2000ならテーマAPIではなく、
GDIのDrawFrameControlかDrawEdgeで枠を書けばいい。
ますます面倒くささに拍車がかかるけど。
0935デフォルトの名無しさん
2007/07/11(水) 20:41:58レスありがとうございます。
基本的に>>933氏のアプローチに沿うかたちになりました。
まずLoadLibraryとGetProcAddressをつかってOpenThemeData関数をコール、
テーマが取得できたらカスタムドローイベントでアイコン部分を描画。
Openしたテーマ自体は使わずにすぐにClose。
テーマが取得できない、あるいはライブラリをロードできない場合は
CButtonをBS_ICONで作り直して普通のアイコンつきボタンにする。
これで一応期待した動作になりました。
なんかCButtonがCreateされたあとはBS_ICONをON/OFFできないみたいなので、
DestroyWindow→Createで作り直すような形になってしまいましたが、
こういうものなんでしょうか。
0936デフォルトの名無しさん
2007/07/13(金) 13:26:29CEditのLineLengthで指定行の文字のバイト数が取得できると思ったんですが、
int len = m_edit1.LineLength(m_edit1.LineIndex(i));
MSDNによると指定された行の長さ (バイト数)と書いてあるので
例えば「あいうえお」とすれば10が返ってくると思ったんですが、実際には5が返ってきます。
これだと全角文字はGetLineで一行取り出す、ということが出来ないんですが、こんなもんなんでしょうか。
0937デフォルトの名無しさん
2007/07/13(金) 13:35:140938デフォルトの名無しさん
2007/07/13(金) 13:40:300939デフォルトの名無しさん
2007/07/13(金) 13:45:51おかしいな、と思い新しいプロジェクトでテストしてみたら、本当ですね・・
ちゃんと10が返ってきてます・・・・おかしい、何かがおかしい、
すみませんでした。
0940デフォルトの名無しさん
2007/07/13(金) 13:47:40いえ、マルチバイトです。
0941デフォルトの名無しさん
2007/07/13(金) 14:10:390942デフォルトの名無しさん
2007/07/13(金) 14:22:02一応、アサートします・・・
0943デフォルトの名無しさん
2007/07/13(金) 14:31:53ASSERTで実行が止まりましたか?
0944デフォルトの名無しさん
2007/07/13(金) 14:32:33はい、止まりました。マルチバイトだからですよね。
0945デフォルトの名無しさん
2007/07/13(金) 15:00:13EM_LINELENGTHの方は
>the return value is the length, in TCHARs
って書いてあるから、MFCの方が間違ってるっぽい。
0946デフォルトの名無しさん
2007/07/13(金) 15:10:210947936
2007/07/13(金) 16:15:39それでもなぜうちだとMBCSにも関わらず文字数が返るのかが分からなかったんです。
いろいろ調べたら、どうやらXPスタイルに問題があるようでした。
XPのSP2(もしかしたら他も)でビジュアルスタイルを適用していると、エディットボックスの挙動が変わるらしいです。
ビジュアルスタイルを外してテストしたらちゃんとバイト数が返ってきました。
でも古臭いのはイヤなので、改行コードやらなにやら自分で取得して一行単位の処理したいと思います。
一日中悩みました。
0948936
2007/07/13(金) 16:20:41ソースまで見てくれてありがとうございました。
僕も見ましたが随分簡単なソースだったんですね。
0949デフォルトの名無しさん
2007/07/13(金) 16:42:27読みたい行数が多い時はGetLine使わない方がいい
だからGetLine使わずに行処理する方法も考えることになる
0950デフォルトの名無しさん
2007/07/13(金) 16:48:07バッファは大目に用意しとけばいいし
エディットコントロールの最大を超えることはないし
0951デフォルトの名無しさん
2007/07/13(金) 17:13:030952デフォルトの名無しさん
2007/07/14(土) 19:57:23CDialogBar内のコンボボックスでリターンキーを押下したときに
イベントを発生させたいのですが、
どうやってCDialogBar内のコンボボックスのリターンキー押下の
メッセージ拾えばいいですか?
0953デフォルトの名無しさん
2007/07/14(土) 20:30:20PreTranslateMessageでできました
スレ汚しスマソ
0954デフォルトの名無しさん
2007/07/15(日) 00:58:020955デフォルトの名無しさん
2007/07/17(火) 10:44:550956デフォルトの名無しさん
2007/07/20(金) 18:04:45この度MDIのプログラムを作りたいのですが、SDIやMDIの場合リソースファイルを
自分で書かないといけないものなのですか?
ダイアログベースの場合はツールボックスからD&Dして作っていて簡単だったんですが
不便ですよね
0957デフォルトの名無しさん
2007/07/20(金) 18:34:55FormViewとか知らんの?
0958デフォルトの名無しさん
2007/07/20(金) 18:45:23およそSDIやMDIは知らなくても出来たのでFormViewとか全くの無知です
やりたい事はMDIベースのダイアログからボタンを押したら
グラフのダイアログ(ビューかな?)やテキスト入力の出来るダイアログを出すことです
0959デフォルトの名無しさん
2007/07/20(金) 19:51:41普通に勉強すればいいよ
0960デフォルトの名無しさん
2007/07/20(金) 19:57:09サンクス
>>958の書込み読んでFormViewを検索して、SDIでもMDIでも新しいプロジェクトの作成から
基底クラスを良く考えて選べば出来そうですね余りにも同じようなプログラムばかり
組んだり改造しているんで世間知らずでしたww、よってこの質問は取り下げます
0961デフォルトの名無しさん
2007/07/21(土) 06:25:55もうくるな
0962デフォルトの名無しさん
2007/07/22(日) 01:38:55MDIの話でもドキュメントテンプレートの理解までもってってくれる
入門書はみたことないしドキュメントテンプレート理解できないと結構ハマルと思うんだ、俺。
0963デフォルトの名無しさん
2007/07/22(日) 03:23:14SDIやダイアログonlyのアプリで複数インスタンス立ち上げ可能な創りの方が合理的だろ
0964デフォルトの名無しさん
2007/07/22(日) 13:37:320965初代スレの>>1
2007/07/23(月) 22:18:45俺はとっくの昔にMFCなんてクズライブラリは見限って
C#とオブジェクト指向で楽チンなプログラミングライフを
送っているというのにお前らときたら大変だなw
同情を禁じ得ない。
0966デフォルトの名無しさん
2007/07/23(月) 22:41:14このスレにいるのは回答側にまわってるだけさ。
0967デフォルトの名無しさん
2007/07/24(火) 00:40:15CEditとかはWizardだとCStringとかにしか定義できません。
参考ページとかでもよいので教えてください。
0968デフォルトの名無しさん
2007/07/24(火) 01:00:20UpdateDataではすべてが更新されてしまいますが
コントロールを指定して一つ一つValidateするにはどうしたらよいでしょうか?
Failを呼び出すとメッセージボックスが出てきてしまいますが
これを独自のエラー表示とするにはどうしたらよいでしょうか?
(たとえばToolTipとかLavelに表示)
0969デフォルトの名無しさん
2007/07/24(火) 08:34:41>DDX_ プロシージャと DDV_ プロシージャの書き方、
>ClassWizard を拡張して独自のルーチンを使う方法についても説明します。
0970デフォルトの名無しさん
2007/07/26(木) 03:19:30VC6.0使いつづけて6年・・・
統合環境の中では軽い方だし最高なのに
0971デフォルトの名無しさん
2007/07/26(木) 20:59:330972デフォルトの名無しさん
2007/07/26(木) 22:01:280973デフォルトの名無しさん
2007/07/26(木) 22:51:160974デフォルトの名無しさん
2007/07/26(木) 23:00:28俺的にはVC2005が割と良かったからそろそろバージョンアップしてもいいと思うが
0975デフォルトの名無しさん
2007/07/26(木) 23:41:030976デフォルトの名無しさん
2007/07/27(金) 05:33:38どう考えても
0977デフォルトの名無しさん
2007/07/29(日) 21:50:54別のダイアログが現れますそのダイアログにはリストボックス、OKボタン、キャンセルボタンが張り付けてあります、
そのリストボックスに、継承関係の無い別クラスから、ファイルを読み出しながら
SendMessage関数でデータを送出してリストボックスに表示させたいのですが可能でしょうか?
0978デフォルトの名無しさん
2007/07/29(日) 22:00:09非同期で処理するなら、別スレッドでファイルを読みつつ、
ダイアログ側はタイマーで随時その内容を取り込むって感じだな。
0979デフォルトの名無しさん
2007/07/29(日) 22:13:08非同期で行うとデータの取りこぼしとか起きないでしょうか?
SendMessage関数のならデータを投げて戻り値も見てるから大丈夫なのかな?
0980デフォルトの名無しさん
2007/07/29(日) 22:25:11たまたま思いついた方法が可能かどうかということ?
漠然と思いついたこと書かれてもイメージつかめない
0981デフォルトの名無しさん
2007/07/29(日) 22:33:46apiを直に呼ぶ場合は別ね
0982デフォルトの名無しさん
2007/07/29(日) 22:35:06すみません曖昧で、データを投げるダイアログのハンドルの取得方法が
分かんなくて困っています、あとその上に貼っているリストボックスのハンドルの
取得方法も教えていただけないでしょうか、宜しくお願いします
レス数が950を超えています。1000を超えると書き込みができなくなります。