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
2018/07/23(月) 18:19:00.33ID:+TIH++V2
tooltipの表示内容を一つのピクチャコントロール内で変更したいのですが、マウスカーソルが一端ピクチャコントロールから外れないと、ツールチップの内容が更新されないようです。onmousehoverなどを使わないと駄目でしょうか?
2018/07/24(火) 07:28:28.65ID:vj16B9du
tooltipの解決策を見つけました。
http://www.geocities.jp/sunayamak/study/mfctooltip.html
2018/07/27(金) 23:03:38.30ID:FVoX1kIB
Tooltipの件ありがとうございます。
おかげさまで何とか解決できました。
2018/08/02(木) 20:01:14.70ID:lFbk57E7
datを生成するMFCプログラムがありまして、そのdatからデータを読み込んでexcelの形式に合わせて出力するダイアログベースのMFCプログラムがあります
最初のプログラムから呼び出されて処理をするだけなので、ウインドウの表示とかしないです。ただただ処理して終わりです

それで問題なんですが通常のダイアログを使ったプログラムのように読み込み・変換処理を全部ダイアログ部分に書いてあるんです
ダイアログ使いもしないのにここに書くのおかしくないですか?と聞いたら表示されないんだしいいでしょと。画面表示を行わないMFCプログラムの場合、コードはどこに書くのが自然なんでしょうか?
242デフォルトの名無しさん
垢版 |
2018/08/03(金) 10:09:25.61ID:SxfGFWQF
スレッドを別けたいという意味か?
2018/08/03(金) 18:35:46.47ID:uhu4d/dd
あーすいませんわかりにくかったですね
メインプログラムがあってその内部でdatを生成するんですよ
で、そのdatのパスをコマンドライン引数で別のプログラムに渡すんですね
スレッドというかそもそも2つのプログラムですわ
244デフォルトの名無しさん
垢版 |
2018/08/03(金) 18:52:53.67ID:o/XiGXrO
MFC関係ないのにここで聞くのおかしくないですか?
2018/08/03(金) 19:53:47.89ID:82qJLwKQ
事情が見えない。

どーーしても別プログラムにする事情があると仮定すれば
DialogやConsoleで構わないと思う。
冗長さを排除したいなら_tWinMainから書く手もあるけど
体感できるような差は出ないかと。表示されないんだしいいでしょw
2018/08/05(日) 03:07:58.27ID:lHG7kQYc
>>241
>ダイアログ使いもしないのにここに書くのおかしくないですか?

じゃぁどこに書けばいいの?
2018/08/05(日) 10:12:06.95ID:D9xcyyWx
>>241
MFCの仕組みを使いつつ、まったくウィンドウ表示が不要なものなら、
アプリケーションクラスのInitInstance()の中で処理して、
FALSEを返してすぐ終了するという流れでよいのでは。
2018/08/06(月) 22:59:00.43ID:OCzRfTP8
>>247
結局それにしました。
あとは処理を分担するふっつーのC++クラスいくつか作ってダイアログは完全に使わない感じで
249デフォルトの名無しさん
垢版 |
2018/08/07(火) 05:06:10.31ID:OlmXtX1U
サマータイムも意味がないがそれ以上に意味がない
2018/08/14(火) 16:45:48.75ID:/E7izJ6Y
横から失礼します
InitInstanceの場合は標準出力にメッセージを出せますか?
標準出力に出すmfcプログラムだとすると、_twinmainを使うとどうでしょう。
2018/08/14(火) 19:27:19.22ID:iucfbso2
どちらもやったことありませんが可能だと思います。
私なら _tmain 使うとおもいますが。
252155
垢版 |
2018/08/15(水) 09:28:56.94ID:IMvh29W2
CListViewがウィザードに帰ってきた!!
やほーい
2018/09/20(木) 15:00:47.62ID:i16QdaBT
MFCというかプログラミング姿勢に関しての質問かもしれないんですけど
CやC++で標準的に実装されてる機能とMFCクラスで実装されてる機能、どちらを使っても
同じことが実現できる場合、どちらを優先して使っていくべきなんでしょうか
要するに文字列ならchar*かstringかCStringか
ファイル操作ならfopenかstreamかCfileかみたいな
254デフォルトの名無しさん
垢版 |
2018/09/20(木) 16:28:00.36ID:+UNWjTgc
MFCはオワコン

C#
使え
2018/09/20(木) 18:01:52.92ID:TMKaX7fO
>>254
そうでもない。

>>253
文字列は、単に文字列を保持したい場合や、文字列連結を行いたいような場合は、CStringが便利だと思う。

パーサーなんかを自作する時は、char *が便利。
2018/09/20(木) 18:03:18.25ID:TMKaX7fO
>>253
ファイル操作は、経験上は、fopen()が便利かな。

CFileは意外と不便だった気がする。


stringは、敢えて使う必要は無いと思う。CStringで十分。
257デフォルトの名無しさん
垢版 |
2018/09/20(木) 18:03:55.46ID:a/ASjwi8
俺はできるだけ標準のほうを使うように切り替えた
2018/09/20(木) 22:16:17.61ID:P1fXZpxD
機能が同等なら好みでいいと思うけど、ファイル操作みたいにOS依存が強い機能は
標準ライブラリじゃ足りない場合が多いかな。
2018/09/21(金) 00:47:14.84ID:fuc3wJjq
MFCのGUI特化した本ないのかねー
大概が初心者向けでポインタやら構造体やらMFCと関係ないことが大半を占めてて知りたいことはうすーくしか書いてないのばっか
2018/09/21(金) 06:34:48.10ID:l8rNCGoZ
>>259
20年も前の本だが、お奨めは
ttps://calil.jp/book/475611749X
2018/09/21(金) 08:13:00.69ID:US5K8oGJ
>>260
ありがと
1万くらいなら買うんだけどなぁ
2018/09/21(金) 11:19:39.33ID:Nv8vO9db
本でなくて申し訳ないけど
ヘルプ。
クラスも大幅に拡張されてしまい昔の良書だとツリービュー、リストビュー位まで
最近のリッチな所はヘルプからサンプルソースにたどるのが早いかと
263デフォルトの名無しさん
垢版 |
2018/09/21(金) 13:21:21.50ID:9xBQcUDg
Windows本体ってMFCで作ってるの?
264デフォルトの名無しさん
垢版 |
2018/09/21(金) 17:59:38.20ID:/FmUXr1R
カーネルという意味では、ないやろな。性能面の要求はそんなに甘くないよ。
周辺の付加的モジュールでは、ATLとかは使ってるかも
2018/09/21(金) 19:07:45.12ID:M0K6QlhH
Windows7のペイントとかワードパッドとかをSpy++で見ると、
Afx〜の付くウィンドウクラス名が使われてるから、
このあたりはまだMFCで作られてたんじゃないだろうか。
266デフォルトの名無しさん
垢版 |
2018/09/21(金) 22:10:32.71ID:Yrc2SKMF
なるほど
2018/09/22(土) 09:01:41.72ID:f3qG2b9t
「コンピューターの管理」なんかも、AfxWnd42やAfxFrameOrView42uが出てくる。
268デフォルトの名無しさん
垢版 |
2018/09/22(土) 12:43:01.39ID:xOVRbYWf
>>261
>>259
うちにあるよ
269デフォルトの名無しさん
垢版 |
2018/09/22(土) 12:44:10.56ID:xOVRbYWf
>>263
あやしいよな
2018/10/02(火) 12:20:10.07ID:T1hsru+o
VC++6.0で作っています。 MFCです。
普通にSDIを作りますが、そこからメニューバー等からダイアログボックスをモードレスで起動します。
すると、ダイアログを起動しながらメインウインドウも触れるようになるのですが、そのフォーカスを
モードレスダイアログとメインウインドウとをマウスを使わずにキーボードで切り替えることって出来ませんか

MSのWindowsOSのAlt+Tabではこれらはひとつとして認識されているようでこれでは切り替えられません
ちなみに、Windows7です
271デフォルトの名無しさん
垢版 |
2018/10/02(火) 12:45:27.08ID:+xKncks4
モードレスなら出来るやろ
2018/10/02(火) 14:53:03.01ID:T1hsru+o
>>271
メインウインドウからモードレスダイアログを起動するのですが、すると、Alt+Tabではこれらはひとつとして
認識されますよ
273デフォルトの名無しさん
垢版 |
2018/10/02(火) 15:13:04.28ID:yDKwoLm6
Ctrl+TAB
2018/10/02(火) 15:45:33.11ID:T1hsru+o
>>273
Ctrl+TABでは、ダイアログ上のコントロールのフォーカスが変わっていきます
ウインドウの切り替えはできません
275デフォルトの名無しさん
垢版 |
2018/10/02(火) 15:50:20.77ID:yDKwoLm6
Ctrl+Alt+TAB
2018/10/02(火) 16:01:18.57ID:T1hsru+o
>>275
やってみましたが、Alt+Tabでアプリを変えていけますが、そこに出てくるアプリの数が減っているのを
除いて、同じ動作です。 アプリが変わります
2018/10/02(火) 16:28:36.02ID:7CL4bG8Y
モードレスの親がメインウィンドウなら切り替えできず、親がない(デスクトップ)なら切り替えできるのでは。
親がメインウィンドウの場合でも、PreTranslateMessageでTABキーを補足してSetForegroundWindowとかすればいいと思う
2018/10/02(火) 16:35:36.67ID:T1hsru+o
デフォルトでは用意されていないのかな
PreTranslateMessageを使えばなんでもできますが、
メインウインドウとダイアログと両方に書かないといけないからなあ。しょうがないのかな
2018/10/02(火) 16:38:35.01ID:T1hsru+o
PreTranslateMessageで書きますか。 キーは何をあてるのが自然でしょうか
Ctrl+Tabあたりかな
タブコントロールは、Tab だけと Shift+Tabで動きますからね
280デフォルトの名無しさん
垢版 |
2018/10/02(火) 21:23:19.58ID:R8M7QKDK
vista、vs.net2003 vc++の組み合わせだが
ALT+TABでアプリがきりかわりながら
ふつうにSDIとモードレスのダイアログでトグルする
2018/10/02(火) 21:49:14.12ID:T1hsru+o
>>280
わざわざありがとう。私と環境がちがうからなのかな
PreTranslateMessageを利用して、Ctrl+Tabでプログラムを作りました。これでうまく行きました
282デフォルトの名無しさん
垢版 |
2018/10/07(日) 14:30:22.57ID:stJt0pET
>>281
ダイアログをCreateする時、親ウィンドウ(省略時=NULL)を指定していないから、
アプリケーションのメインウィンドウ(=AfxGetMainWnd())が、親ウィンドウが
になっているからでは?

CDialog::Create(CWnd::GetDesktopWindow())

とかでいけるはず。 MFCとは関係なく、Windows APIでは、所有ウィンドウ
(Owner Window)と、親ウィンドウ(Parent Window)は別管理。
283デフォルトの名無しさん
垢版 |
2018/10/15(月) 20:08:17.72ID:xZyzsY81
MSDN見ても解決しないのでお願いします。
CMFCColorDialogで作成した色選択ダイアログの動きが少しおかしいです。
どれかの色(六角形)を選択すると[OK]ボタンのフォーカスが当たり、再度
別の色を選択するとフォーカスが外れるんですが、仕様でしょうか??
2018/10/15(月) 20:10:37.85ID:xZyzsY81
.DoModal()を使っています。
2018/10/16(火) 10:55:52.13ID:gOw5Bgha
>>284
VS2008のNewControlsサンプルではそういう動作は見られないけど、
再現できるサンプルでもありますか?
2018/10/16(火) 20:59:43.03ID:KuFMVrck
>>285
わざわざ試していただいてありがとうござます!
こちらの環境、Windows10、VisualStudio2017なのでこれが原因っぽいです。
古いVisualStudioで試してみます。
業務アプリなのでサンプルは出しにくいです。申し訳ないです。
287281
垢版 |
2018/11/03(土) 20:11:07.69ID:FHfXrfBW
>>282
おお、今頃ですが、ありがとうございました
これでAlt+Tabでもモードレスウインドウが出てくるようになりました !
2018/11/03(土) 20:17:24.87ID:FHfXrfBW
今まで、VC++6.0でずっとやってきました。特にそれで問題なかったからですが、意を決して、
Visual Studio 2017をインストして、古いソースコードを移植しようと思っています

VS2017に古いVC++6.0のdswファイルを読ませたのですが、うまくj変換できないようですが、どうしたら良いでしょうか
VC++6.0からの変換は出来ませんか
2018/11/03(土) 20:20:22.32ID:Z2+VfrEc
ワークスペースはソリューションに変わった。新しくソリューションファイルを作って、そこにC/C++のファイルを追加してビルドだ。
2018/11/03(土) 20:48:27.94ID:FHfXrfBW
インクルードファイルとかいろいろエラーがたくさん出てきたよ
これ相当無理っぽい???
2018/11/03(土) 20:50:34.93ID:Z2+VfrEc
>>290
エラー貼れ
2018/11/03(土) 21:08:57.06ID:FHfXrfBW
取りあえず、簡単に比較するために、VC++6.0でMFCのSDIのデフォルトを作りました
それと比較するため、VS2017でC++のWindowsデスクトップのデスクトップアプリケーションのデフォルトを作りました

すると、VS2017の方はMFC自身を使わないバージョンなのかな、CMainFrmとかIMPLEMENT_DYNCREATEとかなくて
VC6.0++のMainFrm.cppとかを2017の方に持ってきてコンパイルしたらCMainFrmが定義されてないとか
ずらっとたくさん出てきます
2018/11/03(土) 21:11:31.59ID:Z2+VfrEc
MFCに対応したプロジェクト/ソリューション設定じゃないとダメかも
2018/11/03(土) 21:15:37.09ID:FHfXrfBW
>>293
VS2017で、それを探してるのですが見つからないのですよ
MFCには対応してるのですよね。2015かそれ以前にはすでに対応してると聞いていたのですが
MFCを使ったデフォルトのコード生成はしてくれないとか??? w
2018/11/03(土) 21:19:34.89ID:uOx37ouV
Visual C++の中にMFCがある。Visual C++という項目がなければ、インストールが間違っている。
2018/11/03(土) 21:23:19.86ID:FHfXrfBW
>>295
メニューのファイルから新規作成、プロジェクトを選ぶと、その中にVisual C++はちゃんとありますよ
で、そこでWindowsデスクトップアプリケーションを選んでデフォルトを作ると、コードはSDKみたいなコードを吐きます
で、Windowsデスクトップウィザードってのがあったので、今これを選択してみたのですが、
アプリケーションの種類をコンソールにすると、その右にあるMFCのチェックボックスが有効になるのですが
2018/11/03(土) 21:24:15.77ID:FHfXrfBW
続き
Windowsアプリケーションってのを選ぶと、MFCのチェックボックスが使用不可になってしまいます
2018/11/03(土) 21:27:13.99ID:uOx37ouV
MFCアプリが作れないなら、インストールで追加するしかないぜ。
2018/11/03(土) 21:29:11.91ID:uOx37ouV
https://twitter.com/katahiromz/status/1058697364821528576
https://twitter.com/5chan_nel (5ch newer account)
2018/11/03(土) 21:29:36.23ID:FHfXrfBW
おいおい、なんだこれ
VS2017で、新規作成、プロジェクトで、Windowsデスクトップウィザードで
コンソールアプリケーションでMFCをチェックしてデフォルトのコードを自動生成してみました
そしてソリューションのビルドしたら、CWinAppが定義されてないとかエラーがわんさか出てきたぞ

おいおい、デフォルトの自動生成コードもビルド出来ないじゃん
2018/11/03(土) 21:30:32.78ID:uOx37ouV
左下、「探しているものが見つからないとき」
2018/11/03(土) 21:33:48.34ID:FHfXrfBW
>>299
おや、そこが違う。 私のは、

visual C++の下に
Windowsデスクトップ
クロスプラットフォーム
MFC/ATL
テスト
その他
Extensibility

ってなってて、 MFC/ATLのところは
ATLプロジェクト
ってのだけがあります
2018/11/03(土) 21:37:10.59ID:FHfXrfBW
何かインストを失敗してるのかなあ。 あるいはインストするときに何をインストするのかチェックがあったんだが
それを間違えてるのか。 でも俺がチェックをしなかったのはモバイル関係のところくらいだったんだよねえ
2018/11/03(土) 21:38:58.82ID:uOx37ouV
https://qiita.com/tadnakam/items/042c7a19bf115e3b096f
2018/11/03(土) 21:40:59.04ID:uOx37ouV
VS2017は頻繁に変更されるもんだから、ちょっと混乱してるみたい。
2018/11/03(土) 21:48:14.06ID:FHfXrfBW
>>304
ありがとう。
右側の概要ってとこが、私のでは、インストールの詳細になっていて、
MFCとATLのサポート
ってのが私のでは、
x86用とx64用のVisualC++ATL
x86用とx64用のVisualC++MFC
ってわかれていて、ATLの方にだけデフォルトではチェックが入っていてMFCの方のチェックは
デフォルトでは外れていました。

チェックして再インストしてみますねw
2018/11/03(土) 21:52:26.12ID:uOx37ouV
インストよりもインスコの方が俗語の通りがいい。
2018/11/03(土) 22:01:09.50ID:FHfXrfBW
ただいま、 再インスコ中です
みなさん、 VS2017をインスコするときは、

MFC はデフォルトでは入らない !!!

ことがわかりました
VS2017をインスコするときは、注意しましょう
インスコするとき、オプションをチェックすると入ります、 多分。今やってるところ
2018/11/03(土) 22:07:33.60ID:uOx37ouV
Qiitaの記事、結構役に立ってるじゃん。責任ある情報技術者なら、Qiitaに記事を書ける程になってもらいたいね。
2018/11/03(土) 22:11:49.30ID:NHF1sC9n
>>309
qitta って査読制ですか?
2018/11/03(土) 22:16:25.81ID:FHfXrfBW
出来ました。
MFCのインストがちゃんとできて、
MFCアプリケーションでデフォルトのMDI作ってみたら、 あら、すげえ

クラスビューなんかが出てくるのねw
2018/11/03(土) 22:18:01.50ID:uOx37ouV
最低限の審査はあると思うぞ。
詳しくは規約を。
2018/11/03(土) 22:30:48.57ID:FHfXrfBW
おや、新しいバージョンだと、
strcpy( a, b )
で、b に CSringとか出来ないんだね。 前の古いバージョンでは出来たのに

CString で返す関数も、char a[10] とかで宣言したのを、古いバージョンでは、retuen a
って出来たんだが、新しいバージョンではエラーになる。 一旦
CString ret;
ret = a;
ってやって、return ret;
ってやったらエラーが消えた

いろいろと細かい修正しないとダメみたいだねえ
2018/11/03(土) 22:35:23.28ID:uOx37ouV
暗黙の型キャストのあいまいさが嫌いな人が存在するらしい。
2018/11/03(土) 22:42:34.44ID:FHfXrfBW
>>314
いろいろとありがとう。 今日はとりあえずここまでにしておきます
316デフォルトの名無しさん
垢版 |
2018/11/04(日) 14:43:10.46ID:5RY1Lh2I
>>313
きも
2018/11/04(日) 21:56:04.47ID:GQHsCvIR
>>313
http://gurigumi.s349.xrea.com/programming/visualcpp/unicode.html
2018/11/05(月) 10:05:31.23ID:iQgkSIfQ
>>317
これありがとう。LPCWSTRの関係で、めっちゃ詰まってました
2018/11/05(月) 10:35:49.97ID:cQLaagjN
>>313
そもそも、CStringはTCHARを扱うクラスなのに、
_tcscpyではなくstrcpyを使っていたのが間違い
2018/11/05(月) 12:07:09.35ID:iQgkSIfQ
>>319
今は、_tcscpyを使ってもエラーが出るけどな
2018/11/05(月) 12:15:02.40ID:mvX3Qu15
>>320
それはエラーではなくてセキュリティ上の警告では
2018/11/05(月) 12:20:01.12ID:iQgkSIfQ
>>321
そうです。 _sを付けたのを使えって
警告の設定を変更しないとエラーになってコンパイルが通りません
それをプロパティの設定で、Unicodeからマルチバイトに切り替えてコンパイルしたんだけど、どうも
Unicodeのままでうまく切り替わらないようなんですよねえ。 どうなってるのか。 今は時間がないので
またあとでやってみますが
2018/11/05(月) 12:26:42.35ID:mvX3Qu15
>>322
警告だから、それに関してはコンパイルは通る。
他の場所がコンパイルエラーになっているだけかと。
2018/11/05(月) 16:42:29.67ID:Lc5ZfJaA
VS2017ですが、新規作成で、MFCアプリケーションで作った時、
新規作成途中に出てくるSDLのチェックをつけて作成したときと、はずして作成したときと両方してみました

すると、SDLつきの時は、_tcscpyはエラーになってコンパイルできませんが、
SDLをはずして新規作成したのものは、エラーにならずにコンパイルできて実行できます
デフォルトはSDLつきなので、コンパイルできません

次に、新規作成して出来上がったプロジェクトで、
メニューのプロジェクトから一番下のプロパティに入って、構成プロパティ、C/C++の全般にある
SDLチェックというところで、はい(/sdl) いいえ(/sdl-)を切り替えてやってみると、
この切り替えが動作せず、SDLのオン、オフが効きません。 プロジェクトの新規作成のときに設定したものが
残っていて、あとからここのプロパティで変更ができないようです

同じように、プロパティの構成プロパティの全般で、文字セットがデフォルトではUnicode文字セットを使用する
になってるのですが、これをマルチバイト文字セットを使用するにしても
Unicodeのままでマルチバイトにならないようです

バグですかねえ?
325デフォルトの名無しさん
垢版 |
2018/11/05(月) 17:14:38.42ID:o5QGnfIr
新規のプロジェクトにマルチバイト使うのやめようぜ
2018/11/05(月) 20:46:10.49ID:fgA77wSW
>>324
VisualStudioCommunity2017で試したが、普通に設定が反映されたぞ。
DebugとRelease、x86とx64で設定が別なのに気づいてないとかじゃないか?
2018/11/05(月) 21:22:43.21ID:Lc5ZfJaA
>>326
できました。多分それです。ありがとうございました

コードの編集画面の上にあるコンボボックスを見ると、Debugとx86になってるのですが、
その状態でプロパティを開くと、なぜか、x64になってました。
なのでプロパティ画面で、上にあるプラットフォームをアクティブ(Win32)に変えると、画面がおかしくなって
びっくりしましたが、画面の再描画ができなかっただけなようで、再びプロパティ画面を出して
アクティブ(Win32)を確認してから、マルチバイトやSDLの変更をしたら、ちゃんと動いたようです

プロパティ画面を開くときは、連動してないので必ず確認してから変更しないといけないということですね

ちなみになんとか誤魔化せないかと思って、 stdafx.h の最初に
#undef UNICODE
#undef_UNICODE
ってやってみたら、コンパイルまでは全部のcppファイルで出来たのですが、リンクで未解決エラーが出て
出来ませんでした
2018/11/05(月) 22:12:55.20ID:fgA77wSW
さすがにそれはおかしいのでVS2017再インストール推奨
2018/11/05(月) 22:23:54.08ID:Lc5ZfJaA
>>328
マジですか。 再インストしようかな
2018/11/05(月) 23:46:35.28ID:2AHpASAJ
_T() ?
331デフォルトの名無しさん
垢版 |
2018/11/06(火) 11:56:33.16ID:rqFrnjhJ
>ちなみになんとか誤魔化せないかと思って

>リンクで未解決エラー

MessageBoxA と MessageBoxW とかを自分で書き分けてみると解決するはず
332デフォルトの名無しさん
垢版 |
2018/11/11(日) 14:34:30.31ID:vUUak6BF
http://r2.upup.be/wV2qsULdHm
333デフォルトの名無しさん
垢版 |
2018/11/11(日) 17:52:29.57ID:96wp+TZd
しねNG
2018/12/07(金) 17:05:15.69ID:meFvbPH8
MFCのツールバーって、リバーのように、「ツールバーを固定する」の動作はできませんかね。
ユーザーがコマンドを選択したら、その場所から動かすことができなくなるようにしたいのですが。
335デフォルトの名無しさん
垢版 |
2018/12/08(土) 16:28:45.38ID:S81QsiH/
subclass化してメッセージループトラップしてmoveをにぎりつぶす
2018/12/17(月) 19:07:24.59ID:Fq49NMNr
HWND hWnd はできるけど、
HDC hDC って、別アプリ(別プロセス)に渡して、書き込ませることは出来ないの?
HDC の識別番号が、プロセスごとに別の「名前空間」みたいなことになってるのかな。
2018/12/17(月) 19:18:47.70ID:Fq49NMNr
GDI objects support only one handle per object. Handles to GDI objects are private to a process.
That is, only the process that created the GDI object can use the object handle.

↑によれば、HDC は、プロセス・プライベートだって、書いてるけど、
たまたますごいことみつけちゃったんだ・・・実は。

みんな知ってる?
2018/12/18(火) 08:47:01.21ID:G1V4hdx+
実は、PrintWindow(HWND hWnd, HDC hDC, DWORD flag) API を使うと、HDC をプロセスの
垣根を越えて渡せるんだ。プロセスA からプロセス B に HDC を渡す場合、
プロセスA で、PrintWindow() API を呼び出す。hWnd にはプロセスBで作成した
Window の HWND を、hDC には、プロセスAに所属している HDC を渡す。

MFCを使って実験してみると、この場合、プロセスBの hWnd にWM_PRINT メッセージが
来るが、OnPrint() ハンドラが BeginPaint(), EndPaint() を使わずに、メッセージから受け取った
hDC を CDC *pDC に入れて、WM_PAINT の時と同じ OnDraw() を呼び出すらしい。
らしいと言ったのは、もしかしたら、MFCが途中で何らかの手を加えている可能性があるから。

で興味深いのは、この時の pDC->m_hDC の値は、プロセスA のオリジナルの値とは
数値的には異なっていると言うこと。

推定ではあるが、PrintWindow() API を使うと、Windows System が、プロセスA での hDC の
識別番号とは異なる識別番号を、WM_PRINT メッセージのの hDC に与える。
これは、>>337 で書いているとおり、HDC は、process private だから、プロセスごとに
「名前空間」が異なるため、プロセスの垣根を越えるときには、同じ値をそのまま使うことは
出来ないため。

でも、結局、「番号」が変わっているだけで、同じ Device Context を「指している」ので、
効率よく 描画動作を行える。

この API を使えば、プロセスA で用意した実DC や メモリーDC に、プロセスB の OnDraw()
によって直接書き込ませることが出来ることを確認済み。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況