Microsoft Foundation Classライブラリ専用スレです。
■MFC相談室 mfc21d.dll■
http://hibari.2ch.net/test/read.cgi/tech/1250919279/l50
■MFC リファレンス■
http://msdn.microsoft.com/ja-jp/library/d06h2x6e(v=VS.100).aspx
探検
MFC相談室 mfc23d.dll [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2016/09/21(水) 00:20:48.44ID:OfO+mYkd26片山博文MZ ◆T6xkBnTXz7B0
2016/11/03(木) 15:43:52.99ID:bkzCM1IA そのテキストファイル、シフトJISになってるぜ
2016/11/03(木) 16:27:10.81ID:kJS9Zyl0
2016/11/03(木) 16:40:23.70ID:s4829peE
>unicodeなら
>30 00 42 00
>か
>00 30 00 42
てのがおかしい。
>30 00 42 00
>か
>00 30 00 42
てのがおかしい。
2016/11/03(木) 19:17:37.78ID:Vul1aP3I
盛り上がってきましたw
2016/11/03(木) 19:25:00.47ID:bkzCM1IA
レス番消えてる。。。荒らしか
2016/11/03(木) 19:31:17.07ID:bkzCM1IA
片山ウザい氏ね
2016/11/03(木) 21:26:45.01ID:HYN+5xRW
たしかにマジウゼー
2016/11/06(日) 23:23:45.08ID:5/z3Ppl4
嫌われ者w
2016/11/07(月) 21:17:10.96ID:71HmpZSZ
プロセスが起動した状態で、
ツールバーのツールチップの文字列を取得、変更したいのですが
ちょっと手こずっています。アドバイスお願いします
以下の方法ではツールチップではなくボタン文字列が対象になるようです
TBBUTTONINFO bi = {sizeof(bi), TBIF_STYLE};
m_wndToolBar.GetToolBarCtrl().GetButtonInfo(9999, &bi);
::MessageBox(NULL, bi.pszText, bi.pszText, MB_OK);
以下はまだ使い方がよくわかってないけど目的がちょっと違うように思われます
CToolTipCtrl* tt = m_wndToolBar.GetToolBarCtrl().GetToolTips();
tt->UpdateTipText(...);
ツールバーのツールチップの文字列を取得、変更したいのですが
ちょっと手こずっています。アドバイスお願いします
以下の方法ではツールチップではなくボタン文字列が対象になるようです
TBBUTTONINFO bi = {sizeof(bi), TBIF_STYLE};
m_wndToolBar.GetToolBarCtrl().GetButtonInfo(9999, &bi);
::MessageBox(NULL, bi.pszText, bi.pszText, MB_OK);
以下はまだ使い方がよくわかってないけど目的がちょっと違うように思われます
CToolTipCtrl* tt = m_wndToolBar.GetToolBarCtrl().GetToolTips();
tt->UpdateTipText(...);
2016/11/08(火) 07:56:03.76ID:Dir9NEfz
>>34
動的な変更は、やった事ないけど、このあたりでは?
ttp://home.att.ne.jp/banana/akatsuki/doc/mfc/mfc22/
アプリを普通に作っていれば、取得はボタンのリソースIDと同じIDを持つSTRINGリソース
動的な変更は、やった事ないけど、このあたりでは?
ttp://home.att.ne.jp/banana/akatsuki/doc/mfc/mfc22/
アプリを普通に作っていれば、取得はボタンのリソースIDと同じIDを持つSTRINGリソース
2016/11/08(火) 22:03:34.52ID:fDzF2sx9
2016/11/16(水) 21:31:23.35ID:7nJMKxmy
ちょっとiconの相談です
MFCでプロジェクト作った際、アプリのicon(IDR_MAINFRAME)にいろんなイメージタイプ
(サイコロ3つ)が作られるけど私は全部設定するの面倒なので32x32 8bit bmpだけ
作って他全部消すようにしてます。皆さんはどうしてます?
いろんな環境に対応するためにあ-いうことしてるのかなーとは思うんだけど..
MFCでプロジェクト作った際、アプリのicon(IDR_MAINFRAME)にいろんなイメージタイプ
(サイコロ3つ)が作られるけど私は全部設定するの面倒なので32x32 8bit bmpだけ
作って他全部消すようにしてます。皆さんはどうしてます?
いろんな環境に対応するためにあ-いうことしてるのかなーとは思うんだけど..
38片山博文MZ ◆T6xkBnTXz7B0
2016/11/16(水) 21:43:12.65ID:qcIR6hue >>37
アイコンのイメージ作成にはInkscapeを使ってるよ。
お金に余裕があればAdobe Illustrator使えばいいんじゃないかな。
32x32だけだとユーザーに汚い画像を見せることになる。
アイコンのイメージ作成にはInkscapeを使ってるよ。
お金に余裕があればAdobe Illustrator使えばいいんじゃないかな。
32x32だけだとユーザーに汚い画像を見せることになる。
2016/11/16(水) 22:59:39.33ID:qcIR6hue
>>38
Inkscape(笑) ダセーw
Inkscape(笑) ダセーw
4137
2016/11/16(水) 23:54:39.55ID:7nJMKxmy > 32x32だけだとユーザーに汚い画像を見せることになる。
解像度を変えてのテストはある程度してるけどあまり気になったことないなー
私の想定を超えたデバイスだと汚くなるのかな?Inkscapeは落とした。勉強してみます。
片山博士は大きく&色彩豊かなicon作った後でInkscape使って縮小/減色してるの?
解像度を変えてのテストはある程度してるけどあまり気になったことないなー
私の想定を超えたデバイスだと汚くなるのかな?Inkscapeは落とした。勉強してみます。
片山博士は大きく&色彩豊かなicon作った後でInkscape使って縮小/減色してるの?
42片山博文MZ ◆T6xkBnTXz7B0
2016/11/17(木) 00:07:27.86ID:TXdVmO9D Inkscapeで256x256ピクセル(Vistaサイズ)にしてから図形を描いてとりあえず保存すればSVG形式ファイルになる。
「ファイル」メニューの「PNG形式でエクスポート」を選べばPNG画像が吐き出される。
それを16x16,32x32,48x4864x64に縮小して、見辛いピクセルを細かく補正してからアイコン作成ソフトに取り込むとアイコンができる。
「ファイル」メニューの「PNG形式でエクスポート」を選べばPNG画像が吐き出される。
それを16x16,32x32,48x4864x64に縮小して、見辛いピクセルを細かく補正してからアイコン作成ソフトに取り込むとアイコンができる。
43片山博文MZ ◆T6xkBnTXz7B0
2016/11/17(木) 00:15:30.72ID:TXdVmO9D Inkscapeは図形の合成などの強力な編集機能があるが、
図形が足りなければワード、エクセルの図形をコピペすればいい。
図形が足りなければワード、エクセルの図形をコピペすればいい。
44片山博文MZ ◆T6xkBnTXz7B0
2016/11/17(木) 00:23:23.58ID:TXdVmO9D 時間がないときは文字アイコンだね。1文字をアイコンにするだけで
インパクトあるかもしれない。
インパクトあるかもしれない。
45片山博文MZ ◆T6xkBnTXz7B0
2016/11/17(木) 00:29:46.37ID:TXdVmO9D 「アンチエイリアス」がかかると、どうしても細部がぼやけてしまう。
小さいアイコンでは、ユーザーにはっきり見えるように微細な加工をした方がいい。
小さいアイコンでは、ユーザーにはっきり見えるように微細な加工をした方がいい。
2016/11/17(木) 07:07:34.33ID:gXcsVs3+
片山ueeeeeeeeeeeeeeee
4737
2016/11/17(木) 07:08:48.33ID:0g51nw+9 詳しい説明ありがとう
2016/11/18(金) 16:59:51.57ID:+QqWh5ch
片山先生はアイコン一つにも手を抜かないんだな。
お前らも見習うべき
お前らも見習うべき
2016/12/20(火) 20:31:33.27ID:TcHawI4o
CListView(LVS_OWNERDATA style指定)で特定の行の選択を禁止したいのですが
LVN_ITEMCHANGINGはOWNERDATAの場合は送られない様です。by msdn
何か良い方法は無いでしょうか。
クリックやENTERを潰すしかないんでしょうか?
LVN_ITEMCHANGINGはOWNERDATAの場合は送られない様です。by msdn
何か良い方法は無いでしょうか。
クリックやENTERを潰すしかないんでしょうか?
5049
2016/12/26(月) 20:33:00.82ID:LBPR2r0v 選択禁止は諦めました。
選択された後、近くの行を強制的に選択状態にするようにししたら、あまり違和感がなかったので、これでごまかします。
選択された後、近くの行を強制的に選択状態にするようにししたら、あまり違和感がなかったので、これでごまかします。
2017/01/17(火) 18:47:51.47ID:BjvebHTO
CArrayの質問なんですが、
CArray<int> test;
test.SetSize(10);
とやった場合、test[0]〜test[9]までの値は、
0で初期化されていることは、前提として良い動作ですか?
ソースを見たところ、SetSize()で確保したバッファをいったんゼロクリアして、
その後、各要素に対してコンストラクタが呼ばれるようなので、
C++のintのコンストラクタが「なにもしない」という仕様なら大丈夫そうですが。
CArray<int> test;
test.SetSize(10);
とやった場合、test[0]〜test[9]までの値は、
0で初期化されていることは、前提として良い動作ですか?
ソースを見たところ、SetSize()で確保したバッファをいったんゼロクリアして、
その後、各要素に対してコンストラクタが呼ばれるようなので、
C++のintのコンストラクタが「なにもしない」という仕様なら大丈夫そうですが。
2017/01/18(水) 20:04:22.77ID:dWVIY9sh
intのようなプリミティブな型にもコンストラクタってあるの?
知らなかった
知らなかった
2017/02/06(月) 23:41:58.25ID:sJV81fCO
MFCでリボンアプリケーション組もうとしてるんですけど、
リボンデサイナでダイアログボックス起動ツールのボタンは
付けられないのでしょうか?
例えばWORDとかでフォントグループの右下にある小さい四角いボタンです。
リボンデサイナでダイアログボックス起動ツールのボタンは
付けられないのでしょうか?
例えばWORDとかでフォントグループの右下にある小さい四角いボタンです。
2017/02/15(水) 15:11:12.80ID:WDBEc38A
MFCでCEditをサブクラス化したいと思うのですがうまくいきません
サブクラス化時にFromHandlePermanetと言う関数が呼ばれてそこでASSERTに引っ掛かってしまいます
MSDNによると「SubclassWindowを呼び出す時、ウィンドウがMFCオブジェクトに結びつけられていないようにしろ」とあります
馬鹿で申し訳ないのですが、ウィンドウがMFCオブジェクトに結びつけられるのはどのタイミングなのでしょうか?
今はCEdit::Create後にサブクラス化を試みています
サブクラス化時にFromHandlePermanetと言う関数が呼ばれてそこでASSERTに引っ掛かってしまいます
MSDNによると「SubclassWindowを呼び出す時、ウィンドウがMFCオブジェクトに結びつけられていないようにしろ」とあります
馬鹿で申し訳ないのですが、ウィンドウがMFCオブジェクトに結びつけられるのはどのタイミングなのでしょうか?
今はCEdit::Create後にサブクラス化を試みています
2017/02/15(水) 15:59:13.06ID:IaTHaUdU
>>53
ああ、あの2ミリ角くらいの小さな四角ね。
ああ、あの2ミリ角くらいの小さな四角ね。
56片山博文MZ ◆T6xkBnTXz7B0
2017/02/15(水) 16:57:51.66ID:sI0w68I357デフォルトの名無しさん
2017/02/15(水) 17:29:15.59ID:WDBEc38A >>56
ありがとうございます
しかしながらCEditから派生させたクラスをnewを使用して動的に作成しています
newによりインスタンスを動的に作成
↓
Createメンバ関数を呼び出しコントロールを作成
↓
サブクラス化
↓
ASSERT
ありがとうございます
しかしながらCEditから派生させたクラスをnewを使用して動的に作成しています
newによりインスタンスを動的に作成
↓
Createメンバ関数を呼び出しコントロールを作成
↓
サブクラス化
↓
ASSERT
2017/02/15(水) 17:43:20.32ID:WDBEc38A
途中で送信してしまいました
現状はこんな感じでアサートに引っ掛かってしまいます
デバッガで追うとウィンドウのMAP(?)にサブクラス化対象のウィンドウが既に存在しているとアサートされるようなのですが、このウィンドウマップにどこで登録されるのかが解りません
マップに登録される=MSDNの言う「ウィンドウをMFCオブジェクトに結び付ける」と言うことなのかと推測しています
現状はこんな感じでアサートに引っ掛かってしまいます
デバッガで追うとウィンドウのMAP(?)にサブクラス化対象のウィンドウが既に存在しているとアサートされるようなのですが、このウィンドウマップにどこで登録されるのかが解りません
マップに登録される=MSDNの言う「ウィンドウをMFCオブジェクトに結び付ける」と言うことなのかと推測しています
2017/02/15(水) 17:49:31.94ID:urFAvqLF
その工程ならサブクラス化はいらないはず
でもウィザードを使わずにクラスを作ったら
おまじないマクロがついてこないんじゃないかな
後始末のときにオブジェクト開放が先かウインドウ破棄が先かってのも迷う
でもウィザードを使わずにクラスを作ったら
おまじないマクロがついてこないんじゃないかな
後始末のときにオブジェクト開放が先かウインドウ破棄が先かってのも迷う
60デフォルトの名無しさん
2017/02/15(水) 19:18:20.41ID:WDBEc38A >>59
ありがとうございます
説明不足で申し訳ありません
そもそも何故エディットボックスをサブクラス化したいかというとエディットボックスのコンテキストメニューを改造したいためなのです
エディットボックスにくるWN_RBUTTONDOWNをトラップするため、サブクラス化が必須になっている次第です
ありがとうございます
説明不足で申し訳ありません
そもそも何故エディットボックスをサブクラス化したいかというとエディットボックスのコンテキストメニューを改造したいためなのです
エディットボックスにくるWN_RBUTTONDOWNをトラップするため、サブクラス化が必須になっている次第です
2017/02/15(水) 19:36:45.27ID:sI0w68I3
2017/02/15(水) 19:40:04.43ID:8VpWPRqB
Createするから既存になってしまうんじゃないの?
>>57でいうサブクラス化ってSubclassWindow? SubclassDlgItem?
CEditのサブクラスは時々使うけどSubclassWindow経由では使ってないので
外してたらスマソ
>>57でいうサブクラス化ってSubclassWindow? SubclassDlgItem?
CEditのサブクラスは時々使うけどSubclassWindow経由では使ってないので
外してたらスマソ
6362
2017/02/15(水) 19:46:05.27ID:8VpWPRqB2017/02/15(水) 19:51:10.47ID:uPR4+QIT
自分でサブクラス化したときはDDX_Controlを削らないとうまく動いてくれなかったような気がする。
正解は知らんが。
正解は知らんが。
2017/02/15(水) 19:57:49.61ID:IaTHaUdU
66デフォルトの名無しさん
2017/02/15(水) 20:56:19.16ID:WDBEc38A67デフォルトの名無しさん
2017/02/15(水) 20:58:48.04ID:WDBEc38A68デフォルトの名無しさん
2017/02/15(水) 21:01:57.77ID:WDBEc38A >>65
エディットボックスのマウス右クリックはサブクラス化が必要なようです
でも確かになにかコンテキスト〜というメッセージがあったような気もしないでもないのですが…
WEBで調べた限りですと右クリックメッセージをフックしているのしか出てきませんでした
エディットボックスのマウス右クリックはサブクラス化が必要なようです
でも確かになにかコンテキスト〜というメッセージがあったような気もしないでもないのですが…
WEBで調べた限りですと右クリックメッセージをフックしているのしか出てきませんでした
6962
2017/02/15(水) 21:37:49.75ID:8VpWPRqB 回答ではなく代替案ですが
1. CEditのサブクラスでOnContextMenuをオーバーライドしてメニュー処理を記述。
2. https://support.microsoft.com/ja-jp/help/403856
中の
また、CDialog::DoDataExchange() で DDX を使用して..
のやりかたで CEditをCYourEditに変更。
で独自のコンテキストメニューは出ますよ。
1. CEditのサブクラスでOnContextMenuをオーバーライドしてメニュー処理を記述。
2. https://support.microsoft.com/ja-jp/help/403856
中の
また、CDialog::DoDataExchange() で DDX を使用して..
のやりかたで CEditをCYourEditに変更。
で独自のコンテキストメニューは出ますよ。
2017/02/15(水) 21:47:42.01ID:WDBEc38A
2017/02/20(月) 02:48:59.49ID:oIbcE82M
明日もあさっても過ぎたんだけど、どうなったんだろうね。
2017/02/22(水) 11:13:17.19ID:T1tKwjPz
事務所をロックアウトされて入れません
2017/02/27(月) 15:33:23.44ID:APOfiEEu
>>71
これは失礼しました
解決しましたのでご報告致します
結果的にはサブクラス化出来ました
動的にCEditを生成した際、実際のコントロールをCriateメソッドで生成すると思いますが一旦生成してしまうとサブクラス化できないようです
CMyEdit pualic CEdit として派生
CMyEdit lpCMyEdit = new CMyEdit;
lpCMyEdit->SubclassWindow(...←ここでサブクラス化
lpCMyEdit->Crate(...←コントロール作成
上記の手順でサブクラス化できましたのでWM_CONTEXTやWM_CHARに対してメッセージトラップが可能になりましたので全て実現できました
MFCのいう、ウィンドウの関連付けというのは恐らくコントロール作成時にWindowMapというMFCのクラスに登録されることかと思われます
改めて色々と相談に乗っていただき有り難うございました
また何かありましたら質問させて頂きます
>>72
間一髪間に合いました
これは失礼しました
解決しましたのでご報告致します
結果的にはサブクラス化出来ました
動的にCEditを生成した際、実際のコントロールをCriateメソッドで生成すると思いますが一旦生成してしまうとサブクラス化できないようです
CMyEdit pualic CEdit として派生
CMyEdit lpCMyEdit = new CMyEdit;
lpCMyEdit->SubclassWindow(...←ここでサブクラス化
lpCMyEdit->Crate(...←コントロール作成
上記の手順でサブクラス化できましたのでWM_CONTEXTやWM_CHARに対してメッセージトラップが可能になりましたので全て実現できました
MFCのいう、ウィンドウの関連付けというのは恐らくコントロール作成時にWindowMapというMFCのクラスに登録されることかと思われます
改めて色々と相談に乗っていただき有り難うございました
また何かありましたら質問させて頂きます
>>72
間一髪間に合いました
2017/02/27(月) 15:36:16.33ID:APOfiEEu
>>73
誤字が…多かったです、すみません
誤字が…多かったです、すみません
2017/03/02(木) 18:53:27.03ID:5095SEQp
>>73
リソースにエディットがないのに、SubclassWindow()を呼び出したって…
一体何をサブクラス化したんだろう…
リソースにエディットがなければ Create() だけでいい
リソースにエディットがあるなら SubclassWindow() だけでいい
(この場合は、69さんの2のやり方が普通だと思う)
リソースにエディットがないのに、SubclassWindow()を呼び出したって…
一体何をサブクラス化したんだろう…
リソースにエディットがなければ Create() だけでいい
リソースにエディットがあるなら SubclassWindow() だけでいい
(この場合は、69さんの2のやり方が普通だと思う)
7662
2017/03/02(木) 19:31:25.20ID:icVxeh77 改めてよく読んだらおかしいねw
SubclassWindowのパラメータに何を渡したんだろう
本人が解決したって言ってるんだから別にいいけど
SubclassWindowのパラメータに何を渡したんだろう
本人が解決したって言ってるんだから別にいいけど
2017/03/02(木) 19:58:19.05ID:i8opxKVO
>>75
MFC使い方がよくわかってなくて混乱させているようで誠に申し訳ないです…
CEditをnewにて動的に作っていますのでリソースは一切使っていないです
具体的にはエクセルのシートの様な格子形のグラフィックを描画し、そのカラムをクリック等された際にエディットボックスを動的にカラムの座標に作っています
MFC使い方がよくわかってなくて混乱させているようで誠に申し訳ないです…
CEditをnewにて動的に作っていますのでリソースは一切使っていないです
具体的にはエクセルのシートの様な格子形のグラフィックを描画し、そのカラムをクリック等された際にエディットボックスを動的にカラムの座標に作っています
2017/03/03(金) 12:50:31.31ID:fzOn+GKU
>>76
SubclassWindowにはCEdit派生の独自クラスを渡しています
自分は普段SDKしか使わないためSDKの感覚なのですが、ウィンドウのサブクラス化とは、サブクラス化したいウィンドウハンドルのウィンドウプロシジャのアドレスを別途作成した独自ウィンドウプロシジャのアドレスと差し替える事と認識しています
ですのでSubclassWindowに渡すハンドルはサブクラス化したいウィンドウのハンドルと思っていましたが何か別のパターンがあるのでしょうか?
SubclassWindowにはCEdit派生の独自クラスを渡しています
自分は普段SDKしか使わないためSDKの感覚なのですが、ウィンドウのサブクラス化とは、サブクラス化したいウィンドウハンドルのウィンドウプロシジャのアドレスを別途作成した独自ウィンドウプロシジャのアドレスと差し替える事と認識しています
ですのでSubclassWindowに渡すハンドルはサブクラス化したいウィンドウのハンドルと思っていましたが何か別のパターンがあるのでしょうか?
2017/03/03(金) 16:16:47.27ID:Mc9uDdoy
>>78
> CMyEdit public CEdit として派生
> CMyEdit* lpCMyEdit = new CMyEdit;
ここでは、まだウィンドウは無い (コンストラクタに小細工がなければ)
> lpCMyEdit->SubclassWindow(...←ここでサブクラス化
もし以下のように書いたとしても、ハンドルは NULL だからサブクラス化できない
lpCMyEdit->SubclassWindow(lpCMyEdit->GetSafeHwnd());
> lpCMyEdit->Create(...←コントロール作成
この中で、ウィンドウが作成されサブクラス化される
なので SubclassWindow() の明示的な呼び出しは不要
> CMyEdit public CEdit として派生
> CMyEdit* lpCMyEdit = new CMyEdit;
ここでは、まだウィンドウは無い (コンストラクタに小細工がなければ)
> lpCMyEdit->SubclassWindow(...←ここでサブクラス化
もし以下のように書いたとしても、ハンドルは NULL だからサブクラス化できない
lpCMyEdit->SubclassWindow(lpCMyEdit->GetSafeHwnd());
> lpCMyEdit->Create(...←コントロール作成
この中で、ウィンドウが作成されサブクラス化される
なので SubclassWindow() の明示的な呼び出しは不要
2017/03/03(金) 20:49:57.22ID:GdXfDzVm
>>78
CEditをどういう風にカスタマイズしたいのかわからんが
>CEdit派生の独自クラス
の段階でそれを実装できないの?
通常サブクラス化を必要とするのは(通常の手段では)派生クラスを置けないダ
イアログ上のコントロールに対しての場合のみで、そうで無い場合は必要な機
能を実装したCEdit派生クラスをCreate()するだけで実現できると思うんだが・・
MFCでは(メッセージマップの仕掛けによって)ほぼ全てのメッセージを派生ク
ラスで独自処理を行えるので、サブクラス化は必要ないはずです。
CEditをどういう風にカスタマイズしたいのかわからんが
>CEdit派生の独自クラス
の段階でそれを実装できないの?
通常サブクラス化を必要とするのは(通常の手段では)派生クラスを置けないダ
イアログ上のコントロールに対しての場合のみで、そうで無い場合は必要な機
能を実装したCEdit派生クラスをCreate()するだけで実現できると思うんだが・・
MFCでは(メッセージマップの仕掛けによって)ほぼ全てのメッセージを派生ク
ラスで独自処理を行えるので、サブクラス化は必要ないはずです。
2017/03/03(金) 21:07:16.24ID:4N2nnk0c
2017/03/03(金) 23:45:50.26ID:fzOn+GKU
>>79
なるほど、確かに仰る通りです
MFCだと定義済みコントロールを作成したタイミングでサブクラス化が自動的に行われているんですか…知らなかった…
SubclassWindowの戻り値を確認してみます
なるほど、確かに仰る通りです
MFCだと定義済みコントロールを作成したタイミングでサブクラス化が自動的に行われているんですか…知らなかった…
SubclassWindowの戻り値を確認してみます
2017/03/03(金) 23:47:56.70ID:fzOn+GKU
2017/03/03(金) 23:49:20.96ID:fzOn+GKU
2017/03/04(土) 06:08:14.80ID:5oPjtzPk
>83
不要
不要
2017/03/12(日) 16:57:53.13ID:L/+Vp36z
2017/03/12(日) 20:13:37.36ID:g7gIuH2o
そもそもなぜサブクラス化って言うの?
クラスとは関係ないと思うんですが
クラスとは関係ないと思うんですが
2017/03/12(日) 20:23:14.61ID:DJd+bif5
サブクラス化というネーミングはイマイチだとずっと思ってた。
APIの名称から来てるから翻訳者に罪はないが、、
VS2017入れてみたけど_MFC_VERは変化なし。
残念だ。
APIの名称から来てるから翻訳者に罪はないが、、
VS2017入れてみたけど_MFC_VERは変化なし。
残念だ。
2017/03/12(日) 20:33:34.83ID:l5dI0q1q
>>87
多分ウィンドウクラスを横取りするからじゃないかな?
多分ウィンドウクラスを横取りするからじゃないかな?
2017/04/02(日) 01:00:25.54ID:4o8Jb7FT
実際クラスとは関係ないと思う
ファーストクラスとかも全然クラス関係ないし
英語にそういうニュアンスがあるんじゃないの
ファーストクラスとかも全然クラス関係ないし
英語にそういうニュアンスがあるんじゃないの
2017/04/13(木) 15:17:28.33ID:O8cH7Ezk
Windows1.0のときからあるし、オブジェクト指向の用語とは別路線で発生したもんだしなあ
2017/04/13(木) 21:53:13.05ID:rVYtPk7E
GUI自体がオブジェクト指向の影響下で発展してきたわけで、別路線ってことはないだろう。
ウィンドウクラスごとにそれぞれ異なるWinProcを指す仕組みなんてほとんどv-tableだし。
ウィンドウクラスごとにそれぞれ異なるWinProcを指す仕組みなんてほとんどv-tableだし。
2017/04/14(金) 10:48:36.47ID:L6e5ZQwW
確かWin32APIはsmalltalk由来のメッセージパッシング式オブジェクト指向を意識して作られたとかなんとか。
んで、C++はメッセージパッシング意識して作られてなかったから、言語自体を拡張されたのがC++Builderで、言語は拡張せず、メッセージテーブル作って無理くり対応したのがVCのMFCって何かで読んだ。
そう考えるとMFC以前はCでどうにかオブジェクト指向と言うより、メッセージパッシングを実現しようとしてWin32APIが出来たんだろね。
んで、C++はメッセージパッシング意識して作られてなかったから、言語自体を拡張されたのがC++Builderで、言語は拡張せず、メッセージテーブル作って無理くり対応したのがVCのMFCって何かで読んだ。
そう考えるとMFC以前はCでどうにかオブジェクト指向と言うより、メッセージパッシングを実現しようとしてWin32APIが出来たんだろね。
2017/04/16(日) 20:06:30.26ID:5A0Iky+5
Win16の存在が消されてる...
2017/04/17(月) 00:21:05.80ID:6QpAECc+
生まれてなかったんで。
そう言えばWin16sとの互換性のためとか勉強した覚えある。
そう言えばWin16sとの互換性のためとか勉強した覚えある。
2017/04/17(月) 00:52:44.41ID:tarAwmvI
win32sならやったけど、Win16sは知らないなあ。
2017/04/17(月) 08:58:12.02ID:V9IKpLf1
揚げ足どりにも程があるw
2017/04/27(木) 23:52:23.90ID:fIPmJDul
IT業界を離れて10数年経つ者です。
いまどき高速なアプリを手軽に作りたい場合、現役の方はどういう環境で作っています?
当時は主にMFC、たまにC++Builderでやってました。重くても良い場合はVBも使いました。
出来れば今後10年使えそうな奴をお願いします。今もたまに簡単なツールを作る機会が
ありますが、その際はMFCで作っています。多少勉強する覚悟はあります。
よろしくお願いします。
いまどき高速なアプリを手軽に作りたい場合、現役の方はどういう環境で作っています?
当時は主にMFC、たまにC++Builderでやってました。重くても良い場合はVBも使いました。
出来れば今後10年使えそうな奴をお願いします。今もたまに簡単なツールを作る機会が
ありますが、その際はMFCで作っています。多少勉強する覚悟はあります。
よろしくお願いします。
2017/04/28(金) 01:05:33.78ID:1gQE0OT9
100デフォルトの名無しさん
2017/04/29(土) 20:05:07.24ID:cs4H/lwY >>98
本当に経験者ならこんな質問はしないやな
本当に経験者ならこんな質問はしないやな
101デフォルトの名無しさん
2017/04/29(土) 21:27:44.34ID:p2ephTDn >>98
C#
C#
102デフォルトの名無しさん
2017/05/01(月) 17:24:45.69ID:tRarccr2 C#やっときゃなんとかなる
103デフォルトの名無しさん
2017/05/01(月) 22:10:24.46ID:ybWlfBdW WPFやUWPは廃れても、C#とXAMLは残ってそう。
C++とMFCも地味に残ってるだろうけど。。。
C++とMFCも地味に残ってるだろうけど。。。
10498
2017/05/01(月) 23:13:30.10ID:MV/lR732 ご意見ありがとうございます。
参考にします。
参考にします。
105デフォルトの名無しさん
2017/05/07(日) 20:46:12.14ID:904pYcPE C#意外と人気なんだな・・・驚いた
106デフォルトの名無しさん
2017/05/10(水) 00:20:17.07ID:+OKBVlnQ MFCで印刷プレビューのリボンバーってどうやってカスタマイズするの??
107デフォルトの名無しさん
2017/05/23(火) 19:47:17.95ID:U7efYych MDIの子ウィンドウのハンドルはどこですかぁ〜
108デフォルトの名無しさん
2017/05/24(水) 06:22:57.52ID:r4nnDW8T109デフォルトの名無しさん
2017/05/30(火) 19:18:12.89ID:R0a35IVC > CCriticalSection オブジェクトの使用方式は、2 とおりあります。
> スタンドアロン方式、およびクラスに埋め込む方式です。
>
> スタンドアロン方式
> CCriticalSection オブジェクトをスタンドアロンで使うには、
> 必要が生じたときに CCriticalSection オブジェクトを構築します。
> コンストラクタから正常に戻った後、Lock を呼び出してオブジェクトを明示的にロックします。
> クリティカル セクションへのアクセスが完了したら、Unlock を呼び出します。
> この方法はソース コードを読んだ人にはわかりやすいのですが、
> アクセスの前後でクリティカル セクションをロック、アンロックすることを
> 覚えておかなければならないため、エラーを引き起こす傾向があります。
> より望ましいのは、CSingleLock クラスを使う方法です。
> この場合も Lock メソッドおよび Unlock メソッドを使いますが、
> 例外が発生したときにリソースのロックを解除する必要はありません。
>
> 埋め込み方式
> CCriticalSection 型のデータ メンバをクラスに追加し、
> 必要に応じてロックすると、複数のスレッドでクラスを共有することもできます。
MSDNのCCriticalSectionの説明には、上のように書かれているのですが、
このスタンドアロン方式って、どういう意図なのでしょうか。
普通に読めば、関数の内部でローカル変数として宣言するように思えるのですが、
それだと全く排他制御になっていないのでは?
> スタンドアロン方式、およびクラスに埋め込む方式です。
>
> スタンドアロン方式
> CCriticalSection オブジェクトをスタンドアロンで使うには、
> 必要が生じたときに CCriticalSection オブジェクトを構築します。
> コンストラクタから正常に戻った後、Lock を呼び出してオブジェクトを明示的にロックします。
> クリティカル セクションへのアクセスが完了したら、Unlock を呼び出します。
> この方法はソース コードを読んだ人にはわかりやすいのですが、
> アクセスの前後でクリティカル セクションをロック、アンロックすることを
> 覚えておかなければならないため、エラーを引き起こす傾向があります。
> より望ましいのは、CSingleLock クラスを使う方法です。
> この場合も Lock メソッドおよび Unlock メソッドを使いますが、
> 例外が発生したときにリソースのロックを解除する必要はありません。
>
> 埋め込み方式
> CCriticalSection 型のデータ メンバをクラスに追加し、
> 必要に応じてロックすると、複数のスレッドでクラスを共有することもできます。
MSDNのCCriticalSectionの説明には、上のように書かれているのですが、
このスタンドアロン方式って、どういう意図なのでしょうか。
普通に読めば、関数の内部でローカル変数として宣言するように思えるのですが、
それだと全く排他制御になっていないのでは?
110デフォルトの名無しさん
2017/05/31(水) 00:18:49.47ID:VxTDzTEq Mutexみたいに名前付きなら上のスタンドアロン方式も理解できるけど名前ないからなー
わかんね
わかんね
111デフォルトの名無しさん
2017/05/31(水) 10:12:23.47ID:7kWP6r82 CCriticalSectionインスタンスが同期オブジェクトなわけではないよ。
クリティカルセクションは名前の通りクリティカルな区間のこと。Win32APIのEnterCriticalSection()からLeaveCriticalSection()の区間。
CCriticalSectionはこれのラッパー。
クリティカルセクションに入るスレッドはプロセスで一つだけになる。
プロセス間排他はできない代わりに軽い。
同期オブジェクトがプロセスで一つだけになのと同義。
マルチコア・マルチスレッドでロック待ちが無視できなくなるようなら他の使う。
クリティカルセクションは名前の通りクリティカルな区間のこと。Win32APIのEnterCriticalSection()からLeaveCriticalSection()の区間。
CCriticalSectionはこれのラッパー。
クリティカルセクションに入るスレッドはプロセスで一つだけになる。
プロセス間排他はできない代わりに軽い。
同期オブジェクトがプロセスで一つだけになのと同義。
マルチコア・マルチスレッドでロック待ちが無視できなくなるようなら他の使う。
112デフォルトの名無しさん
2017/05/31(水) 13:08:02.66ID:ZVZYbrmW >>111
クリティカルセクションという用語は>>111の言う様に元々「クリティカルな区間」のことだが、Win32では
スレッド間排他処理のための同期オブジェクトとして"CRITICAL_SECTION"があり、CCriticalSectionはこのラッパー。
( https://msdn.microsoft.com/ja-jp/library/cc429052.aspx にも"「クリティカル セクション」は、Win32の基本的な同期オブジェクトの1つです。"と書かれている)
>>109
確かにその説明はチンプンカンプンだねえ。
推測だけど、たとえばCStringをスレッド間排他制御するために
CString strFoo ;
CCriticalSection csForFoo ; // 非AUTO
:
csForFoo.Lock() ;
strFoo += strBar ;
csForFoo.Unlock() ;
:
みたいに書く(定義上はcsForFooはstrFooと結びついていない)のが、「スタンドアロン方式」で
class CThreadSafeString : public CString {
private:
CCriticalSection csForMe ;
public:
void ThreadSafeAppend( LPCSTR p ) {
csForMe.Lock() ;
*this += p ;
csForMe.Unlock() ;
}
} ;
みたいに書く(クラスに排他処理を埋め込む)のが「埋め込み方式」じゃないかなあ。
で、いずれの方式でも上記のような記述では「クリティカルな区間」で例外が発生するとUnlock()が実行されないので、これを避けるため、CSingleLockクラスを使えと。
クリティカルセクションという用語は>>111の言う様に元々「クリティカルな区間」のことだが、Win32では
スレッド間排他処理のための同期オブジェクトとして"CRITICAL_SECTION"があり、CCriticalSectionはこのラッパー。
( https://msdn.microsoft.com/ja-jp/library/cc429052.aspx にも"「クリティカル セクション」は、Win32の基本的な同期オブジェクトの1つです。"と書かれている)
>>109
確かにその説明はチンプンカンプンだねえ。
推測だけど、たとえばCStringをスレッド間排他制御するために
CString strFoo ;
CCriticalSection csForFoo ; // 非AUTO
:
csForFoo.Lock() ;
strFoo += strBar ;
csForFoo.Unlock() ;
:
みたいに書く(定義上はcsForFooはstrFooと結びついていない)のが、「スタンドアロン方式」で
class CThreadSafeString : public CString {
private:
CCriticalSection csForMe ;
public:
void ThreadSafeAppend( LPCSTR p ) {
csForMe.Lock() ;
*this += p ;
csForMe.Unlock() ;
}
} ;
みたいに書く(クラスに排他処理を埋め込む)のが「埋め込み方式」じゃないかなあ。
で、いずれの方式でも上記のような記述では「クリティカルな区間」で例外が発生するとUnlock()が実行されないので、これを避けるため、CSingleLockクラスを使えと。
113デフォルトの名無しさん
2017/06/04(日) 22:05:56.04ID:rXndkeA4 >>110-112
解説ありがとうございます。
> CCriticalSection csForFoo ; // 非AUTO
> :
> csForFoo.Lock() ;
> strFoo += strBar ;
> csForFoo.Unlock() ;
この使い方が当初の疑問だったのですが、
このローカル変数としての使い方って、意味ありますか?
試しに同じような処理を作って、複数のスレッドから同時に呼んでみても、
全く排他制御されているように見えなかったのですが。
解説ありがとうございます。
> CCriticalSection csForFoo ; // 非AUTO
> :
> csForFoo.Lock() ;
> strFoo += strBar ;
> csForFoo.Unlock() ;
この使い方が当初の疑問だったのですが、
このローカル変数としての使い方って、意味ありますか?
試しに同じような処理を作って、複数のスレッドから同時に呼んでみても、
全く排他制御されているように見えなかったのですが。
114デフォルトの名無しさん
2017/06/05(月) 10:47:00.10ID:CcS2OTgy115デフォルトの名無しさん
2017/06/05(月) 12:03:45.22ID:umvVrk12 >>114
> CCriticalSection csForFoo ; // 非AUTO
> :
> csForFoo.Lock() ;
ああ、このcsForFooは関数内の自動変数ではなくて、
関数外なり静的変数なりで定義されているものいうことでしたか。
> 普通に読めば、関数の内部でローカル変数として宣言するように思えるのですが
の「ローカル変数」は、「自動変数」の意味でした。
失礼しました。
> CCriticalSection csForFoo ; // 非AUTO
> :
> csForFoo.Lock() ;
ああ、このcsForFooは関数内の自動変数ではなくて、
関数外なり静的変数なりで定義されているものいうことでしたか。
> 普通に読めば、関数の内部でローカル変数として宣言するように思えるのですが
の「ローカル変数」は、「自動変数」の意味でした。
失礼しました。
116デフォルトの名無しさん
2017/06/05(月) 19:28:46.05ID:SdDD09qt >>109の原文(MSDN)には
construct the CCriticalSection object when it is needed.
と書かれているからCCriticalSection objectはオート変数と解釈してもおかしくは無い気がする。
staticならあらかじめになってしまう。
construct the CCriticalSection object when it is needed.
と書かれているからCCriticalSection objectはオート変数と解釈してもおかしくは無い気がする。
staticならあらかじめになってしまう。
117デフォルトの名無しさん
2017/06/06(火) 17:22:09.38ID:2bddCvIA >>116
「コンストラクタから正常に戻った後、Lock を呼び出して」
とも書いてあるので、普通に読めば自動変数ですよねぇ。
でも、自動変数のCCriticalSectionをロックしても排他制御になっていないはずだし、
これはどういう意図なんだろうか、という質問でした。
「コンストラクタから正常に戻った後、Lock を呼び出して」
とも書いてあるので、普通に読めば自動変数ですよねぇ。
でも、自動変数のCCriticalSectionをロックしても排他制御になっていないはずだし、
これはどういう意図なんだろうか、という質問でした。
118デフォルトの名無しさん
2017/11/29(水) 18:24:25.41ID:HFlnlUlA MFC MDIで2つのメニューを出したいので、mainframeにCMFCMenuBarを2つ作って、2つCreateすると、2つ目のCreateはAssertでとまってしまいます。2つのメニューを表示させる方法はありませんか?
119デフォルトの名無しさん
2017/11/30(木) 13:32:53.51ID:isxZpuq9 >>118
「Method should be called once!」
なんてコメントが入ってるくらいだから、メニューは一つという設計なんだろう。
CMFCToolBarにCMFCToolBarMenuButtonを並べたほうが早いかも。
見た目を完全にメニューと合わせるなら、派生クラスを作ってオーバーライドする必要もあるだろうけど。
「Method should be called once!」
なんてコメントが入ってるくらいだから、メニューは一つという設計なんだろう。
CMFCToolBarにCMFCToolBarMenuButtonを並べたほうが早いかも。
見た目を完全にメニューと合わせるなら、派生クラスを作ってオーバーライドする必要もあるだろうけど。
120デフォルトの名無しさん
2017/11/30(木) 20:04:53.18ID:9ANPxZI+ menuボタンを並べるのは良いアイデアだと思います。IEdemoというサンプルを見ていたら、LinkBarというクラスを作って使っていました。2つのメニューは、やはり初期化しないのが良さそうです。1つは別の物にしてみます。ありがとうございます!
121デフォルトの名無しさん
2017/11/30(木) 23:13:55.12ID:9ANPxZI+ IEDEMOのMFCコード、なかなか思い道理に動きません。MDIでサンプルを作って、CLinksBarとCLinksButtonを移植しようとしましたが、表示がバグります。バグっているけれどマウスカーソルをあてると、TOOLTIPが表示されます。何かが足りないようです。難しい
122デフォルトの名無しさん
2017/12/01(金) 09:35:49.83ID:/UAM0shb >>121
>>121
実際に見ていないからわからないけど、
ツールバーの情報は標準でレジストリに保存されてしまうから、
開発中は定期的にレジストリを消さないといろいろ原因不明の現象は起こる。
一度消してみたらどうかと。
ちなみに、m_wndToolBar.LoadToolBar()のあとに以下の処理を入れたら、
とりあえずツールバーにメニューを出すサンプルにはなる。
(これも一度レジストリの削除は必要)
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
for (UINT i = 0; i < menu.GetMenuItemCount(); i++) {
CString strText;
menu.GetMenuString(i, strText, MF_BYPOSITION);
m_wndToolBar.InsertButton(CMFCToolBarMenuButton(-1, menu.GetSubMenu(i)->GetSafeHmenu(), -1, strText));
}
>>121
実際に見ていないからわからないけど、
ツールバーの情報は標準でレジストリに保存されてしまうから、
開発中は定期的にレジストリを消さないといろいろ原因不明の現象は起こる。
一度消してみたらどうかと。
ちなみに、m_wndToolBar.LoadToolBar()のあとに以下の処理を入れたら、
とりあえずツールバーにメニューを出すサンプルにはなる。
(これも一度レジストリの削除は必要)
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
for (UINT i = 0; i < menu.GetMenuItemCount(); i++) {
CString strText;
menu.GetMenuString(i, strText, MF_BYPOSITION);
m_wndToolBar.InsertButton(CMFCToolBarMenuButton(-1, menu.GetSubMenu(i)->GetSafeHmenu(), -1, strText));
}
123デフォルトの名無しさん
2017/12/01(金) 23:29:26.56ID:658qbITu >>122さんのおかげで先に進めました。
下記のようにしたら、思い通りのメニューが出て、しっかり動いてくれました。
/*
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{
TRACE0("ツール バーの作成に失敗しました。\n");
return -1; // 作成できない場合
}
*/
m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
CMenu menu;
menu.LoadMenu(IDR_MENU_2);
for (UINT i = 0; i < menu.GetMenuItemCount(); i++) {
CString strText;
menu.GetMenuString(i, strText, MF_BYPOSITION);
int menuID;
menuID = menu.GetMenuItemID(i);
m_wndToolBar.InsertButton(CMFCToolBarMenuButton(menuID, menu.GetSubMenu(i)->GetSafeHmenu(), -1, strText));
}
Toolbarはとても難しいですね。私だけではとても思い通りの物は作れませんでした。>>122さんありがとう!
下記のようにしたら、思い通りのメニューが出て、しっかり動いてくれました。
/*
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{
TRACE0("ツール バーの作成に失敗しました。\n");
return -1; // 作成できない場合
}
*/
m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
CMenu menu;
menu.LoadMenu(IDR_MENU_2);
for (UINT i = 0; i < menu.GetMenuItemCount(); i++) {
CString strText;
menu.GetMenuString(i, strText, MF_BYPOSITION);
int menuID;
menuID = menu.GetMenuItemID(i);
m_wndToolBar.InsertButton(CMFCToolBarMenuButton(menuID, menu.GetSubMenu(i)->GetSafeHmenu(), -1, strText));
}
Toolbarはとても難しいですね。私だけではとても思い通りの物は作れませんでした。>>122さんありがとう!
124デフォルトの名無しさん
2017/12/09(土) 13:03:41.75ID:6uVA15bl MDIで色々ウインドウを出すと、チャイルドウィンドウのタイトルバーが:1 :2になったり、消えてしまったりします。特に後ろになったチャイルドウィンドウのタイトルバーが書き換わって、タイトルが消えてしまう問題に頭を痛めております。
CWNDクラス内などにウインドウタイトルの情報を保持していて、時々その保持している情報で書き換えているように思うのですが、保持している情報がどれなのか、書き換えられるのかわかりません。
今の所OnPaint内でGetParent()->SetWindowTextで書き換えているのですが先のようにチャイルドウインドウが後ろに回るとタイトル表示が消えたりします。なにか良いタイトルバーテキストの書き換え方法は有りませんでしょうか?
CWNDクラス内などにウインドウタイトルの情報を保持していて、時々その保持している情報で書き換えているように思うのですが、保持している情報がどれなのか、書き換えられるのかわかりません。
今の所OnPaint内でGetParent()->SetWindowTextで書き換えているのですが先のようにチャイルドウインドウが後ろに回るとタイトル表示が消えたりします。なにか良いタイトルバーテキストの書き換え方法は有りませんでしょうか?
125デフォルトの名無しさん
2017/12/12(火) 18:12:33.03ID:/EihAdTu 124が消したり書き換えているんだと思う。
素のMDIプロジェクト作ってもそういう動きになる?
素のMDIプロジェクト作ってもそういう動きになる?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- 「これいいじゃん!!!」 セブン-イレブンの1620円で買える“1人用クリスマスケーキ”🎂に注目殺到「天才すぎる」 [パンナ・コッタ★]
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 ★2 [Hitzeschleier★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
