MFC相談室 mfc23d.dll [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>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!" が出ているのならちゃんと再試行を押そうよ。
それだけで原因そのものはわかる。 CListCtrでレポート表示のFullRowSelectをカスタムドローを弄ってます。
マウスがアイテムの上に来たら色を変えたいけど、カスタムドローのイベントハンドラだけできますか?
OnMouseMoveでどこにあるか判定してカスタムドローで描画が必要?
ビットマップを3番目のSubItemだけに貼るとか、16x16のSmallサイズ以外だとうまくいかないとか、癖が凄い。 tooltipの表示内容を一つのピクチャコントロール内で変更したいのですが、マウスカーソルが一端ピクチャコントロールから外れないと、ツールチップの内容が更新されないようです。onmousehoverなどを使わないと駄目でしょうか? Tooltipの件ありがとうございます。
おかげさまで何とか解決できました。 datを生成するMFCプログラムがありまして、そのdatからデータを読み込んでexcelの形式に合わせて出力するダイアログベースのMFCプログラムがあります
最初のプログラムから呼び出されて処理をするだけなので、ウインドウの表示とかしないです。ただただ処理して終わりです
それで問題なんですが通常のダイアログを使ったプログラムのように読み込み・変換処理を全部ダイアログ部分に書いてあるんです
ダイアログ使いもしないのにここに書くのおかしくないですか?と聞いたら表示されないんだしいいでしょと。画面表示を行わないMFCプログラムの場合、コードはどこに書くのが自然なんでしょうか? あーすいませんわかりにくかったですね
メインプログラムがあってその内部でdatを生成するんですよ
で、そのdatのパスをコマンドライン引数で別のプログラムに渡すんですね
スレッドというかそもそも2つのプログラムですわ MFC関係ないのにここで聞くのおかしくないですか? 事情が見えない。
どーーしても別プログラムにする事情があると仮定すれば
DialogやConsoleで構わないと思う。
冗長さを排除したいなら_tWinMainから書く手もあるけど
体感できるような差は出ないかと。表示されないんだしいいでしょw >>241
>ダイアログ使いもしないのにここに書くのおかしくないですか?
じゃぁどこに書けばいいの? >>241
MFCの仕組みを使いつつ、まったくウィンドウ表示が不要なものなら、
アプリケーションクラスのInitInstance()の中で処理して、
FALSEを返してすぐ終了するという流れでよいのでは。 >>247
結局それにしました。
あとは処理を分担するふっつーのC++クラスいくつか作ってダイアログは完全に使わない感じで 横から失礼します
InitInstanceの場合は標準出力にメッセージを出せますか?
標準出力に出すmfcプログラムだとすると、_twinmainを使うとどうでしょう。 どちらもやったことありませんが可能だと思います。
私なら _tmain 使うとおもいますが。 CListViewがウィザードに帰ってきた!!
やほーい MFCというかプログラミング姿勢に関しての質問かもしれないんですけど
CやC++で標準的に実装されてる機能とMFCクラスで実装されてる機能、どちらを使っても
同じことが実現できる場合、どちらを優先して使っていくべきなんでしょうか
要するに文字列ならchar*かstringかCStringか
ファイル操作ならfopenかstreamかCfileかみたいな >>254
そうでもない。
>>253
文字列は、単に文字列を保持したい場合や、文字列連結を行いたいような場合は、CStringが便利だと思う。
パーサーなんかを自作する時は、char *が便利。 >>253
ファイル操作は、経験上は、fopen()が便利かな。
CFileは意外と不便だった気がする。
stringは、敢えて使う必要は無いと思う。CStringで十分。 機能が同等なら好みでいいと思うけど、ファイル操作みたいにOS依存が強い機能は
標準ライブラリじゃ足りない場合が多いかな。 MFCのGUI特化した本ないのかねー
大概が初心者向けでポインタやら構造体やらMFCと関係ないことが大半を占めてて知りたいことはうすーくしか書いてないのばっか >>259
20年も前の本だが、お奨めは
ttps://calil.jp/book/475611749X >>260
ありがと
1万くらいなら買うんだけどなぁ 本でなくて申し訳ないけど
ヘルプ。
クラスも大幅に拡張されてしまい昔の良書だとツリービュー、リストビュー位まで
最近のリッチな所はヘルプからサンプルソースにたどるのが早いかと カーネルという意味では、ないやろな。性能面の要求はそんなに甘くないよ。
周辺の付加的モジュールでは、ATLとかは使ってるかも Windows7のペイントとかワードパッドとかをSpy++で見ると、
Afx〜の付くウィンドウクラス名が使われてるから、
このあたりはまだMFCで作られてたんじゃないだろうか。 「コンピューターの管理」なんかも、AfxWnd42やAfxFrameOrView42uが出てくる。 VC++6.0で作っています。 MFCです。
普通にSDIを作りますが、そこからメニューバー等からダイアログボックスをモードレスで起動します。
すると、ダイアログを起動しながらメインウインドウも触れるようになるのですが、そのフォーカスを
モードレスダイアログとメインウインドウとをマウスを使わずにキーボードで切り替えることって出来ませんか
MSのWindowsOSのAlt+Tabではこれらはひとつとして認識されているようでこれでは切り替えられません
ちなみに、Windows7です >>271
メインウインドウからモードレスダイアログを起動するのですが、すると、Alt+Tabではこれらはひとつとして
認識されますよ >>273
Ctrl+TABでは、ダイアログ上のコントロールのフォーカスが変わっていきます
ウインドウの切り替えはできません >>275
やってみましたが、Alt+Tabでアプリを変えていけますが、そこに出てくるアプリの数が減っているのを
除いて、同じ動作です。 アプリが変わります モードレスの親がメインウィンドウなら切り替えできず、親がない(デスクトップ)なら切り替えできるのでは。
親がメインウィンドウの場合でも、PreTranslateMessageでTABキーを補足してSetForegroundWindowとかすればいいと思う デフォルトでは用意されていないのかな
PreTranslateMessageを使えばなんでもできますが、
メインウインドウとダイアログと両方に書かないといけないからなあ。しょうがないのかな PreTranslateMessageで書きますか。 キーは何をあてるのが自然でしょうか
Ctrl+Tabあたりかな
タブコントロールは、Tab だけと Shift+Tabで動きますからね vista、vs.net2003 vc++の組み合わせだが
ALT+TABでアプリがきりかわりながら
ふつうにSDIとモードレスのダイアログでトグルする >>280
わざわざありがとう。私と環境がちがうからなのかな
PreTranslateMessageを利用して、Ctrl+Tabでプログラムを作りました。これでうまく行きました >>281
ダイアログをCreateする時、親ウィンドウ(省略時=NULL)を指定していないから、
アプリケーションのメインウィンドウ(=AfxGetMainWnd())が、親ウィンドウが
になっているからでは?
CDialog::Create(CWnd::GetDesktopWindow())
とかでいけるはず。 MFCとは関係なく、Windows APIでは、所有ウィンドウ
(Owner Window)と、親ウィンドウ(Parent Window)は別管理。 MSDN見ても解決しないのでお願いします。
CMFCColorDialogで作成した色選択ダイアログの動きが少しおかしいです。
どれかの色(六角形)を選択すると[OK]ボタンのフォーカスが当たり、再度
別の色を選択するとフォーカスが外れるんですが、仕様でしょうか?? >>284
VS2008のNewControlsサンプルではそういう動作は見られないけど、
再現できるサンプルでもありますか? >>285
わざわざ試していただいてありがとうござます!
こちらの環境、Windows10、VisualStudio2017なのでこれが原因っぽいです。
古いVisualStudioで試してみます。
業務アプリなのでサンプルは出しにくいです。申し訳ないです。 >>282
おお、今頃ですが、ありがとうございました
これでAlt+Tabでもモードレスウインドウが出てくるようになりました ! 今まで、VC++6.0でずっとやってきました。特にそれで問題なかったからですが、意を決して、
Visual Studio 2017をインストして、古いソースコードを移植しようと思っています
VS2017に古いVC++6.0のdswファイルを読ませたのですが、うまくj変換できないようですが、どうしたら良いでしょうか
VC++6.0からの変換は出来ませんか ワークスペースはソリューションに変わった。新しくソリューションファイルを作って、そこにC/C++のファイルを追加してビルドだ。 インクルードファイルとかいろいろエラーがたくさん出てきたよ
これ相当無理っぽい??? 取りあえず、簡単に比較するために、VC++6.0でMFCのSDIのデフォルトを作りました
それと比較するため、VS2017でC++のWindowsデスクトップのデスクトップアプリケーションのデフォルトを作りました
すると、VS2017の方はMFC自身を使わないバージョンなのかな、CMainFrmとかIMPLEMENT_DYNCREATEとかなくて
VC6.0++のMainFrm.cppとかを2017の方に持ってきてコンパイルしたらCMainFrmが定義されてないとか
ずらっとたくさん出てきます MFCに対応したプロジェクト/ソリューション設定じゃないとダメかも >>293
VS2017で、それを探してるのですが見つからないのですよ
MFCには対応してるのですよね。2015かそれ以前にはすでに対応してると聞いていたのですが
MFCを使ったデフォルトのコード生成はしてくれないとか??? w Visual C++の中にMFCがある。Visual C++という項目がなければ、インストールが間違っている。 >>295
メニューのファイルから新規作成、プロジェクトを選ぶと、その中にVisual C++はちゃんとありますよ
で、そこでWindowsデスクトップアプリケーションを選んでデフォルトを作ると、コードはSDKみたいなコードを吐きます
で、Windowsデスクトップウィザードってのがあったので、今これを選択してみたのですが、
アプリケーションの種類をコンソールにすると、その右にあるMFCのチェックボックスが有効になるのですが 続き
Windowsアプリケーションってのを選ぶと、MFCのチェックボックスが使用不可になってしまいます MFCアプリが作れないなら、インストールで追加するしかないぜ。 おいおい、なんだこれ
VS2017で、新規作成、プロジェクトで、Windowsデスクトップウィザードで
コンソールアプリケーションでMFCをチェックしてデフォルトのコードを自動生成してみました
そしてソリューションのビルドしたら、CWinAppが定義されてないとかエラーがわんさか出てきたぞ
おいおい、デフォルトの自動生成コードもビルド出来ないじゃん >>299
おや、そこが違う。 私のは、
visual C++の下に
Windowsデスクトップ
クロスプラットフォーム
MFC/ATL
テスト
その他
Extensibility
ってなってて、 MFC/ATLのところは
ATLプロジェクト
ってのだけがあります 何かインストを失敗してるのかなあ。 あるいはインストするときに何をインストするのかチェックがあったんだが
それを間違えてるのか。 でも俺がチェックをしなかったのはモバイル関係のところくらいだったんだよねえ VS2017は頻繁に変更されるもんだから、ちょっと混乱してるみたい。 >>304
ありがとう。
右側の概要ってとこが、私のでは、インストールの詳細になっていて、
MFCとATLのサポート
ってのが私のでは、
x86用とx64用のVisualC++ATL
x86用とx64用のVisualC++MFC
ってわかれていて、ATLの方にだけデフォルトではチェックが入っていてMFCの方のチェックは
デフォルトでは外れていました。
チェックして再インストしてみますねw ただいま、 再インスコ中です
みなさん、 VS2017をインスコするときは、
MFC はデフォルトでは入らない !!!
ことがわかりました
VS2017をインスコするときは、注意しましょう
インスコするとき、オプションをチェックすると入ります、 多分。今やってるところ Qiitaの記事、結構役に立ってるじゃん。責任ある情報技術者なら、Qiitaに記事を書ける程になってもらいたいね。 出来ました。
MFCのインストがちゃんとできて、
MFCアプリケーションでデフォルトのMDI作ってみたら、 あら、すげえ
クラスビューなんかが出てくるのねw おや、新しいバージョンだと、
strcpy( a, b )
で、b に CSringとか出来ないんだね。 前の古いバージョンでは出来たのに
CString で返す関数も、char a[10] とかで宣言したのを、古いバージョンでは、retuen a
って出来たんだが、新しいバージョンではエラーになる。 一旦
CString ret;
ret = a;
ってやって、return ret;
ってやったらエラーが消えた
いろいろと細かい修正しないとダメみたいだねえ 暗黙の型キャストのあいまいさが嫌いな人が存在するらしい。 >>314
いろいろとありがとう。 今日はとりあえずここまでにしておきます >>317
これありがとう。LPCWSTRの関係で、めっちゃ詰まってました >>313
そもそも、CStringはTCHARを扱うクラスなのに、
_tcscpyではなくstrcpyを使っていたのが間違い >>319
今は、_tcscpyを使ってもエラーが出るけどな >>320
それはエラーではなくてセキュリティ上の警告では >>321
そうです。 _sを付けたのを使えって
警告の設定を変更しないとエラーになってコンパイルが通りません
それをプロパティの設定で、Unicodeからマルチバイトに切り替えてコンパイルしたんだけど、どうも
Unicodeのままでうまく切り替わらないようなんですよねえ。 どうなってるのか。 今は時間がないので
またあとでやってみますが >>322
警告だから、それに関してはコンパイルは通る。
他の場所がコンパイルエラーになっているだけかと。 VS2017ですが、新規作成で、MFCアプリケーションで作った時、
新規作成途中に出てくるSDLのチェックをつけて作成したときと、はずして作成したときと両方してみました
すると、SDLつきの時は、_tcscpyはエラーになってコンパイルできませんが、
SDLをはずして新規作成したのものは、エラーにならずにコンパイルできて実行できます
デフォルトはSDLつきなので、コンパイルできません
次に、新規作成して出来上がったプロジェクトで、
メニューのプロジェクトから一番下のプロパティに入って、構成プロパティ、C/C++の全般にある
SDLチェックというところで、はい(/sdl) いいえ(/sdl-)を切り替えてやってみると、
この切り替えが動作せず、SDLのオン、オフが効きません。 プロジェクトの新規作成のときに設定したものが
残っていて、あとからここのプロパティで変更ができないようです
同じように、プロパティの構成プロパティの全般で、文字セットがデフォルトではUnicode文字セットを使用する
になってるのですが、これをマルチバイト文字セットを使用するにしても
Unicodeのままでマルチバイトにならないようです
バグですかねえ? ■ このスレッドは過去ログ倉庫に格納されています