MFC相談室 mfc23d.dll [無断転載禁止]©2ch.net
質問しろ〜
なんでも答えてやんぜって思ったら、俺c++できないんだったw 最新のMFCはコンストラクタでメンバ変数初期化サボってるクラスないよね いつの間にかMFCでもDirect2Dがサポートされてたんだね
ちょっとサンプル見たけどGDIと比べると複雑だな CStdioFile::ReadStringでshiftjisのファイルをバッファに読み込んだんですが、
テキストファイルの内容は「あ」のみ
バッファの内容は
82 00 A0 00
でした。
unicodeなら
30 00 42 00
か
00 30 00 42
になると思うのですが、なにか勘違いしていますかね? >>23
テキストファイルをUTF-16にするか、UTF-8にしてUTF-16に変換する。 setlocaleしてないからascii-8bitとして読み込まれたと予想。 >>25
setlocaleしたら
42 30
となっちゃいました
>>26
そう書いていますが?・・・ >unicodeなら
>30 00 42 00
>か
>00 30 00 42
てのがおかしい。 プロセスが起動した状態で、
ツールバーのツールチップの文字列を取得、変更したいのですが
ちょっと手こずっています。アドバイスお願いします
以下の方法ではツールチップではなくボタン文字列が対象になるようです
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(...); >>34
動的な変更は、やった事ないけど、このあたりでは?
ttp://home.att.ne.jp/banana/akatsuki/doc/mfc/mfc22/
アプリを普通に作っていれば、取得はボタンのリソースIDと同じIDを持つSTRINGリソース ちょっとiconの相談です
MFCでプロジェクト作った際、アプリのicon(IDR_MAINFRAME)にいろんなイメージタイプ
(サイコロ3つ)が作られるけど私は全部設定するの面倒なので32x32 8bit bmpだけ
作って他全部消すようにしてます。皆さんはどうしてます?
いろんな環境に対応するためにあ-いうことしてるのかなーとは思うんだけど.. >>37
アイコンのイメージ作成にはInkscapeを使ってるよ。
お金に余裕があればAdobe Illustrator使えばいいんじゃないかな。
32x32だけだとユーザーに汚い画像を見せることになる。 > 32x32だけだとユーザーに汚い画像を見せることになる。
解像度を変えてのテストはある程度してるけどあまり気になったことないなー
私の想定を超えたデバイスだと汚くなるのかな?Inkscapeは落とした。勉強してみます。
片山博士は大きく&色彩豊かなicon作った後でInkscape使って縮小/減色してるの? Inkscapeで256x256ピクセル(Vistaサイズ)にしてから図形を描いてとりあえず保存すればSVG形式ファイルになる。
「ファイル」メニューの「PNG形式でエクスポート」を選べばPNG画像が吐き出される。
それを16x16,32x32,48x4864x64に縮小して、見辛いピクセルを細かく補正してからアイコン作成ソフトに取り込むとアイコンができる。 Inkscapeは図形の合成などの強力な編集機能があるが、
図形が足りなければワード、エクセルの図形をコピペすればいい。 時間がないときは文字アイコンだね。1文字をアイコンにするだけで
インパクトあるかもしれない。 「アンチエイリアス」がかかると、どうしても細部がぼやけてしまう。
小さいアイコンでは、ユーザーにはっきり見えるように微細な加工をした方がいい。 片山先生はアイコン一つにも手を抜かないんだな。
お前らも見習うべき CListView(LVS_OWNERDATA style指定)で特定の行の選択を禁止したいのですが
LVN_ITEMCHANGINGはOWNERDATAの場合は送られない様です。by msdn
何か良い方法は無いでしょうか。
クリックやENTERを潰すしかないんでしょうか? 選択禁止は諦めました。
選択された後、近くの行を強制的に選択状態にするようにししたら、あまり違和感がなかったので、これでごまかします。 CArrayの質問なんですが、
CArray<int> test;
test.SetSize(10);
とやった場合、test[0]〜test[9]までの値は、
0で初期化されていることは、前提として良い動作ですか?
ソースを見たところ、SetSize()で確保したバッファをいったんゼロクリアして、
その後、各要素に対してコンストラクタが呼ばれるようなので、
C++のintのコンストラクタが「なにもしない」という仕様なら大丈夫そうですが。 intのようなプリミティブな型にもコンストラクタってあるの?
知らなかった MFCでリボンアプリケーション組もうとしてるんですけど、
リボンデサイナでダイアログボックス起動ツールのボタンは
付けられないのでしょうか?
例えばWORDとかでフォントグループの右下にある小さい四角いボタンです。 MFCでCEditをサブクラス化したいと思うのですがうまくいきません
サブクラス化時にFromHandlePermanetと言う関数が呼ばれてそこでASSERTに引っ掛かってしまいます
MSDNによると「SubclassWindowを呼び出す時、ウィンドウがMFCオブジェクトに結びつけられていないようにしろ」とあります
馬鹿で申し訳ないのですが、ウィンドウがMFCオブジェクトに結びつけられるのはどのタイミングなのでしょうか?
今はCEdit::Create後にサブクラス化を試みています >>53
ああ、あの2ミリ角くらいの小さな四角ね。 >>54
CEditをダイアログエディタで作成したなら、すでにMFCの管理下にある。
サブクラス化する必要はない。作成したCEditメンバーを使えばいい。 >>56
ありがとうございます
しかしながらCEditから派生させたクラスをnewを使用して動的に作成しています
newによりインスタンスを動的に作成
↓
Createメンバ関数を呼び出しコントロールを作成
↓
サブクラス化
↓
ASSERT 途中で送信してしまいました
現状はこんな感じでアサートに引っ掛かってしまいます
デバッガで追うとウィンドウのMAP(?)にサブクラス化対象のウィンドウが既に存在しているとアサートされるようなのですが、このウィンドウマップにどこで登録されるのかが解りません
マップに登録される=MSDNの言う「ウィンドウをMFCオブジェクトに結び付ける」と言うことなのかと推測しています その工程ならサブクラス化はいらないはず
でもウィザードを使わずにクラスを作ったら
おまじないマクロがついてこないんじゃないかな
後始末のときにオブジェクト開放が先かウインドウ破棄が先かってのも迷う >>59
ありがとうございます
説明不足で申し訳ありません
そもそも何故エディットボックスをサブクラス化したいかというとエディットボックスのコンテキストメニューを改造したいためなのです
エディットボックスにくるWN_RBUTTONDOWNをトラップするため、サブクラス化が必須になっている次第です Createするから既存になってしまうんじゃないの?
>>57でいうサブクラス化ってSubclassWindow? SubclassDlgItem?
CEditのサブクラスは時々使うけどSubclassWindow経由では使ってないので
外してたらスマソ 自分でサブクラス化したときはDDX_Controlを削らないとうまく動いてくれなかったような気がする。
正解は知らんが。 >>60
mfcは昔やっててもう忘れかけだが
マウスボタンをトラップする程度なら
サブクラス化なんて不要なんじゃないか? >>62
ありがとうございます
SubclasDlgItemを使っています
ですがデバッガで追うと結局は内部でSubclassWindowをを呼び出しているのは確認しています >>64
ありがとうございます
DDXは使っていません
リソースにエディットボックスコントロールを貼りつけてはおらず、プログラム中でCEditクラスを派生したクラスを動的に作成しています >>65
エディットボックスのマウス右クリックはサブクラス化が必要なようです
でも確かになにかコンテキスト〜というメッセージがあったような気もしないでもないのですが…
WEBで調べた限りですと右クリックメッセージをフックしているのしか出てきませんでした 回答ではなく代替案ですが
1. CEditのサブクラスでOnContextMenuをオーバーライドしてメニュー処理を記述。
2. https://support.microsoft.com/ja-jp/help/403856
中の
また、CDialog::DoDataExchange() で DDX を使用して..
のやりかたで CEditをCYourEditに変更。
で独自のコンテキストメニューは出ますよ。 >>69
おおおお!!!
ありがとうございます!
早速試してみます!
と思いましたが、今日はもう事務所が閉まるそうです…
早速明日試してみます!
ありがとうございました! 明日もあさっても過ぎたんだけど、どうなったんだろうね。 >>71
これは失礼しました
解決しましたのでご報告致します
結果的にはサブクラス化出来ました
動的にCEditを生成した際、実際のコントロールをCriateメソッドで生成すると思いますが一旦生成してしまうとサブクラス化できないようです
CMyEdit pualic CEdit として派生
CMyEdit lpCMyEdit = new CMyEdit;
lpCMyEdit->SubclassWindow(...←ここでサブクラス化
lpCMyEdit->Crate(...←コントロール作成
上記の手順でサブクラス化できましたのでWM_CONTEXTやWM_CHARに対してメッセージトラップが可能になりましたので全て実現できました
MFCのいう、ウィンドウの関連付けというのは恐らくコントロール作成時にWindowMapというMFCのクラスに登録されることかと思われます
改めて色々と相談に乗っていただき有り難うございました
また何かありましたら質問させて頂きます
>>72
間一髪間に合いました >>73
リソースにエディットがないのに、SubclassWindow()を呼び出したって…
一体何をサブクラス化したんだろう…
リソースにエディットがなければ Create() だけでいい
リソースにエディットがあるなら SubclassWindow() だけでいい
(この場合は、69さんの2のやり方が普通だと思う) 改めてよく読んだらおかしいねw
SubclassWindowのパラメータに何を渡したんだろう
本人が解決したって言ってるんだから別にいいけど >>75
MFC使い方がよくわかってなくて混乱させているようで誠に申し訳ないです…
CEditをnewにて動的に作っていますのでリソースは一切使っていないです
具体的にはエクセルのシートの様な格子形のグラフィックを描画し、そのカラムをクリック等された際にエディットボックスを動的にカラムの座標に作っています >>76
SubclassWindowにはCEdit派生の独自クラスを渡しています
自分は普段SDKしか使わないためSDKの感覚なのですが、ウィンドウのサブクラス化とは、サブクラス化したいウィンドウハンドルのウィンドウプロシジャのアドレスを別途作成した独自ウィンドウプロシジャのアドレスと差し替える事と認識しています
ですのでSubclassWindowに渡すハンドルはサブクラス化したいウィンドウのハンドルと思っていましたが何か別のパターンがあるのでしょうか? >>78
> CMyEdit public CEdit として派生
> CMyEdit* lpCMyEdit = new CMyEdit;
ここでは、まだウィンドウは無い (コンストラクタに小細工がなければ)
> lpCMyEdit->SubclassWindow(...←ここでサブクラス化
もし以下のように書いたとしても、ハンドルは NULL だからサブクラス化できない
lpCMyEdit->SubclassWindow(lpCMyEdit->GetSafeHwnd());
> lpCMyEdit->Create(...←コントロール作成
この中で、ウィンドウが作成されサブクラス化される
なので SubclassWindow() の明示的な呼び出しは不要 >>78
CEditをどういう風にカスタマイズしたいのかわからんが
>CEdit派生の独自クラス
の段階でそれを実装できないの?
通常サブクラス化を必要とするのは(通常の手段では)派生クラスを置けないダ
イアログ上のコントロールに対しての場合のみで、そうで無い場合は必要な機
能を実装したCEdit派生クラスをCreate()するだけで実現できると思うんだが・・
MFCでは(メッセージマップの仕掛けによって)ほぼ全てのメッセージを派生ク
ラスで独自処理を行えるので、サブクラス化は必要ないはずです。 >>77
>具体的にはエクセルのシートの様な格子形のグラフィックを描画し…
これ自分もやったなー
作り込んで思い通りに動いたときは気持ちいいよね >>79
なるほど、確かに仰る通りです
MFCだと定義済みコントロールを作成したタイミングでサブクラス化が自動的に行われているんですか…知らなかった…
SubclassWindowの戻り値を確認してみます >>80
はい、とりあえずは、WM_CHARとWM_CONTEXTMENUをトラップしたいのです
どうも私の勘違いでサブクラス化は不要なんですかね… >>81
そうなんです
失敗が多い分、成功の歓びがあります >>85
はい、SubclassWindowは失敗していました
みなさんの言う通りコントロール作成時に暗黙にサブクラス化が行われているようです
とても勉強になりました
有り難うございます そもそもなぜサブクラス化って言うの?
クラスとは関係ないと思うんですが サブクラス化というネーミングはイマイチだとずっと思ってた。
APIの名称から来てるから翻訳者に罪はないが、、
VS2017入れてみたけど_MFC_VERは変化なし。
残念だ。 >>87
多分ウィンドウクラスを横取りするからじゃないかな? 実際クラスとは関係ないと思う
ファーストクラスとかも全然クラス関係ないし
英語にそういうニュアンスがあるんじゃないの Windows1.0のときからあるし、オブジェクト指向の用語とは別路線で発生したもんだしなあ GUI自体がオブジェクト指向の影響下で発展してきたわけで、別路線ってことはないだろう。
ウィンドウクラスごとにそれぞれ異なるWinProcを指す仕組みなんてほとんどv-tableだし。 確かWin32APIはsmalltalk由来のメッセージパッシング式オブジェクト指向を意識して作られたとかなんとか。
んで、C++はメッセージパッシング意識して作られてなかったから、言語自体を拡張されたのがC++Builderで、言語は拡張せず、メッセージテーブル作って無理くり対応したのがVCのMFCって何かで読んだ。
そう考えるとMFC以前はCでどうにかオブジェクト指向と言うより、メッセージパッシングを実現しようとしてWin32APIが出来たんだろね。 生まれてなかったんで。
そう言えばWin16sとの互換性のためとか勉強した覚えある。 win32sならやったけど、Win16sは知らないなあ。 IT業界を離れて10数年経つ者です。
いまどき高速なアプリを手軽に作りたい場合、現役の方はどういう環境で作っています?
当時は主にMFC、たまにC++Builderでやってました。重くても良い場合はVBも使いました。
出来れば今後10年使えそうな奴をお願いします。今もたまに簡単なツールを作る機会が
ありますが、その際はMFCで作っています。多少勉強する覚悟はあります。
よろしくお願いします。 >>98
>出来れば今後10年使えそうな奴をお願いします。
ない。