MFC相談室 mfc23d.dll [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>134
CMFCButtonの標準の描画処理がボタン前提になっているので、
ラジオボタンの見た目を表現したいなら、
OnDraw()などをオーバーライドして自分で完全に描画するしかないかと。
そもそも、CMFCButtonではなくCButtonにしてしまえば、
Windowsのテーマに従ったものは描画されるけど、
そうではなく、CMFCVisualManagerのテーマのことでいいんだよね?
最新のMFCは知らないけど、2008で導入されたときのMFCは、
ダイアログや内部のコントロールのテーマ描画は対応してない。
ライブラリの元となったBCG社が、機能を別売りしている。
ttps://www.bcgsoft.com/featuretour/tour240.htm 2008年にMSがBCGを買収してCommunityEditionにこれが入っていたら、、と思う。 CMFCVisualManagerでたぶんあっています。
mfcのコンパイルオプションをUnicodeモードにすると、ラジオボタンの見た目が変わることは分かったのですが、ANSI(ShiftJIS)モードでコンパイルしたいのです。
今気になっているのは、manifestファイルを追加してみようと思います。
http://gurigumi.s349.xrea.com/programming/visualcpp/sdk_luna.html >>137
それはCMFCVisualManagerではないぞ。
Windowsのテーマのほうだ。 マルチバイト文字モードでコンパイルした場合の見た目の違いです。DDXControlで左はCButton右はCMFCButtonとひもづけました。
https://i.imgur.com/4qA7an3.jpg やはりmanifestファイルのようです。マニフェストファイルでラジオボタンは変化しました。
マニフェスト適用後
https://i.imgur.com/JqRoqH4.jpg
マニフェスト適用前
https://i.imgur.com/lC9fLyO.jpg このスレはVisualStudioの使い方、
質問はアプリケーションの作り方
微妙に違うといえば違う。
かといって誘導出来る適当なスレは見当たらない
MFCのスレくらいかな mfcのスレでmfcのクラスに関する質問をしていますよ。 Excelでキャレットの無い状態から日本語入力をするとテキストボックス?が現れて文字が未確定状態で表示されますが
同様な動きををCViewとCEditでやろうとしています。
以前はViewのOnCharからCEditにWM_CHARをポストすることで普通に動いていたのですが、OSの仕様が変わったのか
最初の1文字が確定状態で表示されてしまいます。ATOKもMS-IMEも同じです。
何かヒントがあれば教えてください。 excelでキャレットの無い状態というのがわかりません。^が無い状態で入力を開始するのでしょうか? >>144
レスありがとうございます。
Excelを起動した直後、あるいはセルへのキーボード入力が完了した直後など、矢印キーでカーソルが動く状態のことです。 文字入力時に点滅する「I」のような記号がキャレットです。 回答になっているかどうか分からないのですが、CViewクラスではない場合でCListCtrlクラス内にCEditを貼り付けて、そのCEdit上で編集をする例は有ります。
CView上にCEditを張り付けているような応用にもかなるかもしれませんので、例を上げます。
http://www.softist.com/programming/listctrl-edit/listctrl-edit.htm >>147
レスありがとうございます。
ダブルクリックでCEditを出して〜という動作は当方でも問題なく出来ています。 すみませんお助けください
親ウインドウにテキストボックスとボタン、ボタンを押すとdomodalでウインドウが呼び出されます
その子ウインドウにはリストボックスがあって、そこには親のテキストボックスに入力された文字が表示される
そういうものを作ろうとしています
親テキストボックスの変数名がm_input
setvalueでプライベートにしてるリストボックス変数にそれを格納しています
ですがこれですとウインドウは表示されてもリストボックスはからっぽです。
一体何が悪いのでしょうか
void 親ウインドウクラス名::OnBnClickedButton1()
{
PopupDlg pdlg;
UpdateData(TRUE);
pdlg.setValue(m_input);
pdlg.DoModal();
UpdateData(FALSE);
} >>149
setValueの引数の型や、それをPopupDlgがどのように扱っているのかを見せないと、
それだけではなにもわからないよ。 すっかり遅くなったけど申し訳ない
oninitdialogに処理書いたらなんとかなりました MDIウィンドウの場合で、メニューのフォントとフォントサイズは変えられますか?
ツールバーの右端に出てくるボタンの表示非表示を無くすことは出来ますか? >>152
MFC Feature Packのメニューやツールバーのことなら、
> メニューのフォントとフォントサイズ
CMFCMenuBar::SetMenuFont
> ボタンの表示非表示
CMFCToolBar::EnableCustomizeButton あれ?
CListViewなくなったん?
ウイザードにないw SDIかMDIを選んでいれば、ウイザードの最後の項目でViewを選択できるはずです。選ぶ中にCListViewは有るはずです。 そんなわけ無いだろうと思ったけど、無いね..
CListViewは存在するけどウィザードでは選択できなくなったのか
結構便利なクラスだと思うんだけどな 確かに2017communityでは、無くなっています。2013Communityには有るようです。 まぁこのへんの仕組みはもう変わらないだろうし、
適当なものを選んでから書き直しても問題ないけどな。 ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ >>153
> >>152
> MFC Feature Packのメニューやツールバーのことなら、
>
> > メニューのフォントとフォントサイズ
> CMFCMenuBar::SetMenuFont
>
> > ボタンの表示非表示
> CMFCToolBar::EnableCustomizeButton
使い方がよくわかりません。適当なパラメーターがよくわからず、CMainframe内で呼び出してはみた物の、うまくフォントのサイズは変わりません。
ボタンの追加も消せませんでした。 >>166
とりあえずこんな感じで書けば変わる。
ただ、あまり大きくすると、縦にドッキングしたときに文字が欠ける。
最新バージョンなら直っているのかもしれないけど、
自分のアプリではメニューは上部固定なので、深くは調べていない。
> メニューのフォントとフォントサイズ
NONCLIENTMETRICS metrics;
metrics.cbSize = sizeof(metrics);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(metrics), &metrics, 0);
LOGFONT lfMenu = metrics.lfMenuFont;
_tcscpy_s(lfMenu.lfFaceName, _T("MS P明朝"));
lfMenu.lfHeight = -24;
CMFCMenuBar::SetMenuFont(&lfMenu);
lfMenu.lfOrientation = 900;
lfMenu.lfEscapement = 2700;
CMFCMenuBar::SetMenuFont(&lfMenu, FALSE);
> ボタンの表示非表示
m_wndToolBar.EnableCustomizeButton(TRUE, -1, _T(""), FALSE);
もしくは、EnableCustomizeButtonを呼ばない。 軽く煽ると答えを書いてくれるこのスレはチョロいよねw 質問に答えると負けなんだろうか。
他のスレでも、質問に「答えない」ってだけのしょうもないマウントとりにくる人を見かけるね。 >>168
ありがとうございます。メニューのフォントサイズを変更でき、ボタンの追加・削除を消せました。
私ではとても考え付かない設定です。ありがとう!! 温度情報などをグラフにしてFormView上に描画できないか考え込んでいます。自前でCDCに描いていくのではなく、描くのに適しているmfcのライブラリは無いものか、探しています。どなたか目盛りのついたグラフ描画に良いクラスはご存じないでしょうか? 昔の話で何ですが、DOSの時代にはMSCなどにグラフ描画ライブラリが付いてきていたような記憶があります。mfcには無さそうですよね。 >>179
最新版は知らないが、昔のMFCには無かったと思う。
(昔の) MSDN Library をよく見ているが、発見してない。
でも、グラフ描画って、LineTo() だけでも大体いけると思うんだけど。 OLE2使ってExcel呼べばいいんじゃね?
MFC関係ないのでスレチだけど >>180
MSC = Microsoft CというDOS用のコンパイラです。1990年代のお話です。 >>174 >>177
matplotlib の python 用 dll を c/c++ から使う手がある .NETのChartコントロールをユーザーコントロールに置いてMFCダイアログでホストってのをやったことあるよ。
MFCビューでのやり方もMSDNに書いてあるからその通りやればできると思う。
MFC、Windowsフォーム、辺りで検索すれば見つかるはず。 .netはちょっと重いです。それでも参考になります。ありがとうございます。。 mfcとexcelの連携が全然分かんない……COM?何それ?みたいな
msdnとかstackoverflowとかいろいろ漁ってもだめ。っていうかそもそもmfc、windowsってよくわかんないクラスとか変数とか多すぎじゃない
もっと簡単にプログラミングさせてよ!って思う 昔、MFCに慣れてきた頃、趣味でMACのプログラミング勉強しようとして挫折したことがある。
Excel連携なら、その箇所だけでもVBでやるのがお勧め。 折れ線グラフをMovetoとLinetoで描くことにしました。線分を引くに当たって、GDI+とGDIでの描画速度を検証してみました。
32bit win7 corei5で24×1,024本の線分を描きましたところ
GDI+ drawLine 7300ms
GDI Moveto Lineto 350ms
という結果になりました。
mfcのMoveto Linetoは速いですよね。画面のサイズによって速度はだいぶ変わるようです。 c#などのASP.net環境では、グラフを生成するAPIが有るようですね。サーバ上で簡単にグラフを生成し、クライアントのブラウザから見られます。 >>195
検証おつ。少数派かもしれませんがこういうの好きです。 CFormView内でOnMouseWheelを使っていたのですが、コンボボックスを配置したところ、OnMouseWheelのイベントに飛んでこなくなりました。
今のところ、コンボボックスを継承して、コンボボックス内のOnMouseWheelイベント内で、親クラスへSendMessage(WM_MOUSEWHEEL )する事で動かせるようにしました。
この先、ほかのコントロールが追加されたら、またOnMouseWheelイベントを拾えなくなると思い、もっと良い方法があればと思っています。どなたか良い解決策をご存じですか? >>198
CFormView派生クラスのPreTranslateMessage()で横取りしてしまうのが簡単かと 確かに横取りで解決できました。ありがとうございます。
コンボボックスをドロップダウンリストに設定した場合のフォーカスについても伺いたいのですが、
CFormViewクラス内にドロップダウンリスト型のコンボボックスを配置すると、キーボードのフォーカスがコンボボックスに設定されてしまいます。
CFormViewに対してSetFocus()を呼び出しても、フォーカスがコンボボックスから外れません。
コンボボックスが青く塗りつぶされて選択状態になっているのを解除する方法をご存知ないですか? >>200
CFormViewのソースを見るとわかるけど、SetFocus()を呼んでも、
OnSetFocus()の中で最後の位置に復元される。
その動きを別なものにしたいのなら、
OnSetFocus()をオーバーライドして、なにかしらの対応が必要かと。
なにもしないようにしてフォーム自身がフォーカスを持ってしまうとか、
サイズ0のダミーのボタンでも置いておいて、毎回そこにフォーカスを移すとか。 ダブルバッファリングについて質問しても良いですか?
ピクチャーコントロールのダブルバッファリングを行いたいと思っているのですが、画面のサイズを大小いじられ続けると、GDIリソースを食いつぶして、アプリケーションが落ちます。
色々試して、画面サイズ変更イベント内のCreateCompatibleBitmapのところで確保したGDIリソースが DeleteObject();されるときに、GDIリソースを一つ多く確保し続けるようです。
CBitmap test;
test.CreateCompatibleBitmap(ピクチャーコントロールのdc,-,-); //GDIリソースが+2される
test.DeleteObject(); //GDIリソースがー1される
差し引きGDIリソースの確保量が+1になります。
そのうち線を書けなくなり、アプリケーションがクラッシュします。
使い方がどこか良くないのだと思うのですが、パラメータ等が良くないのかな。などと考え込んでいます。解決策をご存知ないですか?GDIリソースの確保量はタスクマネージャの設定でGDIリソースを表示できるようにして確認しています。 CreateCompatibleBitmapの前後5行ぐらいに原因がありそうな気がする >>203
自分で開放しないといけないのを忘れてるだけじゃないかな リソースの解放はDeleteObject();ではないのですか?
CreateCompatibleBitmapの前は、CreateCompatibleDCを呼び出しています。
CreateCompatibleDCのDCパラメータをNULLに設定すると、GDIリソースの浪費は無くなりますが、今度は出てくる画面が白黒になってしまいます。 >>206
ピクチャーコントロールのDCをGetDC()で取得してしてるのでは スタック上でCBitmap test;とやった場合
関数を抜けるときに勝手にデストラクタでDeleteObjectされると思う。
もう少しコード晒さないと判らない。 CreateCompatibleDCでは、ピクチャーコントロールのDCを取得させています。
ピクチャーコントロールのDCを渡すと、CreateCompatibleBitmap時にGDIリソースを消費する量が2となるようです。
CreateCompatibleDCにNULLを指定した場合(確か)CreateCompatibleBitmap時のGDIリソース消費量ばかり1となります(以後の描画は白黒になります)。
今しばらく書いているコードをみられません。
CreateCompatibleDCやCreateCompatibleBitmapをOnSize時に破棄させてはサイズを変えて再生成させると、GDIリソースが消費されて減っていくので、
アプリケーション生成時に画面の最大サイズでCreateCompatibleDCさせておき、あとはCreateCompatibleDCしないように変更することも考えております。
アプリケーション生成時に画面のサイズ分のCreateCompatibleDCさせるようにすると、マルチモニタ環境の時などの動作が正常に動作しないかもしれないと思い、
可能ならOnSize内でDeleteObject();させてCreateCompatibleDCさせたいと思っています。
なお、OnSizeから抜けてもGDIリソース消費量は下がってくれないようです。 207が言っているのは
bitmap.CreateCompatibleBitmap(pict->GetDC(), rc.Width(), rc.Height())
してるんじゃないかって事。これだとリークします。 >>212
> 207が言っているのは
> bitmap.CreateCompatibleBitmap(pict->GetDC(), rc.Width(), rc.Height())
> してるんじゃないかって事。これだとリークします。
しています。その上でどのように直すべきか察しが付きません。やはりReleaseDCで直りますか? ReleaseDCで直る。
私なら 解放不要なCDC::FromHaqndleを使う。 >>212
CClientDCを使うのが一番簡単だけど、
CreateCompatibleDC()のほうは引数はなにを渡しているんだ?
>>213
CDC::FromHandle()はHDCがわかっているときに使うもので、
今回のDCを取得すること自体には使えない。 >>216
CompatibleDCの引数はピクチャーコントロール内のDC
memDC.CreateCompatibleDC(ピクチャーコントロール.GetDC(),ピクチャーコントロールのx,y);
だったと思います。
GetDC()でピクチャーコントロールのDCを取得していたか、GetSafeDCでピクチャーコントロールのDCを取得していたかちょっと思い出せません。 CreateCompatibleDCのパラメータはDC一つだけでしたね。ごめんなさい。 GetDCの返り血はReleaseDCしないといけない。 ReleaseDCではGDIリソースがー1になりますが、createCompatibleBitmapで+2消費したぶんのすべては解放されてくれません。
releaseDCはおこなっていますが、GDIリソースの消費量は依然として+1になってしまいます。 原因わかりました。
memBmp.CreateCompatibleBitmap(picctrl.GetDC(),x,y);
が良くなかったようです。
GetDC()でGDIリソースを1消費し、解放出来なくなります。
CDC *pDC;
pDC->picctrl.GetDC();
memBmp.CreateCompatibleBitmap(pDC,x,y);
DeleteObject(memBmp);
ReleaseDC(pDC);
に直したところ、ちゃんとGdIリソースが戻りました。 pDC=picctrl.GetDC();
に修正します。
解答いただいた方々、ありがとうございます。 >>222-223
最初からみんなそう言ってたのに > CDC *pDC;
> pDC=picctrl.GetDC();
> ReleaseDC(pDC);
picctrl.GetDC()したものを親がReleaseDC()しているのが気持ち悪いが、
これでも正しく動くのか? GetDC()したらReleaseDC()する必要があるのだと思う。CDC*はデストラクタ処理に入れないからReleaseDCする必要がある。
VC++.net CLRとかなら自動でやってくれるのだろう。 >>226
picctrl.ReleaseDC(pDC);
とするべきではということなんだが。
そもそもCClientDCを使えばGetDC()なんて自分で呼ぶ必要はないが。 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
HQL0Y バイナリデータ(buf)を受け取ってピクチャーコントロール(m_picture)に
描画したいのですがBitBltのところで
"Debug Assertion Failed!"
が発生してしまいます。
何が悪いのか教えていただけないでしょうか?
PAINTSTRUCT ps;
CBitmap bitmap;
CImage image;
CDC *pDC;
pDC = m_picture.BeginPaint(&ps);
pDC->SetBkMode(TRANSPARENT);
pDC->SetStretchBltMode(COLORONCOLOR);
bitmap.CreateBitmap(width, height, 1, 8, (void*)&buf);
HBITMAP hBitmap = HBITMAP(bitmap.GetSafeHandle());
image.Attach(hBitmap);
image.BitBlt(pDC->GetSafeHdc(), CRect(0, 0, image.GetWidth(), image.GetHeight()), CPoint(0, 0));
image.Detach();
image.ReleaseDC();
m_picture.EndPaint(&ps); ASSERT(IsWindow(m_picture)); してみれ。 >>232
連絡ありがとうございます。
やってみましたがプログラムが止まらないので問題ないみたいです。 まず"Debug Assertion Failed!" が出ているのならちゃんと再試行を押そうよ。
それだけで原因そのものはわかる。 ■ このスレッドは過去ログ倉庫に格納されています