MFC相談室 mfc23d.dll [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2016/09/21(水) 00:20:48.44ID:OfO+mYkd
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
2017/06/05(月) 10:47:00.10ID:CcS2OTgy
>>113

>>112
>CCriticalSection csForFoo ; // 非AUTO
ttps://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12140841977?__ysp=QVVUT%2BWkieaVsA%3D%3D

>>109
>普通に読めば、関数の内部でローカル変数として宣言するように思えるのですが、
思えない

ローカル変数にも、ブロックローカル・関数ローカル・ファイルローカルがあり、
ブロックローカル・関数ローカルにも非静的変数と静的変数がある。
2017/06/05(月) 12:03:45.22ID:umvVrk12
>>114
> CCriticalSection csForFoo ; // 非AUTO
>  :
> csForFoo.Lock() ;

ああ、このcsForFooは関数内の自動変数ではなくて、
関数外なり静的変数なりで定義されているものいうことでしたか。

> 普通に読めば、関数の内部でローカル変数として宣言するように思えるのですが

の「ローカル変数」は、「自動変数」の意味でした。
失礼しました。
2017/06/05(月) 19:28:46.05ID:SdDD09qt
>>109の原文(MSDN)には
construct the CCriticalSection object when it is needed.
と書かれているからCCriticalSection objectはオート変数と解釈してもおかしくは無い気がする。
staticならあらかじめになってしまう。
2017/06/06(火) 17:22:09.38ID:2bddCvIA
>>116
「コンストラクタから正常に戻った後、Lock を呼び出して」
とも書いてあるので、普通に読めば自動変数ですよねぇ。
でも、自動変数のCCriticalSectionをロックしても排他制御になっていないはずだし、
これはどういう意図なんだろうか、という質問でした。
2017/11/29(水) 18:24:25.41ID:HFlnlUlA
MFC MDIで2つのメニューを出したいので、mainframeにCMFCMenuBarを2つ作って、2つCreateすると、2つ目のCreateはAssertでとまってしまいます。2つのメニューを表示させる方法はありませんか?
2017/11/30(木) 13:32:53.51ID:isxZpuq9
>>118
「Method should be called once!」
なんてコメントが入ってるくらいだから、メニューは一つという設計なんだろう。

CMFCToolBarにCMFCToolBarMenuButtonを並べたほうが早いかも。
見た目を完全にメニューと合わせるなら、派生クラスを作ってオーバーライドする必要もあるだろうけど。
2017/11/30(木) 20:04:53.18ID:9ANPxZI+
menuボタンを並べるのは良いアイデアだと思います。IEdemoというサンプルを見ていたら、LinkBarというクラスを作って使っていました。2つのメニューは、やはり初期化しないのが良さそうです。1つは別の物にしてみます。ありがとうございます!
2017/11/30(木) 23:13:55.12ID:9ANPxZI+
IEDEMOのMFCコード、なかなか思い道理に動きません。MDIでサンプルを作って、CLinksBarとCLinksButtonを移植しようとしましたが、表示がバグります。バグっているけれどマウスカーソルをあてると、TOOLTIPが表示されます。何かが足りないようです。難しい
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));
}
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さんありがとう!
2017/12/09(土) 13:03:41.75ID:6uVA15bl
MDIで色々ウインドウを出すと、チャイルドウィンドウのタイトルバーが:1 :2になったり、消えてしまったりします。特に後ろになったチャイルドウィンドウのタイトルバーが書き換わって、タイトルが消えてしまう問題に頭を痛めております。
CWNDクラス内などにウインドウタイトルの情報を保持していて、時々その保持している情報で書き換えているように思うのですが、保持している情報がどれなのか、書き換えられるのかわかりません。
今の所OnPaint内でGetParent()->SetWindowTextで書き換えているのですが先のようにチャイルドウインドウが後ろに回るとタイトル表示が消えたりします。なにか良いタイトルバーテキストの書き換え方法は有りませんでしょうか?
2017/12/12(火) 18:12:33.03ID:/EihAdTu
124が消したり書き換えているんだと思う。
素のMDIプロジェクト作ってもそういう動きになる?
2017/12/12(火) 22:35:42.07ID:CKA01eZH
 素のMDIプロジェクトだとなりません。素のままだとタイトルバーがチャイルドウインドウの数に応じてプロジェクト名+1,2,3と表示されてしまいます。
 チャイルドウインドウのFormView別にチャイルドウインドウのタイトルを変化させたいのですが、うまくいきません。
 タイトルバーをもっと思うように書き換える方法を探しております。
2017/12/12(火) 23:44:01.59ID:/EihAdTu
CDocumentのサブクラスでSetTitle(LPCTSTR lpszTitle)をオーバーライドして独自のタイトルを付けるのはどうかな。
よく覚えてないけど独自のタイトルじゃなくlpszTitleを加工しようとすると嫌な感じにハマった記憶が、、
2017/12/13(水) 09:22:41.41ID:lt+jgkVB
>>124
CMDIChildWnd::OnUpdateFrameTitle()をオーバーライドしてみては。
何科変化するたびにこの関数が呼ばれるし、
デフォルトの処理だと、ここで":1"とか追加している。
2017/12/13(水) 09:23:33.82ID:lt+jgkVB
× 何科
○ なにか
2017/12/13(水) 12:23:45.29ID:h/Ab3OoN
>>127さん
 CDocumentのサブクラスCDocumentExを作ってSetTitleをオーバーライドしてみました。
 その他、ドキュメントクラスはCDocumentからの継承ではなくCDocumentExから継承させるようにしてみたのですが、CDocumentEx::SetTitle関数は呼ばれないようです。
 CDocumentクラスのオーバーライドではだめかもしれません。
>>128さん
ちょっと試してみます!
2017/12/13(水) 18:07:57.07ID:xRSHjr6s
>CMDIChildWnd::OnUpdateFrameTitle()をオーバーライドしてみては。
 OnUpdateFrameTitleをオーバーライドして、親クラスのメソッドをよびにいく時のパラメーターをfalseにしてみたところ、チャイルドウインドウのタイトルが書き換わらなくなりました。
 ありがとうございます!
2017/12/25(月) 18:31:00.49ID:1KZX1+KX
 mfcで見た目の良い(テーマを適用した)ラジオボタンを出したいと思っています。ところが、ラジオボタンのクラスとして、CMFCRadioButtonというクラスがありません。
 恐らくCMFCButtonクラスのインスタンスを生成してラジオボタンとして用いるのかなと悩み、CMFCButtonクラスの継承でCMFCRadioButtonクラスが作れないものか、考えています。
 CMFCRadioButtonクラスは作ってみた物の、CMFCRadioButtonクラスのOnDrawが呼び出されません。CMFCタイプのラジオボタンを生成する良い方法はございませんか?
2017/12/26(火) 09:21:22.00ID:pmYcZWoZ
>>132
virtual void OnDraw(CDC* pDC, const CRect& rect, UINT uiState);
をオーバーライドしたら、ちゃんと呼ばれているように見えるけど。
2017/12/26(火) 12:13:07.59ID:SnpEsSKI
リソースではラジオボタンを定義しておいて、DDXCONTROLからCMFCRadioButtonクラス(CMFCButtonクラス派生)とひもづけると、外観がボタンになってしまいます。
 外観はボタンですが、確かにCMFCRadioButtonクラスのOnDrawは呼び出されます。
 外観がボタンではなく、ラジオボタンにする方法をご教示下さい。
2017/12/26(火) 12:55:18.72ID:pmYcZWoZ
>>134
CMFCButtonの標準の描画処理がボタン前提になっているので、
ラジオボタンの見た目を表現したいなら、
OnDraw()などをオーバーライドして自分で完全に描画するしかないかと。

そもそも、CMFCButtonではなくCButtonにしてしまえば、
Windowsのテーマに従ったものは描画されるけど、
そうではなく、CMFCVisualManagerのテーマのことでいいんだよね?

最新のMFCは知らないけど、2008で導入されたときのMFCは、
ダイアログや内部のコントロールのテーマ描画は対応してない。

ライブラリの元となったBCG社が、機能を別売りしている。
ttps://www.bcgsoft.com/featuretour/tour240.htm
2017/12/26(火) 19:16:10.15ID:85Qwpz2C
2008年にMSがBCGを買収してCommunityEditionにこれが入っていたら、、と思う。
2017/12/26(火) 20:03:16.51ID:U4eSFsG2
 CMFCVisualManagerでたぶんあっています。
 mfcのコンパイルオプションをUnicodeモードにすると、ラジオボタンの見た目が変わることは分かったのですが、ANSI(ShiftJIS)モードでコンパイルしたいのです。
 今気になっているのは、manifestファイルを追加してみようと思います。
http://gurigumi.s349.xrea.com/programming/visualcpp/sdk_luna.html
2017/12/26(火) 20:28:21.70ID:SQt/8UlT
>>137
それはCMFCVisualManagerではないぞ。
Windowsのテーマのほうだ。
2017/12/26(火) 21:53:49.91ID:lgrMwj5m
マルチバイト文字モードでコンパイルした場合の見た目の違いです。DDXControlで左はCButton右はCMFCButtonとひもづけました。
https://i.imgur.com/4qA7an3.jpg
2017/12/26(火) 22:19:37.75ID:lgrMwj5m
やはりmanifestファイルのようです。マニフェストファイルでラジオボタンは変化しました。
マニフェスト適用後
https://i.imgur.com/JqRoqH4.jpg
マニフェスト適用前
https://i.imgur.com/lC9fLyO.jpg
2017/12/30(土) 19:20:54.71ID:W7MN//Qp
このスレはVisualStudioの使い方、
質問はアプリケーションの作り方
微妙に違うといえば違う。
かといって誘導出来る適当なスレは見当たらない
MFCのスレくらいかな
2017/12/30(土) 20:06:14.31ID:k3f51DlY
mfcのスレでmfcのクラスに関する質問をしていますよ。
2018/01/06(土) 20:47:11.78ID:wtVvXwwo
Excelでキャレットの無い状態から日本語入力をするとテキストボックス?が現れて文字が未確定状態で表示されますが
同様な動きををCViewとCEditでやろうとしています。
以前はViewのOnCharからCEditにWM_CHARをポストすることで普通に動いていたのですが、OSの仕様が変わったのか
最初の1文字が確定状態で表示されてしまいます。ATOKもMS-IMEも同じです。

何かヒントがあれば教えてください。
2018/01/11(木) 02:22:52.84ID:azQtlc4c
excelでキャレットの無い状態というのがわかりません。^が無い状態で入力を開始するのでしょうか?
2018/01/11(木) 22:28:59.70ID:nH81YmjO
>>144
レスありがとうございます。
Excelを起動した直後、あるいはセルへのキーボード入力が完了した直後など、矢印キーでカーソルが動く状態のことです。
2018/01/11(木) 22:30:38.90ID:nH81YmjO
文字入力時に点滅する「I」のような記号がキャレットです。
2018/01/12(金) 22:01:33.38ID:mgMC0phM
回答になっているかどうか分からないのですが、CViewクラスではない場合でCListCtrlクラス内にCEditを貼り付けて、そのCEdit上で編集をする例は有ります。
CView上にCEditを張り付けているような応用にもかなるかもしれませんので、例を上げます。
http://www.softist.com/programming/listctrl-edit/listctrl-edit.htm
2018/01/13(土) 18:52:00.81ID:CyFncowx
>>147
レスありがとうございます。
ダブルクリックでCEditを出して〜という動作は当方でも問題なく出来ています。
2018/01/29(月) 00:24:27.95ID:lYpQ/Knz
すみませんお助けください
親ウインドウにテキストボックスとボタン、ボタンを押すとdomodalでウインドウが呼び出されます
その子ウインドウにはリストボックスがあって、そこには親のテキストボックスに入力された文字が表示される
そういうものを作ろうとしています

親テキストボックスの変数名がm_input
setvalueでプライベートにしてるリストボックス変数にそれを格納しています
ですがこれですとウインドウは表示されてもリストボックスはからっぽです。
一体何が悪いのでしょうか

void 親ウインドウクラス名::OnBnClickedButton1()
{
PopupDlg pdlg;
UpdateData(TRUE);
pdlg.setValue(m_input);
pdlg.DoModal();
UpdateData(FALSE);
}
2018/01/29(月) 09:13:09.91ID:TsZXtod4
>>149
setValueの引数の型や、それをPopupDlgがどのように扱っているのかを見せないと、
それだけではなにもわからないよ。
2018/01/30(火) 19:55:15.15ID:JKI/Ug3X
すっかり遅くなったけど申し訳ない
oninitdialogに処理書いたらなんとかなりました
2018/02/08(木) 23:58:28.60ID:/8AuktPL
MDIウィンドウの場合で、メニューのフォントとフォントサイズは変えられますか?
ツールバーの右端に出てくるボタンの表示非表示を無くすことは出来ますか?
2018/02/09(金) 09:43:56.52ID:DYanFj/G
>>152
MFC Feature Packのメニューやツールバーのことなら、

> メニューのフォントとフォントサイズ
CMFCMenuBar::SetMenuFont

> ボタンの表示非表示
CMFCToolBar::EnableCustomizeButton
2018/02/09(金) 22:24:50.30ID:n0NVuMox
ありがとうございます!試してみます。
2018/02/10(土) 15:55:33.49ID:AljsEXlF
あれ?
CListViewなくなったん?

ウイザードにないw
2018/02/10(土) 19:51:23.23ID:kahd5R/F
SDIかMDIを選んでいれば、ウイザードの最後の項目でViewを選択できるはずです。選ぶ中にCListViewは有るはずです。
2018/02/10(土) 20:30:44.41ID:9BceoeeN
ないんだなーこれが
2018/02/10(土) 23:11:10.45ID:tnD/bf0m
そんなわけ無いだろうと思ったけど、無いね..
CListViewは存在するけどウィザードでは選択できなくなったのか
結構便利なクラスだと思うんだけどな
2018/02/10(土) 23:55:46.38ID:9BceoeeN
だろー
昨日から三回も再インストールしてる
2018/02/11(日) 00:27:35.71ID:Abk6WT5B
確かに2017communityでは、無くなっています。2013Communityには有るようです。
2018/02/11(日) 14:12:45.40ID:TT4/yggk
一応、MSに連絡
2018/02/11(日) 17:09:15.62ID:NeODdjx3
まぁこのへんの仕組みはもう変わらないだろうし、
適当なものを選んでから書き直しても問題ないけどな。
2018/02/12(月) 00:23:21.23ID:gJKrDJtj
TreeViewぐらいで
2018/02/16(金) 06:26:23.85ID:W1XJdyx1
☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆
2018/02/17(土) 09:44:17.48ID:skmHixeO
ウィザードのCListViewの話
去年にはもうあった話題やん
もうちょっと頑張ってくれよ
https://developercommunity.visualstudio.com/content/problem/135607/vs-1541-vcmfc-application-wizard-cant-select-listv.html
2018/02/28(水) 17:21:10.04ID:C00JEheo
>>153

> >>152
> MFC Feature Packのメニューやツールバーのことなら、
>
> > メニューのフォントとフォントサイズ
> CMFCMenuBar::SetMenuFont
>
> > ボタンの表示非表示
> CMFCToolBar::EnableCustomizeButton
使い方がよくわかりません。適当なパラメーターがよくわからず、CMainframe内で呼び出してはみた物の、うまくフォントのサイズは変わりません。
ボタンの追加も消せませんでした。
2018/02/28(水) 18:28:27.62ID:8m4UvZqy
ソースが付いてるんだから読みなよ
2018/03/01(木) 12:14:56.76ID:AHCBMzq/
>>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を呼ばない。
2018/03/01(木) 13:10:39.24ID:txqdSq4Q
軽く煽ると答えを書いてくれるこのスレはチョロいよねw
2018/03/01(木) 18:59:24.33ID:5P8YUW6k
自演じゃなければ
2018/03/01(木) 21:28:45.70ID:qsUh1R3q
質問に答えると負けなんだろうか。
他のスレでも、質問に「答えない」ってだけのしょうもないマウントとりにくる人を見かけるね。
2018/03/01(木) 22:57:24.75ID:txqdSq4Q
>>171
君が質問に答えてあげればいいじゃん
173デフォルトの名無しさん
垢版 |
2018/03/04(日) 03:39:37.81ID:dAX9rxSb
>>168
ありがとうございます。メニューのフォントサイズを変更でき、ボタンの追加・削除を消せました。
私ではとても考え付かない設定です。ありがとう!!
2018/03/22(木) 07:47:15.16ID:QjvVr0xE
温度情報などをグラフにしてFormView上に描画できないか考え込んでいます。自前でCDCに描いていくのではなく、描くのに適しているmfcのライブラリは無いものか、探しています。どなたか目盛りのついたグラフ描画に良いクラスはご存じないでしょうか?
175デフォルトの名無しさん
垢版 |
2018/03/22(木) 10:15:31.03ID:Q2/ylW7b
matlab
2018/03/22(木) 12:52:08.54ID:nhBJfAJ/
>>174
MFC用の有料ライブラリならこのへんがあるけど、使い勝手は知らない
https://www.bcgsoft.com/featuretour/tour270.htm
http://www.codejock.com/products/chart/

無料ならこのへんのソースを読んでみるとか
https://www.codeproject.com/KB/miscctrl/#Charting+Controls
2018/03/22(木) 18:20:31.23ID:gaCTtyVy
matlabはおそらく有料ライセンスですよね。
2018/03/22(木) 18:22:47.87ID:gaCTtyVy
>>176

> >>174
> MFC用の有料ライブラリならこのへんがあるけど、使い勝手は知らない
> https://www.bcgsoft.com/featuretour/tour270.htm
>
グラフとして、このようなグラフが描けると良いなとは思います。 http://www.codejock.com/products/chart/
>
> 無料ならこのへんのソースを読んでみるとか
> https://www.codeproject.com/KB/miscctrl/#Charting+Controls
ちょっと調べてみます。ありがとうございます。
2018/03/22(木) 18:25:07.36ID:gaCTtyVy
昔の話で何ですが、DOSの時代にはMSCなどにグラフ描画ライブラリが付いてきていたような記憶があります。mfcには無さそうですよね。
2018/03/22(木) 19:42:36.73ID:lw2+9AAf
>>179
最新版は知らないが、昔のMFCには無かったと思う。
(昔の) MSDN Library をよく見ているが、発見してない。

でも、グラフ描画って、LineTo() だけでも大体いけると思うんだけど。
2018/03/23(金) 11:19:28.52ID:WP/XswCx
OLE2使ってExcel呼べばいいんじゃね?
MFC関係ないのでスレチだけど
2018/03/23(金) 12:29:30.45ID:S2qLyUZS
>>180
MSC = Microsoft CというDOS用のコンパイラです。1990年代のお話です。
2018/03/23(金) 13:06:50.13ID:5/36eG7n
>>182
知ってるけど
184デフォルトの名無しさん
垢版 |
2018/03/23(金) 18:21:05.39ID:GtydX90K
>>174 >>177
matplotlib の python 用 dll を c/c++ から使う手がある
2018/03/24(土) 13:11:04.87ID:1MnVHuF+
.NETのChartコントロールをユーザーコントロールに置いてMFCダイアログでホストってのをやったことあるよ。
MFCビューでのやり方もMSDNに書いてあるからその通りやればできると思う。
MFC、Windowsフォーム、辺りで検索すれば見つかるはず。
186デフォルトの名無しさん
垢版 |
2018/03/24(土) 13:59:14.06ID:5hh+Vua5
.NET使いたくないって話では
2018/03/25(日) 01:41:05.54ID:AJM/AyB8
.netはちょっと重いです。それでも参考になります。ありがとうございます。。
2018/04/03(火) 23:45:10.59ID:aZg1mfkw
mfcとexcelの連携が全然分かんない……COM?何それ?みたいな
msdnとかstackoverflowとかいろいろ漁ってもだめ。っていうかそもそもmfc、windowsってよくわかんないクラスとか変数とか多すぎじゃない
もっと簡単にプログラミングさせてよ!って思う
2018/04/03(火) 23:46:23.75ID:GFbsNNGI
>>188
VB6でも使ってろ
190デフォルトの名無しさん
垢版 |
2018/04/04(水) 02:52:52.55ID:h2UR4/YM
>>188
馬鹿には無理
2018/04/04(水) 23:16:43.35ID:EgkZfqJG
昔、MFCに慣れてきた頃、趣味でMACのプログラミング勉強しようとして挫折したことがある。
Excel連携なら、その箇所だけでもVBでやるのがお勧め。
2018/04/05(木) 15:58:24.24ID:7o7fJyTF
http://blog.systemjp.net/entry/20120827/p3
193デフォルトの名無しさん
垢版 |
2018/04/06(金) 12:26:46.99ID:sTfZcU1Y
MFC使わなくてもCで良いのに
2018/04/06(金) 16:14:35.30ID:eB6IhESG
まずは、OleViewを起動してな。
2018/04/20(金) 12:34:59.85ID:r2H2v4t5
折れ線グラフをMovetoとLinetoで描くことにしました。線分を引くに当たって、GDI+とGDIでの描画速度を検証してみました。
32bit win7 corei5で24×1,024本の線分を描きましたところ
GDI+ drawLine 7300ms
GDI Moveto Lineto 350ms
という結果になりました。
mfcのMoveto Linetoは速いですよね。画面のサイズによって速度はだいぶ変わるようです。
2018/04/20(金) 12:38:07.74ID:r2H2v4t5
c#などのASP.net環境では、グラフを生成するAPIが有るようですね。サーバ上で簡単にグラフを生成し、クライアントのブラウザから見られます。
2018/04/20(金) 22:27:08.54ID:yO6TKb25
>>195
検証おつ。少数派かもしれませんがこういうの好きです。
2018/04/25(水) 12:53:36.78ID:4obztnoR
CFormView内でOnMouseWheelを使っていたのですが、コンボボックスを配置したところ、OnMouseWheelのイベントに飛んでこなくなりました。
今のところ、コンボボックスを継承して、コンボボックス内のOnMouseWheelイベント内で、親クラスへSendMessage(WM_MOUSEWHEEL )する事で動かせるようにしました。

この先、ほかのコントロールが追加されたら、またOnMouseWheelイベントを拾えなくなると思い、もっと良い方法があればと思っています。どなたか良い解決策をご存じですか?
2018/04/25(水) 13:44:01.27ID:jrjO5Mdd
>>198
CFormView派生クラスのPreTranslateMessage()で横取りしてしまうのが簡単かと
2018/04/26(木) 22:30:35.34ID:tB5nNnhP
確かに横取りで解決できました。ありがとうございます。
コンボボックスをドロップダウンリストに設定した場合のフォーカスについても伺いたいのですが、
CFormViewクラス内にドロップダウンリスト型のコンボボックスを配置すると、キーボードのフォーカスがコンボボックスに設定されてしまいます。
CFormViewに対してSetFocus()を呼び出しても、フォーカスがコンボボックスから外れません。
コンボボックスが青く塗りつぶされて選択状態になっているのを解除する方法をご存知ないですか?
2018/04/27(金) 09:24:02.21ID:V1X+E9CJ
>>200
CFormViewのソースを見るとわかるけど、SetFocus()を呼んでも、
OnSetFocus()の中で最後の位置に復元される。

その動きを別なものにしたいのなら、
OnSetFocus()をオーバーライドして、なにかしらの対応が必要かと。

なにもしないようにしてフォーム自身がフォーカスを持ってしまうとか、
サイズ0のダミーのボタンでも置いておいて、毎回そこにフォーカスを移すとか。
2018/04/27(金) 20:15:49.15ID:Q5E/Se8d
ありがとうございます!
2018/04/27(金) 20:26:32.52ID:Q5E/Se8d
ダブルバッファリングについて質問しても良いですか?

ピクチャーコントロールのダブルバッファリングを行いたいと思っているのですが、画面のサイズを大小いじられ続けると、GDIリソースを食いつぶして、アプリケーションが落ちます。

色々試して、画面サイズ変更イベント内のCreateCompatibleBitmapのところで確保したGDIリソースが DeleteObject();されるときに、GDIリソースを一つ多く確保し続けるようです。

CBitmap test;
test.CreateCompatibleBitmap(ピクチャーコントロールのdc,-,-); //GDIリソースが+2される
test.DeleteObject(); //GDIリソースがー1される

差し引きGDIリソースの確保量が+1になります。
そのうち線を書けなくなり、アプリケーションがクラッシュします。

使い方がどこか良くないのだと思うのですが、パラメータ等が良くないのかな。などと考え込んでいます。解決策をご存知ないですか?GDIリソースの確保量はタスクマネージャの設定でGDIリソースを表示できるようにして確認しています。
2018/04/27(金) 21:30:38.89ID:V9eZGmhL
CreateCompatibleBitmapの前後5行ぐらいに原因がありそうな気がする
205デフォルトの名無しさん
垢版 |
2018/04/28(土) 06:46:29.77ID:7taUW+bg
>>203
自分で開放しないといけないのを忘れてるだけじゃないかな
2018/04/28(土) 13:43:55.18ID:RCDKOgRU
リソースの解放はDeleteObject();ではないのですか?
CreateCompatibleBitmapの前は、CreateCompatibleDCを呼び出しています。
CreateCompatibleDCのDCパラメータをNULLに設定すると、GDIリソースの浪費は無くなりますが、今度は出てくる画面が白黒になってしまいます。
2018/04/28(土) 15:02:19.62ID:7HtEIURB
>>206
ピクチャーコントロールのDCをGetDC()で取得してしてるのでは
2018/04/28(土) 15:36:31.72ID:K6dn8QZh
スタック上でCBitmap test;とやった場合
関数を抜けるときに勝手にデストラクタでDeleteObjectされると思う。
もう少しコード晒さないと判らない。
2018/04/28(土) 20:43:45.95ID:RCDKOgRU
CreateCompatibleDCでは、ピクチャーコントロールのDCを取得させています。
ピクチャーコントロールのDCを渡すと、CreateCompatibleBitmap時にGDIリソースを消費する量が2となるようです。
CreateCompatibleDCにNULLを指定した場合(確か)CreateCompatibleBitmap時のGDIリソース消費量ばかり1となります(以後の描画は白黒になります)。

今しばらく書いているコードをみられません。
CreateCompatibleDCやCreateCompatibleBitmapをOnSize時に破棄させてはサイズを変えて再生成させると、GDIリソースが消費されて減っていくので、
アプリケーション生成時に画面の最大サイズでCreateCompatibleDCさせておき、あとはCreateCompatibleDCしないように変更することも考えております。

アプリケーション生成時に画面のサイズ分のCreateCompatibleDCさせるようにすると、マルチモニタ環境の時などの動作が正常に動作しないかもしれないと思い、
可能ならOnSize内でDeleteObject();させてCreateCompatibleDCさせたいと思っています。

なお、OnSizeから抜けてもGDIリソース消費量は下がってくれないようです。
2018/04/28(土) 21:09:49.29ID:K6dn8QZh
207が言っているのは
bitmap.CreateCompatibleBitmap(pict->GetDC(), rc.Width(), rc.Height())
してるんじゃないかって事。これだとリークします。
211デフォルトの名無しさん
垢版 |
2018/04/29(日) 02:54:49.07ID:4Tl9MZgN
ReleaseDC
2018/04/29(日) 22:23:44.07ID:dUB73wKv
>>212

> 207が言っているのは
> bitmap.CreateCompatibleBitmap(pict->GetDC(), rc.Width(), rc.Height())
> してるんじゃないかって事。これだとリークします。

しています。その上でどのように直すべきか察しが付きません。やはりReleaseDCで直りますか?
2018/04/29(日) 23:00:49.09ID:azFTonkH
ReleaseDCで直る。
私なら 解放不要なCDC::FromHaqndleを使う。
■ このスレッドは過去ログ倉庫に格納されています