環境は VS2010 use MFC / Windows 7です。
DLL 側でグローバル変数をこのように定義しています
__declspec(dllexport) extern CString hoge[4];
EXE 側でその変数をこのように定義しています
__declspec(dllimport) CString hoge[4];
ビルドすると下記の警告が出てしまいます、そして実行すると、
「xxx.exe の 0x00fa807b でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfffffff4 を読み込み中にアクセス違反が発生しました。」
経験的に、このエラーの場合アクセスバイオレーションの可能性が高いと思うのですが
グローバル変数のインポート、エクスポートの仕方は間違っていないでしょうか?
警告の内容:
warning C4273: 'hoge' : dll リンクが一貫していません。
'hoge' の前の定義を確認してください
>>4 日本語を勉強して理解できるようになったら、該当するエラーコードをドキュメントで調べる。
それができたら、該当エラーを修正する。
馬鹿は氏ね。
VC6で作成したリソースファイルをVC10は利用できますか?
使えるけど馬鹿には無理かも
>>6 使える。
VisualStudio2010持ってないなら評価版落として試してみるといいよ。
ただし評価版はMFCが使えないんだけどな
Ouch!
試用期間があるだけ
MFCが使えないののはEEのほうじゃないのか
>>12 直前のレスすら読まない、おまえが一番使えない
別に使われてない
15 :
デフォルトの名無しさん:2011/09/21(水) 19:55:08.93
16 :
デフォルトの名無しさん:2011/10/14(金) 12:31:49.04
VS2005、SDIにてエクスプローラの詳細風の画面を作成中です。
ツリービューの方は表示できたのですが、リストビューが上手く表示できません。
Insertcolumnにてカラムを追加して、戻り値は正常なのですが、
追加後にgetcolumnすると戻り値がfalseになっている状態です。
解決方法んを教えていただけないでしょうか?
ソースを出さずにバグを指摘しろとエスパー募集
LVCOLUMNの中身を真面目に初期化していないとかじゃね?
19 :
デフォルトの名無しさん:2011/10/14(金) 19:57:48.56
>>19 ちまちまエラーの確認する位ならさっさと例外投げろや糞が、とか思ってしまった。
というか、GetColumnの呼び出しがそのページのどこにも無い件について。
21 :
デフォルトの名無しさん:2011/10/14(金) 20:32:17.56
Getcolumnに関しては、insert後にチェックとして私が追加しました。
ソースの変更はそこのみです。
で、cchTextMaxを設定しないまま、
フラグもそのままに呼び出した、と。
23 :
デフォルトの名無しさん:2011/10/14(金) 22:18:32.03
はい。
でも文字列を設定すれば必要ないのではないのですか?
最大文字数を負の値で指定されても対応に困るだろ?
デバッグ環境だと0xCCで埋められているだろうから、
-858993460文字にでもなってるんじゃねw
25 :
デフォルトの名無しさん:2011/10/15(土) 13:46:25.74
なるほど。
じゃあ新しくプロジェクトを作成して出来たのは
たまたまだったと言うことですね。
26 :
デフォルトの名無しさん:2011/11/22(火) 07:49:51.88
質問です。
VS2005で作ったダイアログベースのプログラムなんですが、
プログラム起動時に表示されるダイアログから新しい別の
ダイアログをDoModal()で表示させる際に、元のダイアログを
ShowWindow(SW_HIDE)で非表示にしています。
しかしこのプログラムをWindows7上で実行した場合、たとえ
ShowWindow(SW_HIDE)でいったんは非表示にできたとしても、
タスクバー上のプログラム名をクリックしたりした場合などに、
非表示にしたはずのダイアログが表示されてしまいます。
これを防いで非表示のままにする方法について、、あるいは、
システムがこのようにダイアログを勝手に表示させようとする
時にプログラム側で呼び出されているハンドらか何かについて、
お教えいただけないでしょうか。
>>26 7での動作は知らないけれど、
親を隠した状態で子をモーダルで出したいということであれば、
自分はよくSetWindowRgn()を使ってる。
SetWindowRgn(CreateRectRgn(0, 0, 0, 0), TRUE);
別のダイアログ.DoModal();
SetWindowRgn(NULL, TRUE);
>>27 その方法でできました。Windows7でも問題なく非表示を維持
できるようです。ありがとうございました。
関連して新しい質問なのですが、現在のダイアログから別の
ダイアログをDoModal()で表示したとき、その拡張スタイルに
WS_EX_APPWINDOWが指定されていれば、タスクバー上に
新しいダイアログのボタンが表示されるので、それを押して
最小化することができますが、しかし同時にタスクバー上の
ボタンが元ダイアログと新ダイアログとで別々に2つ表示されて
しまいます。
逆に、新ダイアログについてWS_EX_APPWINDOWの指定が
外れていれば、タスクバー上のボタンは元ダイアログのもの
1つだけしか表示されませんが、そのボタンを押しても最小化
することができなくなります。
タスクバー上のボタンを1つだけ表示させて、かつそのボタンを
押すことで新しいダイアログを最小化できる方法は無いでしょうか?
ModifyStyleExで元のダイアログのほうからWS_EX_APPWINDOWを
取り除くことも試してみましたが、うまく機能しませんでした。
CFrameWndExにドッキングしたCPaneDialog派生のウィンドウ
サイズを固定にすることってできますか?
CFrameWndExに固定サイズのダイアログバーが付けれれば他の
方法でも良いのですが。
アプリケーションを最小化して元に戻すときのイベントって何があるんでしょうか?
最小化したときにタスクバーをクリックしても
元のサイズに戻らなくなってしまう不具合が出てしまって
現在対処中です
元のサイズに戻すイベントがどれかわからずまったく修正のしようがない状態です
Googleで調べてみたところ
// 元のサイズに戻す
AfxGetMainWnd()->PostMessage(WM_SYSCOMMAND, SC_RESTORE);
こんなコードがヒットしたので「RESTORE」でプロジェクトを検索したところ何もヒットしませんでした。
自分で追加しないとプロジェクトには何もないでしょう
34 :
デフォルトの名無しさん:2011/12/01(木) 07:55:06.52
CStringに書式指定(%-04dとか%sとか)を含む文字列が含まれている場合、
その書式指定の部分だけを抽出した部分文字列を得る良い方法ってありますか?
自分でも、'%'が出てこないかFindして出てきた位置の次に最初に'd'や's'が出てくる位置を
それぞれ見つけてきて、その位置の間の長さが最も短くなる部分文字列を取ればいい、
というアルゴリズムは思いつきますが、書式指定子('d'や's')をきちんと網羅できてないと
バグの原因になるのではないかと思い、もしかすると同じコードを今後も流用する可能性が
あることを考えると、より安全確実に実施できる方法が関数として既に用意されているなら
それを利用したいと考えています。
何か良い方法があればご教授ください。
書式指定の部分はprintfなんかと同じ方法でいいと思うけど
何が問題なのか意味不明
えーと'%-04d'とかを、(引数が代入されないままの)そのままその部分だけ取得したい、ということです。
>>34 なんでそこだけを抽出したいの?
全ての書式指定子を網羅的に扱いたいならprintf()(の下請け)がやっている筈の構文解析をやるしかなくなるけど。
例えば、"%2$*1$lld"みたいなものも扱うのかって問題もあるし。
>>37 書式指定を含む文字列に引数を代入する場合、単に代入するだけじゃなくて
変換もかかるので、その引数が代入された後にどういう部分文字列になる
のかを見たい、というのが目的で、具体的には、書式指定を含む任意の
文字列とそこに代入されるべき可変個数引数が与えられた時に各引数の
代入された後の姿(部分文字列)をCStringArrayに格納したい、というのが
直接的にやりたいことです。そのために元の文字列の書式四手が現れる
位置(とその個数)を予め知っておきたい、ということです。
VC持ってるならCRTのソースが入ってるでしょ
解析すればよろし
>>38 なんだかよく判らんが、変換前と変換後を比較すればいいんじゃないのか?
それはそれで大変でしょ
変換前と変換後が一緒だったら検出出来ないし
"%s"が"%s"に置き換わったら無理
>>39 見てみたところ crt/src/output.c と crt/src/input.c に記述されている
_output と _input という関数が、それぞれprintf系とscanf系の実体の
ようで、いずれも愚直に1文字ずつポインタをずらし値をチェックしていき
書式指定を抽出しようとする泥臭い処理になってました。
ここのチェックの処理が関数として独立してくれていればそれを利用して
コードを書くこともできるんですが、現時点では残念ながらこれらの処理を
まるまるコピペして使うしかなさそうです。
43 :
デフォルトの名無しさん:2011/12/06(火) 13:35:24.63
VC2008でXPを使用しています。
MFCアプリでOnPaintで描画をしている以下の2つのケースで
ケースAの方だけ描画がされなくなります。
処理はちゃんと走っているのに
最初はちゃんとひょうじされているのに
回数を重ねるとまったく表示されなくなります。
いったいなぜなんでしょうか?同じプログラムに見えるのに。。。
ケースA
for(i = 0;i < 30;i++)
{
pFont = (CFont *)dc.SelectObject(&font);
dc.DrawText(...略);
dc.SelectObject(pFont);
}
ケースB
pFont = (CFont *)dc.SelectObject(&font);
for(i = 0;i < 30;i++)
{
dc.DrawText(...略);
}
dc.SelectObject(pFont);
再現する最小コードを貼るべき
>最初はちゃんとひょうじされているのに
>回数を重ねるとまったく表示されなくなります。
GDIオブジェクトのリークが怪しい
>>43 なんか、そこだけじゃなくて、その外側に問題がありそうな希ガス。
49 :
デフォルトの名無しさん:2011/12/08(木) 13:53:05.97
VC2005のバグじゃないかと思うんだけど、OnBnSetfocusButtonに入ってこない。
再現させるプロジェクトの作成は簡単。
1.MFCアプリをダイアログベースで新規作成。
2.ダイアログにButton1を載せる。
3.そのButton1を右クリックで、「イベントハンドラの追加」→BN_SETFOCUSを選んで、「追加して編集」。
4.OnBnSetfocusButton1()ができるので、そこにMessageBoxでも書いておく。
これで実行するとダイアログ上には、OK、キャンセル、Button1の3つのボタンがあり、
タブキーでフォーカスを移動していってButton1がフォーカスされても、OnBnSetfocusButton1()の中の処理が実行されない。
これは明らかなバグだよね?
このバグはCButtonだけで、CEditの場合はうまくいくんだ。
>>51 リファレンスに記載済み。今度質問するときは確認しな。
BS_NOTIFY つけてる?
質問です。
ロケールを動的に変更する方法ってありますか?
例えばAfxMessageBox("・・・", MB_YESNO)を実行した際のダイアログ上の
ボタン表示を「Yes/No」だったり「はい/いいえ」だったりと変更したいのですが。
モードレスダイアログの場合、コンストラクタの「CWnd* pParent」って意味あります?
Createでも指定させるなら、このコンストラクタは無意味ですよね?
突然失礼します。
下記のコードを記述し、WindowsXP及びWindows7で同様のファイルを指定したところ
XPでは正常に動作しますが、7ではファイルを開くことができません。
どなたか原因が分かる方いらっしゃいましたらご教授お願いします。
If(!file.open(fn, CFile::modeRead|CFile::typeBinary)) return FALSE
とりあえずCFileExceptionを受け取るようにしてみたら?
>>55 モードレスダイアログの場合は、
引数無しのコンストラクタを使う決まりになっている。
>>57 ご返信ありがとうございます。
CFileExceptionの値は2になっており、どうやらファイルが存在しないというエラーのようです。
具体的には、フォルダダイアログからファイルを選択しているにも関わらず、m_strFileNameのフォルダ名部分が書き変わらないようなのです。
当該現象はXPでは発生しておりません。
なぜWindows7でのみ発生するのでしょうか。
使用環境は両OS共にVisual Studio2008です。
何か心当たりがある方、宜しくお願いします。
>>59 m_strFileNameって何?
ファイル名はCFileDialog::GetPathName()で取得したの?
>>58 ということは、ダイアログクラスを新規に作った際に勝手に用意される
「CWnd* pParent = NULL」のコンストラクタは、
モードレスダイアログとして使うクラスのときには、
消してしまって構わないということですよね。
CDialogを継承したCHogeDialogクラスがあります。
これは、リソースのID(IDD_HOGE)が指定されています。
ダイアログリソースの中には、IDOK IDCANCEL IDC_HOGELIST(List Control) の3つがあります
変数の追加にて、IDC_HOGELISTに関しては m_listCtrl を指定しました。
CHogeDialog dialog(this);
// この辺りに、 dialog.m_listCtrl.InsertItem のようなことをしたいのですが、
// これだと Debug Assertion Failed! と言われてしまいます。
dialog.DoModal();
ダイアログを表示する前にIDC_HOGELISTにアクセスしたり内容を追加するにはどうすればいいでしょうか?
よろしくお願いします。
>>62 モーダルダイアログとして使う以上、コントロールが作られるのはDoModalのタイミング。
アクセサ経由等でメンバ変数に予め内容を入れておいて、
WM_INITDIALOGのタイミングで生成されたコントロールにセットするのが一般的かと。
64 :
62:2012/01/06(金) 01:36:10.66
>>63 動かない理由、納得しました。
クラスに独自の変数を持たせて、
クラスの内部からWM_INITDIALOG時にそのデータを反映させることで対応しようと思います。
適切な助言、どうもありがとうございました。
ウィザード生成したMFCアプリケーションについてです。
他はいじらずにCMainFrameにて、OnCreateの末端辺りにDragAcceptFiles();を追加して、
デバッグ時にファイルをアプリケーションにドラッグ&ドロップした時に
Debug Assertion Failed!と表示されて落ちてしまいます。
その時には、下のような記述があります。
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appui.cpp Line:88
ドラッグドロップに対応したいのに、エラーで落ちてしまっています。
このエラーの対処法ご存じでしたら教えてください。
>>65 Document-Viewを使わないで生成するとそうなるみたいだな。
既定の流れだとDocument-Viewありきな作りみたいだから、
自前のWM_DROPFILESハンドラを書くのが一番手っ取り早い。
今回は偶々直ぐ判ったけど、VSのバージョンやウィザードでの設定で
生成されるコードが大分変わるから、次からは質問時に一緒に書いておいた方が良いよ。
>>66 現状での不具合のようなものなのですね。
OnDropFiles(HDROP hDropInfo)にて、
CFrameWndEx::OnDropFiles(hDropInfo); を呼ぶ代わりに
DragFinish(hDropInfo); を呼ぶことで対処したいと思います。
それと、次回から環境を書くようにします。
どうもありがとうございました。
>>65 落ちているのではなく、アサートに引っかかっているのだから、
画面に書かれているように「再試行」を押せば一発で原因がわかるよ。
69 :
デフォルトの名無しさん:2012/01/13(金) 08:22:36.58
出席管理のプログラム作ったんですが何か使いにくい・・・
研究室で使うように作ったのですが他に足した方が良い所とかありますか?
あと、年間を通して1つのCVCデータで管理したいのですが、どうやったらいいですか?
VC2005でXPを使用しています。
"shine90271.zip [施錠中] よろしく"って書いてあるのです。
DLKey:0309
URL:
http://up.shinetworks.net/cgi-bin/snup/upload.html 個人情報とか大学名とかはスルーして貰えると嬉しいです。
70 :
デフォルトの名無しさん:2012/01/13(金) 08:33:19.28
CSVです。スイマセン
>>69 一画面に色々機能を詰め込みすぎだ。入退出と管理の画面を分けよう。
名簿リストとか入退室記録は、起動・終了時に決まったファイルに読み書きすれば十分じゃないか?
本当の所はコードを一から書き直したい、というか.NETに移植してしまいたい位だけどw
72 :
デフォルトの名無しさん:2012/01/16(月) 14:44:28.17
ファイルとかCFileとかで読めますが
Excelファイルとかどうやったら読めますか?
シートの中のデータ読みたいんですがむりですか?
MFCは2008を使ってます
COM使えば
74 :
デフォルトの名無しさん:2012/01/16(月) 16:46:31.18
COMって何ですか?
MFCでできますか?
かなりの初心者質問なのですが、
MFCのボタンにBitmapを貼り付けるにはどうすれば
いいのでしょうか?Iconはうまく行ったのですがBitmapだとうまく行きませんでした。
したいこと。リソースからBitmapをボタンの中央に張りつける。
できなかったコード:
[ヘッダ]
public:
HBITMAP m_hBmp;
[cpp]
m_hBmp = (HBITMAP)::LoadBitmap( AfxGetApp()->m_hInstance,
MAKEINTRESOURCE(IDB_BITMAP1) );
cBtnRec.SetBitmap(m_hBmp);
すでにMFCにクラスが用意されてるはずだから
それ使うかソース見ればいい
CMainFrame::OnCreate()内で、
ModifyStyle(WS_CAPTION,0);を呼んでタイトルバーを削除してるんですが。
この状態でウィンドウを最大化すると、
全画面表示のような状態になってしまいます
(タスクバーの領域までウィンドウが拡大される)。
通常の最大化状態にするポイントなどご存知でしたら教えてください。
よろしくお願いします。
>>78 OnGetMinMaxInfo()で出来ないかな?
>>79 早速の返信ありがとうございます。
WM_GETMINMAXINFOというメッセージがあったんですね。
Mから始まるメッセージで探してたので盲点でした。
ちょっと試行錯誤してみます。
プライマリモニタだけならこんな感じで動きました。
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
CRect workArea;
::SystemParametersInfo( SPI_GETWORKAREA, 0, &workArea, 0 );
const int BORDER_WIDTH = 3;//境界線の幅
lpMMI->ptMaxSize.x = workArea.Width() + BORDER_WIDTH*2;
lpMMI->ptMaxSize.y = workArea.Height() + BORDER_WIDTH*2;
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
でもセカンダリモニタだとうまくいかないんですよね。
そもそもセカンダリモニタだとlpMMI->ptMaxSizeの設定が効いてこないんですよね。。。
lpMMI->ptMaxSize.x = 100;とか直接値を指定すると効くみたいなんですけど。
#include <MultiMon.h>
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
CRect windowRect;
GetWindowRect( windowRect );
HMONITOR h = ::MonitorFromPoint( windowRect.TopLeft(), MONITOR_DEFAULTTONEAREST );
MONITORINFO info;
info.cbSize = sizeof( MONITORINFO );
::GetMonitorInfo( h, &info );
CRect workArea = info.rcWork;
const int BORDER_WIDTH = 3;//境界線の幅
lpMMI->ptMaxSize.x = workArea.Width() + BORDER_WIDTH*2;
lpMMI->ptMaxSize.y = workArea.Height() + BORDER_WIDTH*2;
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
セカンダリモニタのワークエリアを取得して設定もしてみたんですけど、
lpMMI->ptMaxSizeの設定がそもそも効いてこないんですよね。
何か気づいた点がありましたらご指摘いただきたいと思います。
lpMMI->ptMaxSizeではなくlpMMI->ptMaxTrackSizeの方に値を設定したらそれらしく動作しました。
lpMMI->ptMaxTrackSize.x = workArea.Width() + BORDER_WIDTH*2;
lpMMI->ptMaxTrackSize.y = workArea.Height() + BORDER_WIDTH*2;
気持ち的には、ptMaxSizeの方に設定して動いてほしいんですけど、
とりあえずゴリゴリ書いてけば動きそうです。
やりたいことに対して処理が若干複雑な気もしますが、こんなもんですかね〜w
ちょっと気になったんで、ご意見伺いたいんですけど。
CRect::PtInRect()って右辺上と下辺上の点は内部とみなされないんですけど、どうしてこういう仕様なんですかね?
自分的には右辺上も下辺上も内部とみなしてくれた方が使い易いんですけど。
何か合理的な理由ってありそうですか?
>>84 RECTは基本的に右端と下端を含まない範囲を表しているから。
辺の差がそのまま幅や高さになるから、案外こっちの方が便利。
うーむ
CRect r( 0, 0, 100, 100 );だと実際は101ピクセルずつですけど
r.Size();するとサイズは100ずつですもんね。。。
配列のサイズと、有効インデックスと同じような考え方かなぁ?
でも、実際にFrameRect();とかすると右端と下端も描画されるしなぁ
(実はここが引っ掛かりポイントかな。実際に描画されてるのに内部と判定されない。)
やっぱり、それなりに理由は有りそうですけど、まだすっきり理解できてこないなぁ
いや、ちゃんと確かめないで書き込んでしまった
FrameRect();は右端と下端を描画していないようです
これで全部辻褄が合ってるのかなぁ?
もうちょっと自分で考えを整理してみます。
>>85 一人で書き込んでばかりですみませんがw
問題点というか、混乱してた原因が、
CRect::PtInRect()ではなくてCRect::BottomRight()で
混乱してたことが分かりました。
RECTの仕様としては、右端・下端を含まないのが正しそうですね。
それで、
CRect::TopLeft()は、RECT内の有効な点として使えるのに、
CRect::BottomRight()は、RECT内に含まれない右下の点を返すので、
これを使ってちょっと色々やってたので混乱してしまったようです。
お騒がせしました。
でも、RECTの仕様もすっきり分かってきたので良かったです。
ありがとうございました。
Windows1の頃からの仕様だな。
left, top, width, heightの方が分かりやすいよな
POINT二つ分とかにはできなくなるが、そもそもそれがおかしいわけで
CFileFindについてですが、
MSDNではIsDirectoryなどの属性を調べるメンバはすべて
FindNextFileを少なくとも1回は呼んでから使えと書いてあるんですが、
これって一番目のファイル(FindFirstFileで検索したファイル)は属性を調べられないってことでしょうか?
実際に試すとそんなことも無いような気がしておりまして、
とても気になっております。
>>91 CFileFind.FindFileは、内部的には一番目のファイル情報を取得しているけど、
実は、次のCFileFind.FindNextFileを呼び出した時に、その情報が参照できるように細工してある。
詳しくはMFCのソースを見たほうが早いかと。
>>92 ソース見てみました。難しくてなんとなく分かった程度ですが
なんでこんな仕様になってるんだろう?と思いましたが、
ひとつ解決してすっきりしました。ありがとうございました。
VS2010 MFC / Windows 7/32bit です。
MSDN 方法 : リソースを追加または削除する
http://msdn.microsoft.com/ja-jp/library/3bka19x4.aspx 参考にリソースのインポートを行うのですができません。
リソースビュー→Toolbar→右クリック→リソースの追加→インポート→予めエクスポートしておいたbmp ファイルを選択
Bitmap ファイルが表示されます。
その後、当該bmpファイルとIDを関連付けて、リソースビューのToolbarタブの配下に登録したいのですが、どうすればいいのでしょうか?
また、やり方が間違っているならば、正しいリソースのインポート方法を教えて下さい。
環境:VS10 MFC MDI
MDI にダイアログをモードレスダイアログを追加しました
ドキュメントクラスのデータをダイアログで使いたいのですが、
CxxxDoc* pDoc = dynamic_cast<CxxxDoc*>(((CFrameWnd* )AfxGetMainWnd())->GetActiveDocument());
これだと、pDocがNULL で取得できません、どうしたらいいでしょうか。
☓MDI にダイアログをモードレスダイアログを追加しました
○MDI にモードレスダイアログを追加しました
>>95-96 もう見ていないかもしれんが、呼ぶ場所による。
メインのフレームウィンドウが生成されていな時点で、AfxGetMainWnd()
を呼ぶとNULLが返されるし、SDIと違ってMDIの場合は何もドキュメントを
開いていなければやっぱりNULLが返される。
前者は、例えばモーダレスダイアログ(CMyDialog)のインスタンスが、アプリ
ケーションクラス(CMyApp)のメンバとして定義して、CMyDialogのコンスト
ラクタ内では、まだドキュメントは開かれていないので、ポインタは取得
できない。(NULLが返される)
あと、MDIだと、AfxGetMainWnd()のキャストは(CFrameWnd *)ではなく、
(CMDIFrameWnd *)でなければならない。
CEditのオブジェクトをCWndのポインタでdeleteしても問題ない(=メモリリークなどは発生しない)のでしょうか?
教えてください。
------------------------------------
// エディットボックス構築
CWnd* pEdit = new CEdit();
pEdit->Create(ES_LEFT| WS_VISIBLE | WS_BORDER, rect, this, IDC_EDIT5);
// エディットボックス削除
delete pEdit;
------------------------------------
今でもMFCは花形ですか?
勉強する価値はありますか?
>>98 CWndが仮想デストラクタになっているから問題無い。
>>99 勉強しなくて良い。
>>99 さすがにぜってー意味ねぇと思うわ
C#+.netやれ
>>101 先輩まじですか。
マネージで安泰ということでよろしいか?
安泰つーか、MFCが有り得ないだけだから。
>>103 津波のシミュレートってテレビでよくやってるじゃないですか。
あーいうのがやりたいんですよ。
ということは、C#でも十分可能ということなんですよね?
>104
まず物理に詳しくて、それをパソコンで計算する手法を知っていることかな
その辺の知識があれば関連書籍やサンプルプログラム見つかるだろうし
そこで使ってるプログラミング言語を選ぶのが楽
MFCがあり得ないというのは言い過ぎだけど花形ではないは確か。
組み込み系でもない限り使う機会って少ないんじゃないかな?
ちなみに私は組み込み系。有り難く使わせてもらってる。
津波のシミュレートとかだと、計算方法とかをしっかり知ることかな。
そしてその結果を出力していくだけだろうからMFCは関係ない。
何かUIを付けていくんだったら、MFC使うなりC#使うなり
そのとき考えればいい。
組み込み系でMFCってw
それ、組み込み系って言うか、組み込みの支援ツールとかだろww
できの悪いシミュレータでも作っているんだろwww
質問です。
1つのアプリケーションの中で複数のダイアログやウィンドウの間で遷移させたくて次のような実装を考えています。
BOOL CMyApp::InitInstanse(){
〜中略〜
int nUI = 0;
while(1){
switch(nUI){
case 0:
CMyDialog dlg;
dlg.DoModal();
nUI = dlg0.m_nNextUI;
break;
case 1:
CMyFrameWnd* pwnd = new CMyFrameWnd;
if( (pwnd->LoadFrame(〜) == FALSE) || (pwnd->AddDocTemplate == FALSE) ){
delete pwnd;
nUI = -1;
}
else{
pwnd->ShowWindow(SW_SHOW);
nUI = pwnd->m_nNextUI;
}
break;
default:
return FALSE;
break;
}
}
}
でもCWnd::ShowWindowはCDialog::DoModalのようにUIが閉じられるまで待ってくれないから
このようなコードでは正常に動作しないんですよね。本来はInitInstanseをreturn TRUEで出て
メッセージポンプ開始させるのが普通ですが、InitInstanseを出ずに使う方法は無いですか?
>>108 やりたいことを具体的に書いた方がいいよ。でないと、
どうしてもInitInstance()から出たくないなら、中でメッセージポンプを実装すればいいとしか。
普通に状態フラグみたいなもので作業フェーズを管理すればいいだけだと思うんだけどね。
>>109 あるダイアログ上である特定のUI操作をしたら、そのダイアログが消えて別の
ダイアログ/ウィンドウが新たに表示される、というような画面遷移がいくつか
必要なアプリケーションにおいて、アプリケーション上で生きているダイアログ
やウィンドウを常に1個だけにしたい(使わないダイアログやウィンドウを隠す
のではなく使い終わったものは順次デコンストラクトしてしまいたい)、というの
がやりたいことです。
>>110に追記。
自分が困っているのは、
>>108のようにInitiInstanseの中からウィンドウを呼ぶ実装だと、
モーダルダイアログと違って、ウィンドウが閉じられるまでプロセスをそこで待たせるのが
難しいので、もっと簡単に
>>110を満たす実装ができないだろうか、というところです。
>>108 case 1:のところでは見えないダイアログをDoModalで出しておいて、
そのダイアログから別スレッドを作ってCMyFrameWndを出して、
ダイアログがタイマーで定期的にスレッドの終了を見張って、
終了していたらダイアログ自身もEndDialog
というようなやりかたならやったことがある。
>>112 その方法だと、タスクバー上に、ダイアログのぶんとウィンドウのぶん、
2つのタイトルボタンが現れてしまいませんか?
>>107 横レスだけど、WinCEは企業じゃ現役だと思うよ
あと、POSとか、大き目の組込みじゃ普通にXPが載ってたりする
>>104 Blenderでできるよ。動画もあったはず。
>>113 そこはWS_EX_TOOLWINDOWを指定するなり、
ダイアログをサイズ0ではなく非表示にするなり、
自身のアプリの動きに合った方法を探ってもらうしか。
自分の場合は、ランチャのようなものがあって、
そこからダイアログやCMyFrameWndをモーダルで出す仕組みだったので、
LoadFrameに渡す親ウィンドウを前述の見えないダイアログにして、
タスクバーに新たに出てこないようにした。
この方法だとCMyFrameWnd自体のタスクバーへの最小化ができないけど、
モーダルダイアログと同じようになればよかったので、最小化は不可にした。
108ですが解決しました。おおざっぱにですが、まずはウィンドウ側。
BOOL CMyFrameWnd::OpenAndHide(CWnd* pwndParent, BOOL* pbIsDestroyed)
{
// LoadFrameの引数の親ウィンドウへのポインタにはpwndParentを渡さずNULLにしておく
if( (pwndParent == NULL) || (LoadFrame(〜) == FALSE) || AddDocTemplate(〜) == FALSE) ) return FALSE;
// pwndParentを消す
pwndParent->ShowWindow(SW_HIDE);
LONG lExStyleOfParent = m_lExStyleOfParent = ::GetWindowLong(pwndParent->m_hWnd, GWL_EXSTYLE);
lExStyleOfParent &= (~WS_EX_APPWINDOW);
lExStyleOfParent |= WS_EX_TOOLWINDOW;
::SetWindowLong(pwndParent->m_hWnd, GWL_EXSTYLE, lExStyleOfParent);
::SetWindowPos(pwndParent->m_hWnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
::SetWindowRgn(pwndParent->m_hWnd, CreateRectRgn(0, 0, 0, 0), TRUE);
// ポインタをメンバ変数に記録
m_pwndParent = pwndParent;
if(pbIsDestroyed != NULL){
m_pbIsDestroyed = pbIsDestroyed;
(*m_pbIsDestroyed) = FALSE;
}
ShowWindow(SW_SHOW);
return TRUE;
}
void CMyFrameWnd::OnDestroy()
{
if(m_pbIsDestroyed != NULL) (*m_pbIsDestroyed) = TRUE;
else{
::SetWindowLong(m_pwndParent->m_hWnd, GWL_EXSTYLE, m_lExStyleOfParent);
::SetWindowPos(m_pwndParent->m_hWnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
::SetWindowRgn(m_pwndParent->m_hWnd, NULL, TRUE);
}
CWnd::OnDestroy();
}
そしてダイアログ側。
BOOL CMyDialogForWindow::OnInitDialog()
{
if(CDialog::OnInitDialog() == FALSE) return FALSE;
CMyFrameWnd* pwnd = new CMyFrameWnd;
if(pwnd->OpenAndHide(this, m_bIsDestroyed) == FALSE){
delete pwnd;
OnCancel();
return FALSE;
}
pwnd->ShowWindow(SW_SHOW);
SetTimer(m_nTimerID, 500);
return TRUE;
}
void CMyDialogForWindow::OnTimer(UINT nIDEvent)
{
if(m_bIsDestroyed == TRUE){
KillTimer(m_nTimerID);
OnOK();
}
CDialog::OnTimer(nIDEvent);
}
これで、
>>108のcase 1:の中で、CMyDialogForWindowのインスタンスを作ってDoModal()すれば
(CMyDialogForWindowが自動的に隠れ)CMyFrameWndだけを開いているような状態になるはずです。
>>116さんのようにランチャ的なダイアログから開きたい場合には、上のダイアログ側コードを削除して
void CMyDialogForWindow::OnButtonOpenWindow()
{
CMyFrameWnd* pwnd = new CMyFrameWnd;
if(pwnd->OpenAndHide(this, NULL) == FALSE) delete pwnd;
else pwnd->ShowWindow(SW_SHOW);
}
を加えれば、うまく動作するはずです。
大事な部分が抜けてました。
CMyFrameWnd::OpenAndHideおよびCMyFrameWnd::OnDestroyの中において、
CWinApp::m_pMainWndを移譲する処理を書いておく必要があります。
CMyFrameWnd::OpenAndHideでは
m_pwndOld = AfxGetApp()->m_pMainWnd;
AfxGetApp()->m_pMainWnd = this;
を
CMyFrameWnd::OnDestroyでは
AfxGetApp()->m_pMainWnd = m_pwndOld;
を
それぞれ適当な場所に書いてください。
いろいろとご助言ありがとうございました。
>>117 CMyFrameWndを別スレッドにしなくても大丈夫だった?
昔
>>112を作ったときは、
MFCのフレームウィンドウのコマンドUI処理やドッキング処理は
InitInstanceを抜けた後のアイドル時に行うような前提で、
ダイアログベースのアプリケーションのメインスレッドからだと
CMyFrameWndでそのあたりがうまく動かなかったので、
わざわざ別スレッドを経由するするようにしたんだけど。
CDatabaseやCRecordsetを使ってODBCでOracleデータベースにアクセスしています。
しかし、このクラスにはメモリリークのバグがあるみたいなので
別の方法(CDatabaseを使わない)でOracleにアクセスしたいのですが
そんな方法があるんでしょうか?教えてください。
122 :
デフォルトの名無しさん:2012/04/13(金) 17:12:53.36
>>121 ADOかなー。
バージョンによってはoo4oのほうがいいかな
ありがとうございます
ADOでやってみます
oo4oは64bitで使えないらしく残念です
>>121 SQLを書いたファイルをsqlplusに食わせて、それをファイルにリダイレクトするバッチファイルを作る。
で、"cmd /c バッチファイル"をsystem関数で実行する。
というダサいプログラムを見たことがある。
ダサいけど、存外安定するんだな。
安貞するの?
安貞しちゃっていいの?
しちゃうよ?
本当にいいの?
滅茶滅茶にして…///
MFC初心者です
質問があります
計測データをグラフ表示したい場合
どのような方法が考えられますか?
なんでもいいのでおしえてください
・市販のグラフコントロールを買う
買ったコントロールのヘルプを読めばいい
・自分で全部描く
ViewのOnDraw又はOnPaint
CDCクラス
CPenクラス
CBrushクラス
あたりを調べて勉強する
理解出来たらオーナー描画を勉強する
>>128 市販のグラフコントロール買うのが一番良いよ。
ただ、それが10万とかすると「高いから自分でコード書け」とかいう馬鹿上司がいたりするんだよなぁ。
まぁ仮に、人月単価40万円の奴が担当したとする。
一週間グラフを作るのに費やしたらそれだけで10万円だよな。
とは言え、我が社ではgnuplotでやっているが。
>>131 それ、メンテナンス工数が入ってないよ。
もう少し大局的に物事を考えられるようになろうぜ
高機能なコントロール=使い易いコントロール
とは限らないのが難しい所だけどな。
MFC使い慣れてるオッサンに仕事を押し付けるのが手っ取り早い。
……MFC以外を検討するのが最善策な気もするけどw
企業として使用する場合MFC以外でGUIライブラリってなにがあるんだ?
シェアウェアとして個人でwwwに公開する場合ならいろいろあるけど。
MFCで組み合わせを計算するアプリ作成しています
いざ計算すると止まってしまい困っています
どうやらユーザ定義関数の階乗を計算する関数が
動作していないことが原因みたいです
C++の要領でメイン関数の上に置いたのはマズかった
のでしょうか?アドバイスおねがいします
ユーザ定義関数を直せばいいんじゃないかな
>>137 どのように直せばいいですか?
方法が分からず困っています
正しく動くように直せばいいんじゃないかな。
>>136 宿題は自分でやれよ、馬鹿が
それとも、聞ける友達すらいないのか
>>140 すみません
たしかに友達が少ないのは事実ですが
なんとかなりそうです
激励ありがとうございます!
>>131 人月単価40万円なんてありえない
それって、個人の給料と勘違いしていない?
工数は8000〜10000円/1H位で見積もるよ
底辺下請けを舐めんなよ。個人でやってるソフトハウスなんてそんなもんだ。
ちなみに、独立系のソフトハウスで80-120万、大手SIerで120-200万円だ。
144 :
デフォルトの名無しさん:2012/06/09(土) 18:39:41.26
ソフトウェア業界で飯を食っていこうと考えると
MFCと.NETだと、どちらをマスターしたほうがいいですか?
その2択ならMFCだろうな
.netなんて適当な本読んで、2,3日もすれば完全にマスターできる。
必要になったときにやればいい。
もう 2ch にはまともなひといないお
質問があります
追加したダイアログのメニューバーを無効(灰色表記)にするのはどうすればいいですか?
出来ますよ
>>151 おお、ホントですか。
何かサンプルになるようなものはありませんか
ウィンドウをダイアログにする
えーとすいません
CDialogを継承したものをUpdateLayeredWindowで消すってことでしょうか
今すでにその状態なんですけど
頑張れMFC
157 :
デフォルトの名無しさん:2012/06/23(土) 16:15:42.11
取り込んだデータで山なりの曲線作りたいんですが、どうやってグラフにするのかおしえてください
了解
C#やVBはポトペタできるのに
VC+++MFCは未だにポトペタできないのはなんで?
↑
それだと、ショボイコントロールしかポトペタできないじゃん
馬鹿には無理
164 :
デフォルトの名無しさん:2012/06/23(土) 23:00:03.40
遅ればせながら、vs2010を使ってみた
MFC、超進化してんじゃん
MFC新規作成から、完了ボタン一発ですげーGUIできた。
C#が生産性が高いなんて過去の話か???
大半の人は、実は釣り質問。
単に馬鹿な回答者がいればそれでいい。
168 :
デフォルトの名無しさん:2012/06/24(日) 23:10:31.51
クラス名を変更したいですが、どうするのが正確にできますか?
CXxxxView ファイル名 XxxxView.h , XxxxView.cpp
を
CYyyyView ファイル名 YyyyView.h , YyyyView.cpp
としたいのです。
s/Xxxx/Yyyy/g
170 :
デフォルトの名無しさん:2012/06/24(日) 23:29:27.86
bakabakkadana
若かろうがオッサンだろうが、
「これ出来ないとお金払いませんよ、
あなたの生活がどうなろうと私には関係有りませんし。」
と言うとみんなちゃんと新しい技術をマスターしてくる。
努力しないってっことは努力する必要が無いからなんだと思う。
追い詰められていないんだろうね。
幸せなんじゃないか?
どうでもいいけど。
172 :
168:2012/06/25(月) 01:36:45.53
>>171 答えられないくせにどうでもいい長文書くなよw
「会議」がアイデアを潰す
若手や中堅がイノベーションを生み出す新しいアイデアを出す時
立ちはだかるのがジジイどもの支配する「会議」という壁だ
・ジジイどもに理解できる企画でなくてはならない
・ジジイどもの好みに合う企画でなければならない
・既に成功した事例がなくてはならない
・ジジイどもに気に入られている人物が提案者でなくてはならない
・ジジイどもに気に入れられていない人物が関わっていてはならない
・ジジイどもの支援が不要な企画でなくてはならない
・にもかかわらずジジイどもにも活躍の場を与えねばならない
・ジジイどもの気まぐれな口出しにいつでも応じなければならない
・失敗してもジジイどもが責任をとらなくてよい企画でなくてはならない
・成功したらジジイどもの業績になる企画でなくてはならない
若い頃は前世代のおかげで繁栄したくせに、自分らの時代には経済を衰退させ
そのツケを後世代に回す団塊ジジイ、バブルジジイどもが日本の病巣
通報した方がいいのかね、これ。
175 :
デフォルトの名無しさん:2012/06/25(月) 14:12:20.49
今更MFCを学ぶのは無駄なんですか?
Don't think, feeeeeeeeeel.
>>175 Windowsの仕組み、Win32API、C++の言語仕様を熟知していればMFCは3日で覚えられる。
>>177 Windowsの仕組み、Win32API、C++の言語仕様を熟知するのにどれくらいかかりますか?
>>178 基本的なOSの仕組み、Cの言語仕様を熟知していれば一週間くらい。
一週間で熟知出来るのか〜
ってどんだけ浅い理解だよ
>>178 APIについては最低でも、猫でもわかるくらいの知識が必要。
183 :
デフォルトの名無しさん:2012/06/27(水) 23:20:38.30
Windowsの仕組みが1ヶ月と嘘だろ?
15、16年程度Windowsでドライバやアプリケーションを書いてきたが
AdvancedWindows,やInside Windowsを読むのは相当キツイぞ
未だに全部頭に入ってるわけではない
何年やったって全てを熟知するなんて無理
一週間とか一ヶ月とか言ってる奴はネタで言ってるか
単なる馬鹿のどっちか
185 :
デフォルトの名無しさん:2012/06/28(木) 23:56:54.15
ソースが入手できないから当たり前
linuxなんかは、ソース読めば全体がくまなくわかるがな
>>185 じゃあソースがあれば一週間で熟知出来るの?
お前天才だろ
まあ、熟知っていうのをどのレベルに想定するかで違ってくるしな。
仕事に支障ないレベルまで習得できた状態までなら、一ヶ月でなんとか行くと思うよ。
(実例は俺)
ただし、その前にOSの仕組みやらC++やらは理解しておく必要があるが。
「仕事で必要な部分」と「全部」は違うだろ
ふふん
まあ兎に角、取り敢えずは、一週間だな
それでで大体はワカルもんだ
191 :
デフォルトの名無しさん:2012/07/02(月) 23:55:53.29
子ダイアログに親ダイアログのメンバ変数に格納された数値を移したいのですが、
何故か値が消えて0になってしまいます
解決策をおしえてください
192 :
デフォルトの名無しさん:2012/07/03(火) 00:41:09.74
Petzoldを参照せよ!
194 :
デフォルトの名無しさん:2012/07/03(火) 19:14:29.85
質問です。
リストビュー内のリストコントロールで各行ごとに異なる背景色を与えるとき、
LVS_EX_CHECKBOXESで表示させたチェックボックスの背景はどうやれば
変更できますか?
質問です。WinXP, Visual Studio 2008 ProのMFCダイアログベースアプリで、
フォーム上にコンボボックス(IDC_COMBO1)を配置して、
コンボボックスのプロパティを次のように設定しました。
Data: アメリカ;ドイツ;日本;インド
Sort: False
Type: ドロップダウン リスト
これをビルド・実行して、[▼]ボタンを押すと(1)のようになり、(2)のようにずらーっと選択肢が出ません。
(2)のようにするには、どうすればいいでしょうか?
よろしくお願いします。
-----------
| |▼|
-----------
↓ 右の[▼]ボタンを押すと
(1)リストのうち、要素が1個でるだけで、右端のアップダウンボタン[〓]を押して1個ずつ切り換え
-----------
| |▼|
-----------
|アメリカ |〓|
-----------
(2)
-----------
| |▼|
-----------
|アメリカ |
|ドイツ |
|日本 |
|インド |
---------
(1)エディタ上で[▼]の部分をクリックして、
ドロップダウンする部分のサイズをリサイズする。
(2)XPのビジュアルスタイルを指定している場合は、
プロパティのNo Integral HeightをTrueにする。
197 :
195:2012/07/11(水) 22:04:42.07
>>196 教えて頂いた方法で、解決しました。
ありがとうございました。
198 :
デフォルトの名無しさん:2012/07/13(金) 23:55:35.80
コントロールがフォーカスを持っているときに
枠線が描かれますが、この枠線を 赤の太線にほしいとの客先要望
どのコントロールにフォーカスがあるかをわかりやすくするためだと・・・
できますか?
できませんとお答えしたら、「いやいや、できなってことはないでしょ?」
の一点張り・・・
なにか良いアイデアはありませんか>¥?
>>198 フォーカス時にMoveTo,LineToで線引いてやるとか?
莫大なコード書いて実現しても
「やっぱりできるんじゃん!サボろうとして安易にできないとか言うなよ」
とか言われたりして
まあ入力欄だったら背景色を変えるとかで手打ちしてもらったほうが
おまえら正規版買えよ
201 :
デフォルトの名無しさん:2012/07/15(日) 17:31:18.72
コンソールにHello Worldって出力するだけのソフトしかつくれないのに
何万も出すかよ
203 :
デフォルトの名無しさん:2012/07/15(日) 17:42:38.33
そんな屑ライブラリなんて使えるかよ
ライブラリは質より、どこが提供しているかが一番大事なんだぞ
MFCは糞だが、MSっての最強の強み
心配ご無用、新機能満載、非互換版作成中、近々公開
205 :
片山博文MZボット ◆0lBZNi.Q7evd :2012/07/15(日) 20:33:56.18
>>198 最前面拡張スタイルの独立したポップアップウィンドウをSetWindowRgnでくりぬく。
フォーカスを監視してフォーカスのあるコントロールに位置とサイズを合わせる。
MSDN正規版を買いましょう
MSDNは買うと言うよりもエントリーするとか登録するとかそういう感覚
すいません、教えてください。
2つのOnTimer( CWnd1::OnTimer と CWnd2::OnTimer)から
同一の関数( func )を呼び出す制御をしていた場合、
関数( func )が2重に呼び出される事はあるのでしょうか?
※以下処理で g_ctr が 2になる可能性はありますでしょうか?
----------------------------------------------
CWnd1::OnTimer( UINT_PTR nIDEvent ) // 10ms間隔のタイマー
{
func();
}
CWnd2::OnTimer( UINT_PTR nIDEvent ) // 20ms間隔のタイマー
{
func();
}
int g_ctr = 0;
void func()
{
g_ctr ++;
// 色々な処理
g_ctr --;
}
----------------------------------------------
>>208 是非とも、実際にやってみて結果を報告して欲しい。
通常は、「ある」ものとして設計するけどな。
210 :
デフォルトの名無しさん:2012/07/22(日) 20:32:43.47
メニューの折りたたみをなくしたいだけど
どうすればいいのかしらん?
>>208 OnTimer(=WM_TIMER)はメッセージベースなので、
GetMessage/DispatchMessageとか内部で呼び出さなければOK。
逆にMessageBoxとか出すと、再入するのが確認できるよ。
これらはタイマが一つだろうと二つ以上だろうと当てはまる。
レスありがとうございます。
2つ(CWnd1 , CWnd2)は異なるウィンドウですが、同じメッセージループを回っているのでしょうか?
213 :
デフォルトの名無しさん:2012/07/22(日) 22:12:52.77
んなわけねーじゃん
しねよ
215 :
デフォルトの名無しさん:2012/07/22(日) 23:50:15.85
もうWinのデスクトップではネイティブアプリって必要なくなっていくんですかね?
>>212 同じUIスレッドのウィンドウなら同じ。
AfxBeginThreadとかで作った、別のUIスレッドのウィンドウとかなら別だけど。
mfcの生産性の低さについて
マイクロソフトは何か対策を練ったりしてないの?
過去の遺産に先進機能を盛った所で相変わらず繁雑なままという印象なのだけれど
今は一部社員の趣味で開発しているだけの予感。
MFCが使われなくても特に困らないんじゃないか?
他に生産性の高いライブラリがあるなら、どうぞそちらをお使いください、
ってスタンスかと。
>過去の遺産に先進機能を盛った所
具体的にどのへんが先進機能?
MFC Feature Packとか
外部には無いでしょ?
221 :
デフォルトの名無しさん:2012/07/23(月) 18:53:04.01
mfcってそんなに生産性低いか?
ウィザードに従っていけば、デフォルトですごいカッコいいGUIが出来あるがるぞ
まさかVC++6とかつかってないか?
2008以降はGUIだけならC#より生産性は高い
だがしかし 2008 Express には MFC が付いていない
認識が全然違うのか
ウィザードで大抵の機能が完結するならいいけど
機能を追加する場合にも実際には色々と手作業でしかも複数箇所に渡って変更部分を追記する以外ないわけで
間違いなく生産性の面で言えば現代のプログラミング技術から数歩遅れた所に居ると思う
人が嫌がるものだからこそ金になるんだろ。
嫌がるからどうこうじゃなくて
整備しなかったマイクロソフトの怠慢じゃないの
QtやらMacやらAndroidやらが現れている現在
本来ならここは改善されるべき所
227 :
デフォルトの名無しさん:2012/07/23(月) 20:03:36.09
しかし、ネイティブアプリを作成するには、これが一番情報が多いし
使い方も簡単
mfcはジャンク
組み合わせられれば最強だが
全体的に見るとあまりよろしくない
>>222 Qt とか wxWidgets とかおすすめ
MFCでラジオボタンを3つ作ってボタンを押すとそれぞれ3つとも違う処理をしています
ある時に自動で1つめのボタンを押す動作をプログラムで起こしたいのですが
CButtonのSetCheck(1)とするとボタンはへこむのですが
ボタンを押した時のハンドラは呼ばれません
これを呼ばれるようにするにはSetCheckじゃなく何を呼べばいいんでしょうか?
VC2003を使っています。OSはXP
それをやろうとするとプログラムで判定が必要になって不格好です
if(button1.GetCheck()==1)
button1のハンドラ();
if(button2.GetCheck()==1)
button2のハンドラ();
if(button3.GetCheck()==1)
button3のハンドラ();
button1.SetCheck(1)に対して自動でハンドラを呼ばせたいのですが無理ですか?
>それをやろうとするとプログラムで判定が必要になって不格好です
なんで? >230にはGetCheck()の結果でハンドラを呼びたいなんて書いてなかったのに後出し?
つーか、動作のシミュレーションをしたいのならボタンの座標を使ってメッセージ送ればいいじゃん。
馬鹿には無理
CMenuでおしえてください
左クリックでメニューだしてますが以下の構造でポップアップのMeasuredItem処理が分かりません
メニュートップ
−メニュー1(ポップアップ)
−サブメニュー(文字列)
−サブメニュー(文字列)
−メニュー2(ポップアップ)
−サブメニュー(文字列)
−サブメニュー(文字列)
−メニュー3(文字列)
ポップアップになってるとこはCMenuの派生クラスでMeasuredItemが呼ばれないので
親WindowでOnMeasuredItemを呼ばせてその中でMeasuredItemを読んでます
つづく
OnMeasuredItemでは以下の2つのハンドルが帰ってきますが
−メニュー1(ポップアップ)
−メニュー2(ポップアップ)
このハンドルから親であるメニュートップのハンドルが欲しいのですが
取得する方法わかりますか?
CMenuには親メニューを取ってくるメンバ関数はなさそうです
なぜ取得したいかというと親が持ってるメニューの幅と高さ情報が知りたいからです
その情報を使ってMeasuredItemを処理したいのですが
OnMeasuredItemでは親ではなく子のハンドルが帰ってきて困ってます
APIレベルでその機能が無いからなあ。
予めSetMenuItemInfoでdwItemDataに親ハンドルをセットしておくとか、
せこい方法しか思いつかないw
238 :
デフォルトの名無しさん:2012/07/28(土) 00:54:53.04
MFCってやたらモッサリしてるんですが、C#でWPFかwinformで書いたほうがいいですかね?
MFCでモッサリならC#で書こうものなら使い物にならんだろ
vs2012では、mfcがなくなったの?
どうしてそう思ったの?
使えなかったから
ExpressEditionには入ってなかった、ってオチだろうな。
Professional入れてるけど普通に使えるし。
CTabCtrlでタブコントロールを使ってますが
InsertItemでタブを複数追加して実行中に
マウスでタブの順番をドラッグで入れ替えたりする機能は
標準でないんでしょうか?IEのタブ表示だと普通にできますけど
CTabCtrlでは無理なんでしょうか?方法があったら教えてください
VCは2005を使用しています
ちなみにVS2010にCMFCTabCtrlというのがあって
コレを使えば実現できるのは知ってます。
問題はVS2005にてこれをやりたいと思っています。
未来Verの機能を使う方法があれば簡単なんでしょうけど
たぶん無理ですよね…
>246
画像素材作るのが面倒だけど、
CButtonあたりを継承して自分で組んでしまえば?
それやるくらいなら、CTabCtrlのイベント処理を自分でやればいいだけのような。
249 :
245:2012/07/31(火) 08:59:34.21
やはり自前しかないですか
CTabCtrlをオーナードローして作ることにしました
質問があります
AfxGetMainWnd()->SetMenu(NULL); でメニューを削除したあと
もう一度メニューを表示させることはできますか?
いっかいダイアログを閉じないとメニューをみれないので困っています
オーナードローって
オーナーがドローするんですか?
それとも
オーナーをドローするんですか?
いまいちわからない。
カスタムドローってのもあるし・・・
>>251 オーナーがドローする。
カスタムドローはオーナードローの進化版。
ただ、MFCではDrawItemのオーバーライドやNM_CUSTOMDRAWの
メッセージリフレクションを利用して実装するので、
実際にはコントロールの派生クラス自身が描画するような感じになるけど。
VC++6.0のMFCで作ったActiveXコントロールが
64bit版WindowsのIE上でも動くのはなぜでしょうか?
64bit版WindowsのIEには32bit版と64bit版がある。
マジっすか
むしろ64bit版の方がオマケ扱い。
やはり64bitのIEだと32bitのocxは動かないんですね
258 :
片山博文MZボット ◆0lBZNi.Q7evd :2012/08/04(土) 14:55:43.15
>>250 GetMenuで保管しておき、後でまたSetMenuする。
MFC標準機能でダイアログアプリを作って起動させます
これを別アプリで終了させたいんですけど可能ですか?
タスクマネージャでの終了みたいに強制終了じゃなくて
あたかも終了ボタンがおされEndDialog(IDOK)が呼ばれたかのように
安全に終了させたいと思っています
出来ればダイアログアプリに外部から終了させるための特別な処理は入れたくありません。
あくまで外部から正常終了させる物を作りたいのです
よろしくお願いします
どちらかと言えば
可能です
もちろん可能ですよ。
具体的にどうやるんですか?
教えてください
263 :
デフォルトの名無しさん:2012/08/08(水) 17:30:47.45
馬鹿には無理
ここで聞いても無駄
小学生にもわかるレベルのことは即応えるけど
技術必要なものははぐらかすだけだから
つまり素人の暇つぶしスレ
漏れでも出来そう
プロが小学生に質問するスレはここですか?
Spyでメッセージ調べて、そのメッセージをSendMessage()で投げるだけの簡単なお仕事。
x 馬鹿には無理
o おまえには無理
ウィンドウのハンドル取得って制限なかったっけ
↑
あほや!!
発作か〜!!
Monday Football Common!!!
mfcって.netより遅いの?
遅いとか意味がよく分からない
レジストリを勝手に使ってやり取りしてたりするから
その分起動に時間は掛かるけど
.Net Frameworkを起動する程じゃない
それ以上の話はWindowsAPIと大して変わらない
PCが高性能になるとそうとも言えない
APIよりCPUに最適化された中間言語の方が高速になる
もうそうなってきてるよ
中間言語が早くなっても、Windows.Forms系の処理はAPIを経由してるんだから
そこは変わらないって
中間言語のほうが速いなんてありえない
レースゲーでオートマよりマニュアル車の方が
最高速度が速いのと同じような感じじゃないかなあ。
下手な書き方すると、MFCの方が速度落ちそうだし。
文字列連結するのに1文字ずつ領域解放→再確保やっちゃうとか?
280 :
デフォルトの名無しさん:2012/08/24(金) 11:19:38.43
std::vector ですねわかります
MFCでwininetを使ってhttpでwebページの取得をしています。
以前まではできていたのですが、先日急にデータが欠落するようになりました。
具体的には、22kBほどのwebページを取得するのに、
2kBくらいでぶつっと切れてしまっています。
CHttpFile::Readの戻り値(取得したデータ長)は切れた部分まで(2k程度)になっています。
QueryInfoStatusCodeでは200が返ってきていますが、
firefoxでアクセスしてパケットのやり取りを見てみると、
最初は302が返ってきて、2〜3度転送されているみたいでした。
SendRequestからReadまでの間にSleep(1000)を入れると取得できるデータ長が
10k以上に増えましたが、やはり途中で切れてしまいます。
Sleepの数値を2000にしたら、すべて受信できるようになりました。
GetQueryInfoで、HTTP_QUERY_CONTENT_LENGTHを取得しようとしたら、
ヘッダが存在しないとエラーが出ました。(errcode:12150 ERROR_HTTP_HEADER_NOT_FOUND)
以前はこんなことは起きなかったのですが、何故だかわかる方はいるでしょうか?
Sleepで改善したということは、SendRequestの後に完了待ちをする必要があるのでしょうか?
>>281 その時点で受信できていた分だけを返してるような気がする。
確か0で戻ってきたら完了じゃなかったっけ?
自分もそう思い、Readで0が返ってくるまで繰り返すようにしてみたのですが
2回目のReadでは確実に0が返ってくるようで、ダメでした。
googleなどで色々と調べてみたのですが、Readの戻り値としては
「指定したbyte数【以下の値が】返ってきたら完了」という記事が一般的なようで、
先ほどの試験結果とも一致するので、そもそも少ない値が返ってくる時点でNGだと認識しました。
それにしては、Sleepで全部読み込めるようになったり、不可思議な点が多いのですが…
select
Sleep()で返る時間が変わるということは、単に経由している回線が細い
とか、Webサイト側でページを動的に生成に時間が掛かっていたり、ボット
対策でリファラーを見ていたりや、ブラウザの種類で何か細工しているん
でないの?
短く途切れる時の取得データと、「Webブラウザのリンク先を保存」などで
取得した正常データの先頭の中身は一致しているか確認した?
どこのリソース取得かを聞かないのは
この板のやさしさかな
>>285 返事が遅くなってしまい、すいませんでした。
先頭というより、切れている部分までは完全に一致しています。
リファラーとUAは、ブラウザで見る場合と同じ値に設定しています。
Web側でページを動的に生成しているとは思います。(更新ごとに内容が変わるので)
ただ、「Webサイト側で生成するのに時間がかかる」としても、
CHttpFile::Readで読み出す場合は問題ないと思っていたのですが…
(ページ内容を全て取得してからロードする、という関数ですよね?)
もしそうでないならば、以下の関数の実装が必要な気がします。
・途中まで読み込んだ後、再度実行することで、残りを読み出せる必要がある。
(完了した場合は、戻り値、もしくは完了判別関数で、完了したかを判別する)
・Readする前に、「Webページ側の準備完了まで待つ」もしくは「完了を通知する」機能
色々と調べてみたのですが、どちらも見つからないのですよね…。
MFCのソースを見てみる事をお勧めする。
APIのレベルで色々試せば何か見えてくるかもしれないし。
既にやってるかもしれないけど
CInternetSessionのOnStatusCallback()を実装して
もう少しstatusを細かくチェックしてみては。
ネットで検索してもほとんど出てこないけど
中身はWinInetのInternetSetStatusCallback()だから
そっちで検索するといいよ
>>288-289 ありがとうございます。ちょっとそのあたりを確認して色々と試してみます!
もう、MFCは必要なくなった。これからは全部手作りで自由にハックできる。
292 :
デフォルトの名無しさん:2012/09/11(火) 01:44:59.84
win7にmfc71.dll入れる場合って何を入れれば入るんだ?
ぐぐっても出てこんわ。
馬鹿には無理
>>292 Visual C++ .NET 2003 に含まれるやつだな。
残念ながら、公式の再頒布パッケージは存在しないので、
ベクター辺りから拾ってくるしかない。
「VC++ .NET ランタイムインストーラー」に入っているのは確認した。
295 :
デフォルトの名無しさん:2012/10/17(水) 00:30:47.15
GUIでアプリケーションを作成する場合、MFCを使うべきですか?CLRフォームアプリケーションから作成するべきですか?
MFCは重い古いとか言われますが、、、CLRとMFCを同類としてしまってもいいのかもわかりませんが、、、Visual Studioを利用している限り、
この2つが並ぶので…
297 :
デフォルトの名無しさん:2012/10/28(日) 15:53:28.54
MFCでスレッド作る時AfxBeginThread()使ってるんだけど、第一引数で指定するスレッド本体の関数はstaticじゃないとダメっぽい。
となるとstatic関数(スレッド本体)からは、そのクラスのstatic変数にしかアクセスできないから、そのクラスに定義されている変数を全てstaticに
変更したいのだが、一個ずつstaticを付けていくしかない?変数が大量なんどす、、、。
298 :
デフォルトの名無しさん:2012/10/28(日) 15:55:31.52
元のソースは非MFCだったから(スレッド作成時のスレッド本体が静的でなくてもいいから)this->でいけたんだが、MFC用に改良する状況になっちゃいまして、、、
そもそもMFCのスレッド本体が静的じゃないとあかん理由もよくわかってませんが…
長文すみません。。。
>>297-298 pParamにインスタンスのポインタを渡して、
スレッド本体からそのインスタンスのメソッドを呼ぶ形にすれば良いんじゃないか?
300 :
デフォルトの名無しさん:2012/10/28(日) 16:20:24.69
>>299 現状だと、メインダイアログへのハンドル(文字列表示のためにPostMessage()するため)がpParamに入ってるんです。
構造体かなんかにしてインスタンスのポインタも同時に渡せますかね。
>>297 >static関数(スレッド本体)からは、そのクラスのstatic変数にしかアクセスできないから、
これ都市伝説だから。
302 :
デフォルトの名無しさん:2012/10/28(日) 18:48:07.74
えぇっ!?
303 :
デフォルトの名無しさん:2012/10/28(日) 21:48:35.73
>>300 そもそも、そんな質問をしてるような奴にマルチスレッドは無理。
マルチスレッドなんていまどき保育園児だってしてるわハゲ
MFCで作ったソフトをブラウザ上で実行するには、どうすれば良い?
OfficeやAdobe Readerの様に動かしたいです。
activex
308 :
デフォルトの名無しさん:2013/03/04(月) 03:41:59.66
cfilefindで、指定フォルダ内の全フォルダの情報を読み出すプログラムを作成しているのですが、
フォルダのプロパティで出た数と、プログラムで読み出した数とで異なるフォルダがあります。
フォルダの階層もちゃんと再帰的に読み出しています。
試しに色々なファイルをフォルダに階層的に入れて数えましたが、
ファイル数303とかちゃんと合っているフォルダもあれば、
実際に確認したいファイル数10136 フォルダ数1654のフォルダでは、
合計11522と、少なく出ます。
FindNextFileのエラー情報も出しましたが、すべて18でした。
なにが原因なんでしょうか?
309 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/03/04(月) 05:48:08.61
隠しファイル、システムファイル
ソースも貼らずに何を言っておるのかね
311 :
308:2013/03/04(月) 20:29:04.81
>>310 そーですよね。
なにか既知の問題とかないかと思ったもので。
原因わかりました。
Cfilefindは問題ありませんでした。
ファイル名に、HTMLの半角文字「 」が使われていて、
ワイド文字からマルチバイト文字に変換するときに、nullに変換されていました。
すれよごしすまんです。
312 :
デフォルトの名無しさん:2013/03/05(火) 17:24:36.94
通常使用するプリンタの印刷設定で用紙サイズがありますよね?
例えばB5とA4の切り替えをVCプログラムでやりたいのです
やりたいのは用紙サイズ切り替えだけで印刷はしません
印刷はExcel等の印刷ボタンで行います
プリンタの印刷設定の用紙サイズの変更方法(使用するクラス?)など
又は例が載ってるサイトなどがありましたらお教え下さい
よろしくお願いします。
313 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/03/05(火) 19:48:51.03
GetProfileString,strtok,OpenPrinter,DocumentProperties,DEVMODE
ありがとう
教えてもらったワードで検索してSDKサンプル見つけました
やりたいことができそうです
>>314 基本的に片山は嘘をつくから相手にしないほうがいい
それに片山の相手をしていると他の回答者に無視されるよ
片山さんは真実を教えてくれたよ?
今度から信じるよ?
318 :
デフォルトの名無しさん:2013/03/11(月) 17:38:32.83
過疎
319 :
デフォルトの名無しさん:2013/03/24(日) 00:36:21.77
質問です。
CTimeSpan::GetTotalSeconds()は閏秒を含んでいますか?
例えば
CTime BirthDay(nYear, nMonth, nDay, nHour, nMin, nSec);
CTime Today(__time64_t(NULL));
CTimeSpan Age = Today - BirthDay;
としたときに、Age.GetTotalSeconds()の戻り値は
2つのCTimeインスタンスの間の期間に挿入された
閏秒を加算した秒数になりますか?
>>319 なるよ。
BirthDayもTodayも__time64_t型の時間を持ってるだけだし。
321 :
デフォルトの名無しさん:2013/03/24(日) 15:57:38.80
>>321 確かにOSが知らないのであればMFCにも反映されて無さそうですね。
CTimeの派生クラスを作って、operation - や + の際に閏秒の判定と
加減をするよう定義することにします。
ありがとうございました。
323 :
デフォルトの名無しさん:2013/03/25(月) 00:36:19.76
まあ過去のうるう秒のあった時刻をまたいで実験してみればいいだけだね
やってみようとおもったが手元にMFCの環境が無いわ、、、
対応は無いよ
CStdioFileのReadStringのfgetsが+1してる件
VS2012付属のソース見る限りは、
最大長+1=バッファ長という意味合いで使っているんじゃないか?
CString::GetBufferは指定文字数+NULL文字のバッファを返すし。
フローチャートかくつーるを作りたい。手始めに四角図形をドラッグ出来るようになりたいけど、ドラッグイベントはないし、どうすればいいの?
328 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/03/28(木) 00:39:45.35
>>327 WM_LBUTTONDOWNが来たらPtInRectで四角の中か判定、SetCaptureしてフラグを立てる。
WM_MOUSEMOVEが来たらフラグを確認、移動後の位置を計算、再描画で四角を動かす。
WM_LBUTTONUPが来たらフラグを下ろしReleaseCaptureして移動後の位置を計算、再描画で四角を動かす。
ドラッグとりあえず出来ました。ありがとう。
ただドラッグ前の図形が表示削除できていないや。楽に消すとコツあります?
330 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/03/28(木) 05:50:40.39
>>329 InvalidateRect
WM_PAINT
WM_ERASEBKGND
ダブルバッファリング
DrawClient サンプルを見た方が良い
フラグを使うなら WM_CAPTURECHANGED も処理する必要がある
もと図形の削除もできた、drowclientはまだ見てない。
図形の左下をクリックして動かすと左下を掴んだまま図形を動かすのは難しい?
四角図形の座標とマウス座標の相対座標も計算するのかな
WinFormsやWPFがあるのにわざわざMFCで作る理由ってなに?
334 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/03/29(金) 07:45:11.41
>>332 GetCursorPos、ClientToScreen、ScreenToClientを使って座標系を統一して
ホットスポット(図形からマウスへの相対位置)を計算。
マウスの位置からホットスポットを引けば図形の新しい位置が求まる。
>>334 ありがとう出来ました。
あとはドラッグ中に画面更新して画面がちらつくのが気になるだけですね。
グリッドを表示させてみたんですがボタンや線がチラチラしすぎ。
メモリーデバイスコンテキスト検討しようかな
wixformsやwfpがそもそも何かわからないです。それだとフローチャートを書くツールを作りやすいんですか?
>>336 そういうのに特にwpfはめっちゃ向いてる
DrawClient見りゃ質問した内容は全部書いてあるのに…
そもそもそのツールを作る理由って何?
プログラムの勉強をしたいのかと思ってたけど、ツールが欲しいだけの
ような気がしてきた…
質問した理由は、umlのような図形プログラムを作りたかったからです。
かなり用途を限定したRPGツクールのプログラム版のようなものでしょうか
だから自作実装しておきたい。
340 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/03/29(金) 13:18:40.56
>>335 ちらつきをなくすならWM_ERASEBKGNDとメモリDCですね。
>>340 書き込み規制で遅くなったけど メモリーdcは少し面倒だったので、WM_ ERASEBKGND で対応しました。
当初の目標は達成できましたが、 フローチャートを描くツールとしては 図形クラス設計しておいて、 表示や当たり判 定、図形の中に文字を書くなどなどですね
WPFのベクタグラフィックス最高だぞ
343 :
デフォルトの名無しさん:2013/06/15(土) 01:17:00.33
このスレは生きているのかな?
BOOL Cmessage_winDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
// Framework は、この設定を自動的に行います。
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
// TODO: 初期化をここに追加します。
SetWindowPos(&Cmessage_winDlg::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
ダイアログウインドウを出すだけのプログラムですけど、
普通に起動すると常に最前面に出せるのに、
タスクマネージャーにより起動させると、常に最前面になりません。
なんで?
WS_EX_TOPMOST
345 :
343:2013/06/19(水) 19:47:44.63
thanks
346 :
デフォルトの名無しさん:2013/06/29(土) 21:32:41.43
ドキュメント/ビューの基本的なところで教えてください。
SDIではCDocumentとCViewが使いまわされますが、あるドキュメントで作業した後に
別のドキュメントを開いた際、それまで使用していたCViewの後始末はどこで行えば
いいんでしょうか?
CView::OnInitialUpdateの冒頭で初期化に先立って行うのが普通なんでしょうか?
SDIならそうするしかないんじゃないの
なるほど、ありがとうございます。
そうすると、CView::OnInitialUpdateはCDocument::DeleteContentと違って
終了時に呼ばれないですから、同じ後始末処理をOnDestroyかどっかと
両方に書かなきゃならないんですかね。
>>346 何なのかわからないけど、その後始末の必要な物をCDocument側に置けないの?
MFC+SDIなら綺麗な設計にはならんw
>>349 具体的には、ドキュメントの内容に応じて動的に作成するコントロールなどです。
CDockablePaneとかのMFCの比較的新しい機能を解説した書籍ってないもんかな。
353 :
デフォルトの名無しさん:2013/07/23(火) NY:AN:NY.AN
VS2008のMFCで、CMDIFrameWndEx::ShowFullScreenを使って全画面表示をしようとしています。
ただ、そのままだと完全な全画面にはならずタブと枠が残ってしまいますが、完全な全画面に
するにはどうすればいいでしょうか?
ちなみにCFullScreenImpl::EnableTabsAreaで制御できるのかなと思いましたが、アクセスする
方法がわかりませんでした。
MFCの共有DLLを読み込んだDLL同士でスレッド情報を共有させ、CWndの仮想関数を
機能させるには、それぞれのDLLのエクスポート関数の先頭にマクロを書けば良いのですか?
telnetネゴシエーションがよくわからない。mfcのソースコピーできるとこない?
エスパーさん ━キョロ━(゚∀゚≡゚∀゚)━キョロ━マダ━?
357 :
デフォルトの名無しさん:2013/09/03(火) 22:50:16.50
.NET 2003なんですけど、プロジェクトを作成した時点で
例えば#include "LeftView.h"ってソースにインクルードされてるのに、
いつのまにか自動的に#include ".\leftview.h"
とかってソースに追加でインクルードされるのを抑制することは出来ますか?
VS6とか、以前のバージョンではこんな余計な機能無かったのに。
うざくてしょうがない。
>>358 VisualStudioスレへどうぞ。
VS2010のVC++でCListCtrlのCreateDragImageでドラッグアンドドロップを実装しています。
開発、動作とも32ビット環境で、Unicodeでコンパイルしています。
XPとWin7で作成される画像が違うのですが、仕様が変わったのでしょうか?
リストコントロールはFULLROWSELECTにされていて、XPでは存在する全ての列のイメージが作成されますが
Win7だと一番左のセル1個の画像だけ作られて、他の列は作られません。
全く同じバイナリを動作してXPと7で差があるのですが、それに関する文献はありませんか?
MFCでIPアドレスコントロールをReadOnlyにしたいのですが関数がありません
どうにかReadOnlyにすることはできませんか?
DisableではなくReadOnlyにしたいです
ReadOnlyなら自前で書けばいいじゃん。
つーか、目的を書いた方が早いよ。
ダイアログアプリにメニューを設け、起動時に特定の条件の時にメニューに新規項目を追加する、
と言うのをやりたいと考えています。
メニューバー部(最上位)に1件追加し、その下に項目を設けたかったのですが、最上位に追加した
項目をGetSubMenu()するとNULLが帰ってきて、当然その下に項目を設けることができません。
CxxDlg::OnInitDialog()
{
// <省略>
CMenu *mnu = this->GetMenu();
mnu->AppendMenu(MF_STRING , ID_MNU_0001, _T("test"));
}
CxxDlg::OnInitMenu()
{
CDialog::OnInitMenu(pMenu);
CMenu *mnu = this->GetMenu();
CMenu *mnuSub;
mnuSub = mnu->GetSubMenu(4); // (新規追加項目の位置)
ASSERT(mnuSub); // ここでエラー
}
最上位への追加まではできているのですが、追加した項目のCMenu*を得るにはどうすれば良いでしょうか?
365 :
デフォルトの名無しさん:2013/10/08(火) 21:04:30.33
フォントを固定ピッチに変更するだけなんじゃ・・・
MS PゴシックじゃなくMSゴシックみたいにPが付いてないフォントを選べばいい
368 :
365:2013/10/09(水) 22:18:18.60
>>366-367 返信ありがとうございます。
とりあえずこんな風にしてみました。
// ヘッダのクラス定義内に登録
// 等幅フォントを格納するメンバ変数を定義する
CFont m_inFixedPitchFont;
CListBox m_list;
// 等幅フォントを作成します。
LOGFONT sLogFont;
memset(&sLogFont, 0, sizeof(LOGFONT));
sLogFont.lfHeight = 12;
sLogFont.lfCharSet = SHIFTJIS_CHARSET;
sLogFont.lfPitchAndFamily = FIXED_PITCH;
m_inFixedPitchFont.CreateFontIndirect(&sLogFont);
m_list.SetFont(&m_inFixedPitchFont);
m_list.AddString("Address Value Name Message");
m_list.AddString("[0x00000] [0002] [Jpeg Stat] Jpegのステータス");
こうすればとりあえずインデントを揃える事は出来ました。
AddStringは\tとかのエスケープシーケンスを自動で判断する事が出来なさそうなので
その辺の処理を追加するか、完全手動に必要がありそうですが・・。
もしもっと他に方法がありましたら教えてください。
369 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/10/09(水) 23:39:52.42
列がいくつもある場合には、リストボックスよりもリストビューの詳細表示の方がいいよ
>>368 リストボックスのスタイル指定忘れが原因で、
タブ処理が有効になっていない予感。
VS2012のダイアログエディタだと「Use TabsStops」をTrueにする。
API的にはLBS_USETABSTOPSだな。
ある子ウィンドウで、キー入力のうち自分が処理しないものを親ウィンドウに処理してもらいたいとき、
OnKeyDown() の中から親に SendMessage(WM_KEYDOWN,...) で委譲するしかないですかね?
それとも他にもっと適した方法がありますか?
また、SendMessageで委譲するとした場合、他に併せて送らなければならないメッセージとか
ありますか?たとえばWM_KEYUPとか。
親のOnKeyDownを直接呼ぶ
373 :
デフォルトの名無しさん:2013/11/04(月) 07:58:02.05
初歩的な質問で恐縮です。
Windows 7 & VC++ 2010 で MFC をスタティックリンクで開発してきました。
今度、開発環境のOSだけ 8.1 にしようと思っております。
動作OSの下位互換は開発環境さえ変えなければ維持できるでしょうか?
(リンクするライブラリさえ変わらなければ問題無いと思うのですが)
それともそれを保証するなにかオプション設定は必要でしょうか?
ご教示お願いします。
テストは必須です。
375 :
デフォルトの名無しさん:2013/11/04(月) 11:29:48.10
すべてはテスト次第です
「テストが必須」っていうのはお飾りじゃないよ。
378 :
デフォルトの名無しさん:2013/11/04(月) 11:56:45.00
>>373 targetver.hでググッてみ
#define WINVER 0x0600
等の定義で、新OSでなければ動かないAPI等を弾ける
ただし100%信頼できるものではないので、テストは必須
そりゃターゲットのバージョンを変える場合だろ。
BCGライブラリをくっつけた今のMFCには、
OS依存のバグがかなりあるよ。
たとえば?
docviewsdiでxxxというプロジェクトを作成すると
CxxxViewクラスのヘッダファイルに
CxxxDoc* GetDocument();と宣言されている
CxxxDoc.hもincludeされていないのになぜコンパイルできるですか?
コンパイルされるのはソースファイルだから。
分かりました
使う側のインクルードの順番が違うとコンパイルが通らないのは、欠陥だと思うけどな。
通常はxxxView.h自身がxxxDoc.hをインクルードするか、前方宣言するべき。
387 :
デフォルトの名無しさん:2013/11/18(月) 14:16:29.23
pch肥大化対策か
循環回避だろう
389 :
デフォルトの名無しさん:2013/11/19(火) 09:30:33.55
MFCって、エラークラスありましたっけ?_?
CExceptionとか?
あ、あるんですか。
C++ Builderだと、throw Exception("err");、を良く見るけど、
MFCプログラムだと、throw CException("err")、ってのは見たことないですね。
>>391 AfxThrow〜〜〜Exception()ってのがいろいろある
>>391 CExceptionはMFCの全ての例外クラスの"抽象"基本クラスだから、アプリのソースに直接使われることは無いよ。
派生クラスのCFileExceptionなんかが良く使われる。
>C++ Builderだと、throw Exception("err");、を良く見るけど、
これってクラスのインスタンスを投げてるんじゃなくて
文字列を投げてるだけなんじゃないの?
>>394 Exceptionクラスのインスタンスを値で投げてる。
ここら辺、MFCは歴史的経緯でポインタを投げるから、
CATCHマクロでハンドリング、もしくはcatchしたらDeleteメソッド呼んで
明示的に削除とか妙な話になってるんだよなあ。
visual studio2012でMFCを使っているんですが、
各種コントロールを拡張して一つのライブラリにまとめたいと思っているのですが、
詳しいやり方が分からず困っています
mfc active コントロール ウィザード ってのでいいんでしょうか?
普段複数列のコンボボックスとかなにかと標準のでは
かゆいところに手が届かないと思うんですが、
皆さんはどのようにされていますか?
397 :
デフォルトの名無しさん:2013/11/30(土) 01:54:22.82
>>397 サブクラス化
の意味知ってる?
使いたかっただけだよねw
「複数列のコンボボックス」の内容にもよるんじゃないか?
サブクラス化で実装できる内容もあるだろうし。
ライブラリ化するなら、ソースレベルに留めておいた方が扱い易そう。
ActiveXコントロールは明らかにやり過ぎとしても、
MFCのDLLとかにしても依存関係とかで面倒な話になりそうだし。
画面を作るときの書き方についてアドバイスください
画面にラインやテキスト、動的に生成したコントロール等を配置する際に、
int width = マウス等で広げた画面の幅
DrawText(_T("aaa"), CRect(20, 50, 120 + width, 70)...
と、もろに数字を書いて場所を指定しているのですが、
印刷も実装しようとした際に解像度が違うので、数値を変えないといけなくなってしまいますが、
皆さんは描画の際にどのように位置等を指定していますか?
画面の何%のようにすれば解像度が変わっても問題ないのでしょうが、
細かい調整等ができないのと、描画する物が多くなればなるほど面倒になります
こういう場合どういう実装が一般出来なのでしょうか
皆さんの意見をお聞かせください。
>>401 調べてみたのですが、こんなものがあったのですね
詳しい使い方がいまいち分からないのですが、
普通に描画して印刷の際に拡大縮小して表示するということでしょうか?
大量のリストを表示するような画面で、画面ではスクロールバーを生成して
画面に表示できる量だけを計算して表示しているようにしているのですが、印刷時は全部を印刷したいと思っています。
画面の描画も印刷も同じOnDrawでpDC->IsPrinting()で判断するようなので、
とりあえずOnDrawにすべて記述しているのですが、メタファイルの作成はあらかじめしておくのでしょうか?
CDC::SetMapModeで論理単位で指定するモードに切り替える。
たぶん。
表示と印刷の両方に使える描画関数を用意する。サイズなどは引数で抽象化する。
印刷する場合はアスペクト比を取得し、描画関数を使って
メタファイルを作成し、用紙サイズに合わせてメタファイルを描画する。
structにCStringをメンバとして含ませて、そのstructのオブジェクトをnewで大量に作成するとdelete時にコケる事がある
CStringが元凶だと分かるまでに1時間位かかった
ごめん
>>405は忘れてくれ、全然関係ない事が原因だった
実はCStringをメンバとして持つ構造体にmemset()でクリアする馬鹿がいたとか。
十年前、私のいる会社でそれをやった馬鹿は今では立派に部長兼任理事ですw
まだCString使ってるひとがいたとは
MFC使ってるなら使わざるを得ないだろ
CString使って何が悪いの?
速度
どういう処理の速度が何と比べてどれぐらい遅いの?
中身はただのcharとかwchar_tなの知らないで、断片的にメモリ確保させまくって遅いとか言ってるんジャマイカ?
数年ぶりにmfcでPG作ったけどサクサク動く感じはいいなー
なんだかんだ言っても、ネイティブコード直結はレスポンスが良いからね。
416 :
デフォルトの名無しさん:2014/02/08(土) 13:47:20.30
CFileDialogにIFileDialogCustomizeでコントロールを追加する場合、やっぱり
ダイアログを表示した後は変更不可なんでしょうか?
OnTypeChange()で選択されたファイルタイプ毎に別の表示を行いたいと
思っているんですが。
既存のテンプレートに追加する仕組み自体
苦し紛れの裏技みたいなものじゃなかったかな
該当部分全体を1個の複合コントロールにまとめてしまって
コントロール内部の変化として吸収してしまう手はあるかもしれないw
Vistaから、テンプレートを使う方式のかわりにIFileDialogCustomizeになったんですよ。
419 :
416:2014/02/08(土) 19:07:30.66
自己解決。
一旦表示したらAdd/Removeできないのは仕様。
かわりにSetControlStateで見えなくすることはできる、ということらしい。
質問させてください。
windows7+VC2005の環境で、ダイアログベースのMFCアプリを作成しています。
目的はブラウザ(IE)のリンクをドロップし、リンクパスの表示と、リンク先のファイル(主にzipかlzh)をダウンロードすることです。
現在、ドロップを受け取る方法が分からず困っています。
ググるとファイルドロップの方法ばかりでリンクをドロップするにはどうしたらよいのかがわからないです。
(ゆくゆくはブラウザで選択した文字列を取得するドロップにも対応したいです。)
たまにテキストのドロップを受け付けられるサンプルソースがあるのですが、
MFCを使用せずに作成されており、どうやってMFCアプリに組み込めばよいのか理解できていません。
(
ttp://hp.vector.co.jp/authors/VA016117/oledragdrop5.htmlを参考にしたのですが、DropTargetクラスをMFCで作成したクラスにどう組み込めばよいのかわからなかったです)
windowプログラム初挑戦で分からないことだらけなのですが、リンクのドロップを受け付ける手順を教えていただけませんでしょうか。
よろしくお願いします。
COleDropTargetかな?
.netならちょろいのになぁ
423 :
420:2014/03/06(木) 01:25:01.97
>421
COleDropTargetをダイアログクラスの面罵にして、Initでレジスト関数にポインタを渡すと
ドロップに対応できるくさいことはどこかのHPで呼んだのですが、上手くいっていなんです...
とりあえずDrop関数でbreakできるようになれば後は頑張れると思うのですが...
今日は別の仕事が立て込んでて作業できなかったので、明日もう少し向き合ってみます。
(携帯がauで規制かかってるため、日中質問したりできないのが辛い...)
>422
.netなら簡単に実装できるのですか。
Windowプログラミングをあまり必要としない分野なもので、手持ちのツールがVC2005しかないので駄目そうです。
残念です。
>>424 そのコードをReflectorで解析すれば出来るんじゃないのか
根性があるのならば
>>420 かなり昔のことなのでだいぶ忘れてるけど
当時のソース見てみるとIDropTargetを継承したクラスを作って
仮想関数のDragEnter、DragLeave、DragOver、Dropをオーバーライドして
チマチマやってたみたい。ほとんどがwin95でも動くようにするためのコード
なのでwin95を捨てればほんの数行かも。
427 :
426:2014/03/08(土) 19:05:41.94
ごめん、これMFCじゃないね
皆さんアドバイスをください
SDIで開発してて、ドキュメント1つに対してビューを2つ用意して、
一つは一つの商品の情報を表示して、もう一つは複数の商品の一覧を表示しています。
商品に対して表示する情報は同じなので、2つのビューで共通する処理が多数あるのですが、
(OnPaintの半分ほど、スクロール、マウス、キーボード等の処理はほぼ同じ)
この場合共通する処理だけ実装したビューを作成し、
それぞれが共通ビューを継承して違うところだけ実装した方がよいのでしょうか?
それとも後々処理が変わることを見越してこのまま同じ処理のビュー2つでいいのでしょうか?
むやみに継承しても他の人が触るときにどうなのか客観的にみて皆さんはどちらがいいと思いますか?
>> それぞれが共通ビューを継承して違うところだけ実装した方がよいのでしょうか?
これに一票。小さいプログラムなら単一Viewを状況に応じて使い分けるってのもアリかも。
>> 他の人が触るときにどうなのか
あなたと引き継ぐ人の腕前が分からないと判断しかねます。
>>430 ありがとうございます
システム関係の部署もなく現在は私一人で開発しているもので、
どうしても主観的になっているのではないかと思い客観的な意見が聞きたかったのでありがたいです!
できればもう一つアドバイスを頂きたいのですが、
現在exeをサーバーの共有フォルダに置いており、各クライアントからはショートカットで起動しているのですが、
このようなやり方はいかがなものなのでしょうか?
やはりなにか自動アップデート的な機能を付けた方がいいのでしょうか?
各システムの使用者はそれぞれ10名程度なので、更新するときはサーバーのだけ上書きすればいいので楽なのですが、
はたして正しいのかどうなのかひっかかってます…。
432 :
430:2014/03/16(日) 22:06:38.19 ID:qeSKPaCp
read onlyなら問題無いと思います。サーバー上にドキュメントがあり、さらにその更新も
やるプログラムであれば、サーバー側にも1個別なPGがないと厳しいかも。
>>431 文面からエスパーすると、実行するのはクライアントのプロセス空間内みたいだし、実行ファイルが自分自身を書き換えたり共有フォルダ上の他のファイルを更新しないのであれば問題ないとは思う。
リスクとしては、更新時(バイナリ差し替え時)に誰も関連ファイルを参照しない、ということが保証できているかが気になる。
まあ、現状うまいこと運用出来ているみたいだから、そのままでもいいんでない?
ただ個人的にはそういう配布(?)方法は気持ち悪いからやりたくない。
ヘルプ(*.chm)が共有フォルダ上だと見れない(見るには要レジストリ変更)とか無かったっけ?
ヘルプは無いのかな
CWndの1つ1つが別スレッドで出来てるってマジ?
ないない
そうだよね
読み間違えたか^^
Javaだとやりかねないけどな
439 :
デフォルトの名無しさん:2014/05/20(火) 15:49:35.48 ID:egqFhnIS
ダイアログアプリケーションについての質問です。
ダイアログ上に貼り付けたピクチャーコントロールに、リソースからビットマップを選択して表示、
と言うのをやっています。
これに追加して、ビットマップの内側にあるあらかじめ色bで塗りつぶされている領域を、
あとから指定する任意の色(c)で塗りつぶす、と言うのを行いたいと考えています。
CDC cDC;
CBitmap *pOldBitmap;
BITMAP bmp;
CPaintDC paintDC((CWnd *)&m_Static);
cDC.CreateCompatibleDC(&cpdc);
pOldBitmap = cDC.SelectObject(&m_Bitmap);
m_Bitmap.GetBitmap(&bmp);
paintDC.FillSolidRect(0, 0, bmp.bmWidth, bmp.bmHeight, color_back);
paintDC.TransparentBlt(0, 0, bmp.bmWidth, bmp.bmHeight,
&cDC, 0, 0, bmp.bmWidth, bmp.bmHeight, color_Transparent);
paintDC.FloodFill (15, 30, color_c); // <-ここで塗りつぶしを意図
cDC.SelectObject(pOldBitmap);
OnPaint()中でこんな感じにすれば出来るか、と考えていたのですが、うまくいきませんでした。
正しい(出来れば簡便な)手順はどのようになりますでしょうか?
ビットマップにメモリ上で描画してから張るしかないんじゃないの? MFCよく知らんけどw
OnPaintなら引数でdcわたってくる
CDC *pDC = m_Static.GetDC();
// 描画
m_Static.ReleaseDC(pDC);
じゃ駄目?
仮にそれでうまく塗りつぶせたとしても、ピクチャーコントロールの再描画が発生したら
ピクチャーコントロールが持つ元のビットマップが再描画され、塗りつぶしは消えてしまうよ
GetDCとかは描画のためじゃなくて属性の取得・切替くらいにしか使えない
>>439 CPaintDCは基本的に、WM_PAINTのハンドラOnPaintで引数にthisを渡して使う。
他のウィンドウに書きたい時は442の通り。ReleaseDCは不要だけど。
また、443の通りなので、オーナー描画にしてOnDrawItemで描画する方が良さげ。
あと、ピクチャコントロールはCS_PARENTDCなので、
実際にはダイアログ上に直接描画するのと同じことになる。
FloodFillがコントロール外に溢れだすかと。
446 :
439:2014/05/23(金) 21:19:46.12 ID:bGbo8U4D
いろいろとアドバイスをありがとうございます。
あれから、いろいろと自分なりに試行錯誤を続けていたのですが、
どうにもうまくいきませんでした……自分がアホなのが悪いのですが orz
(描画方面を触る機会が無かったので、セオリーが全然わからないのです)
他力本願で申し訳ないのですが、似たような事例で参考になるページ等、
ご存じでしたら誘導をお願いできませんでしょうか?
できないことは諦めるのがいいとおもうんだ。
448 :
445:2014/05/25(日) 10:10:34.15 ID:LQ1sHYmR
.NETのWindowsForms使った方が楽。
あれだけグダグダ書いといてなんだけど。
今時こんな知識糞の役にも立たんよ。
VS2013のC#でFormにいくつかのボタンやテキストボックス、
リストボックスなどある簡単なGUI作った経験があるのですが、
それと同じのをC++で作りたいのです。
それで、MFCのダイアログベースのアプリを試してみたのですが、
C++初心者の私には、ちょっと難しすぎて困っています。
C++で簡単なGUI作る何か良い方法ありませんか?
>>449 目的によるんじゃね?
・.Netで楽したい
→C++/CLI
・MSに縋りつきたい
→VSで頑張ってMFC
・どうしてもC++は馴染めない
→WinAPI直呼び
・できれば他のOSでも使いたい
→QtをQtCreatorで
アドバイスありがとうございます。
MFCを少し使ってみたのですが、例えばボタンを配置してダブルクリックすると
自動的にOnBnClickedButton1()関数が追加されますよね。
このあたりはC#と同じですが、でもその関数が不要になり削除してビルドすると
エラーしました。C#だと問題なくビルドできます。それでMFCは使いづらいなあと
いう印象を持ちました。
私としては、そんなに複雑なGUIを作る予定はないので、高機能なものよりも、
GUI作成時の操作性の良さを優先したいです。例えば上で指摘したような件は、
些細な事ですが私にとっては重要です。
WTLというのを試してみようかなと思っていますが、どうでしょうか?
>・.Netで楽したい
>→C++/CLI
C++/CLIは少しやってみましたが、複雑で断念しました。
>・MSに縋りつきたい
>→VSで頑張ってMFC
今ここで迷っています。
>・どうしてもC++は馴染めない
>→WinAPI直呼び
それは避けたい。
>・できれば他のOSでも使いたい
>→QtをQtCreatorで
これも試してみます。
.hと.cppとMESSAGE_MAPの3箇所修正しないといけないな
Qt は初心者でも使えるけど、どちらかというと上級者向きで、使い込むほど上級にステップアップできる。
MFC は初心者向きで、いつまでたっても初心者を脱出できないカタワになること享けあい。
つ C++Builder
WTLはMFCよりメッセージ周り理解してないと面倒、昔はMFCみたいにVSから編集できたような気がしたが今はだめっぽい?
Win32++がウィンドウのサンプル多いから改造しやすいがリソースファイル周りがちょっと面倒
>>451 大昔にC++Builder使ったことあるけどサクサク組めて簡単だった。
でもC++/CLIを複雑過ぎると言う方には、どうなんだろ。
C#やVBで、簡単なサンプルじゃなく、自分が欲しいアプリを出来るだけ妥協せずに
1本組んでみたらいかがでしょうか。その後でC++に手を出しても遅くないと思います。
今の段階ではマニュアルが読めないんじゃないかな?
初心者なんだから情報の多いMFCでいいと思うがな。
C++自体初めてなのにわざわざマイナーな環境で苦労することはない。
つうかIDE使うこととライブラリ使うことと言語がごっちゃになってるじゃん。
何使ったってうまく行かないよ、そういう人は。
>>459 言語仕様は開発環境じゃ変わらないよ?
そんなこともわからない奴がより良い環境って。
461 :
449:2014/05/29(木) 05:33:31.36 ID:82BFXyhl
WTL試してみましたがMFCと同じくらいややこしそうなので、やめました。
Qtは試していませんが、調べた限りではちょっと大掛かりな感じなので
やめました。
ということでMFCを勉強することにしました。
C#の場合だと、プロパティ設定でフラットスタイルや、上下左右のアンカー
など簡単でしたがMFCでは難しそうですね。それとタブコントロールにタブページ
の追加方法が分らなくて困っています。ああ、難しい。
簡単さを求めるならC#一択だと思うんだけど
VC++に手を出すなら猫でも分かるプログラミングでも見て
API直叩きのプログラミングを経験した方が良いよ
MFCはそれを楽にするためのクラス群だし
難しいってのは基礎知識が無いってだけの話だからね
掛け算を知らないのに因数分解を学ぼうとするようなもの
そういった意味ではC#は完全に別物だよね
>>462 MFCはそれ自体で完結しているから、MFCとWin32という界面の違いというだけで
どっちから始めても大して変わらんだろ。
Win32の知識があればMFCの個々の設計がなぜそのようになっているか理解
しやすいだろうが、Win32の設計を1から理解しようとしたら歴史の知識が必要だw
このHPを参考にしてComboBoxにアイテムを追加したいのですが、
http://www.g-ishihara.com/mfc_cb_01.htm メンバ変数追加ウィザードの画面で、コントロール変数のチェックボックスなどがインアクティブ
な状態になっていて選択できません。できるのはコントロール変数ではなく、普通のint型などのメンバ
変数の追加のみです。
どうすればコントロール変数を追加できるでしょうか?
VisualStudio2013のMFCプロジェクトです。
>>464 カテゴリの項目が「Value」になっていないか?
>>465 カテゴリの項目もインアクティブで変更できませんでした。
その後、プロジェクトを保存して再度開いたりしていたら、
自然に解決しました。原因はわかりません。
index.htmlからMFCのexeファイルへリダイレクト。
って話では無いよなあw
その説明だけだと、本当にやりたい事がわからないな。
cgiのプロセスメモリを監視して
GUI遠隔操作とかやったことある
MFCアプリの画面イメージやマウスクリックを通信する方法もあるけど、Win実機が必要になる。
素直に作りなおすといいよ。
エスパー凄いな
びっくりだ
PropertySheetにPropertyPageが数枚あるだけのシンプルなMFCアプリを
作りたいのですが、その場合、親のウインドウはダイアログウインドウになるのでしょうか?
それともダイアログウインドウ無しでPropertySheet自身が親ウインドウになれるのでしょうか?
一般的な方法を教えてください。
> 470
Uchan の出番だな
476 :
464:2014/06/08(日) 12:51:14.20 ID:psuIHcXy
>>476 プルダウンのボタンを右クリックしてるとか?
478 :
デフォルトの名無しさん:2014/06/12(木) 09:18:24.66 ID:GvZA3DBS
MFCのソースはスパゲッティーだと思う人いますか?
ちなみに自分は思います。
シンプルなことを複雑に書いてしまっているので、ちょっとした機能向上
のために自前で何かを追加すると、アクティブ化やDocking, Floating関連、
CFrame,CView,CDocument関連の一部で妙な不具合が出てきます。
479 :
デフォルトの名無しさん:2014/06/12(木) 09:26:17.26 ID:GvZA3DBS
Document&View Architecture は、一つの CDocumentを複数のCViewで
表示する事が基本理念なのに、VC++6.0のMFCで用意されている関数は、
CFrame,CView,CDocumentを一括で作成する物だけで、既存の
CDocumentを新しいCViewにリンクするような関数は無いようです。
メッセージ・ルーティングも、実装が複雑なせいか、Doc&View
Architecute から離れて、単独の CView や CWnd などを持つと、
当たり前のことが当たり前に出来ないような事態になります。
ちなみに自分はどうでもいいです。
CDocument::AddView じゃ出来ないってこと?
MFCをそのまま使うだけじゃ出来ないことも多いけど
使い方を理解せずに「出来ない」って言ってるようにしか見えない
482 :
デフォルトの名無しさん:2014/06/12(木) 10:00:12.19 ID:GvZA3DBS
VC++6.0でMFCのMDIアプリのプロジェクトを作成し、直後にビルド。
アプリに作成されたCViewの継承クラスに OnActivateView() の仮想関数を
追加。その中で:
MyDebugPrintf( "OnActivateView(), bActv = %d, pAct=%08X, pDeact=%08X, this=%08X\n",
bActivate, pActivateView, pDeactiveView, this );
と書く。この関数は、OutpurDebugString()にvspritnf()を使って、
書式付出力機能をつけた物。
デバッグを開始し、アプリのファイルメニューから新規作成を二度行い、
MDI Child Frame を二個作って、アクティブ化のテストを行う。
別アプリをアクティブ化して、このアプリのタイトルバーをクリックす
ると、pAct==pDeact==this で上記の仮想関数三回呼び出されてくる。
bActvは、1,0,1 の順。で、三回とも、同じ this の値は同じ。つまり、
pAct==pDeact==this は、計9回同じ値が表示され、bActvだけが1,0,1。
別アプリをアクティブ化して、このアプリの中のMDI子ウィンドウをクリック
した場合は、これが、4回となる。
483 :
デフォルトの名無しさん:2014/06/12(木) 10:11:18.90 ID:GvZA3DBS
>>481 なるほど。それはすみませんでした。
ちなみに、MSDN Library によれば:
pView = new CMyView;
pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
rectDefault, this, AFX_IDW_PANE_FIRST + 1, NULL);
//pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); // ???
pView->ShowWindow(SW_SHOW);
AddView( pView );
SetActiveView(pViewAdd);
RecalcLayout();
とするとのことですが、CViewのCFrameWnd はどうなりますか?
自動作成ですか、自前で用意するのですか?
CViewを追加するだけでこのように大量のコードが必要なのですか?
484 :
デフォルトの名無しさん:2014/06/12(木) 10:24:14.20 ID:GvZA3DBS
誤字訂正:
誤:AddView( pView );
正:pDocument->AddView( pView );
ただ、CDocument::AddView(CView *pView) より、
virtual CFrameWnd *CDocTemplate::CreateNewFrame( CDocument* pDoc, CFrameWnd* pOther );
の方が「まだまし」な関数です。なぜなら、後者は、ちゃんとCFrame
を作成してくれるからです。
しかし、これが正しく動作するかは誰にも分かりませんが。
ドキュメントとビューが結びつかないと書いたからAddViewを書いただけ
ドキュメントテンプレートを理解しないと無理
それっぽいメンバ関数を呼べばいいってものじゃない
中途半端な知識を捨てて1から勉強したほうがいいよ
486 :
デフォルトの名無しさん:2014/06/12(木) 11:31:25.92 ID:GvZA3DBS
ちなみに、CDocument::AddView(CView *pView) が公開されていることで、
CViewは、どんなCFrameWndに入れても正しく動作するわけではないことは
実験的にはっきりしています。もちろん、一般のCWndに入れたらそれ以上
に駄目です。
MDIの場合、結露から言うと、CViewは、CMainFrm (<-- CMDIFrameWnd) に
入れるか MDI CLIENT WINDOW の子であるところの CMDIChildWnd に入れ
ないと正しく動作しません。
それ以外のCFrameWndに入れた場合、メッセージルーティングがおかし
くったり、アクティブ化が誤動作します。Docking<--->Floatingでは、
親であるところのCFrameWndの「すげ換え」が置きますが、CControlBar
にCViewを入れたりすると、Floating化後に「二重アクティブCView現象」
が発生し、CMainFrmのメニューが(開こうとすると点滅して)開けなく
なります。
487 :
デフォルトの名無しさん:2014/06/12(木) 11:45:23.41 ID:GvZA3DBS
>>485 釈迦に説法。
自分はIPA認定の天才プログラマを超えている。
その上でかなりMFCの経験をつみ、よく調べた上で書いている。
MFCはスパゲッティーで、ドキュメントに書かれている理念でさえ
満たせていない。ほぼデフォルトの状態でしか使えないと見た方がいい。
変えようとするとさまざまな不具合に遭遇し、MFCのソースを解析、
SPY++でメッセージの調査、テストアプリの製作が必要となり、
最終的にはMFCのソースを大量にコピーして修正する必要が有るか、
または、そうした方が楽。
使いこなせないなら自分で1からフレームワーク書けばいいじゃん
経験を積んだ天才プログラマがよく調べた結果に対して
もう何も言うことはありません
いや、天才プログラマを超えてるわけだから…
490 :
デフォルトの名無しさん:2014/06/12(木) 12:00:25.93 ID:GvZA3DBS
>>488 実際書いてるし、これからもっと書くつもり。
491 :
デフォルトの名無しさん:2014/06/12(木) 12:04:03.31 ID:GvZA3DBS
>>488 「使いこなせない」わけじゃない。普通のプログラマなら、デフォルト
状態に毛の生えた状態でしかしようとしない。
自分の場合は、機能拡張を試みるので、機能拡張が全く出来ないよう
ものが困るだけ。
492 :
デフォルトの名無しさん:2014/06/12(木) 12:10:17.33 ID:GvZA3DBS
>>486 の誤字訂正:
誤:ちなみに、CDocument::AddView(CView *pView) が公開されていることで、
CViewは、どんなCFrameWndに入れても正しく動作するわけではないことは
正:ちなみに、CDocument::AddView(CView *pView) が公開されているので
勘違いしそうですが、CView を、どんなCFrameWndに入れても正しく
動作するわけではありません。それは、
493 :
デフォルトの名無しさん:2014/06/12(木) 12:14:12.78 ID:GvZA3DBS
>>485 その理解もホントは間違い。
なぜなら、オブジェクト指向の理念からすると、公開されている
関数は、どのような使い方をしても正しく動作しなければならない
から。
CView *pView を引数に持つ関数を公開するのなら、ありとあらゆる
方法で作成した CView でも絶対的に正常に動作しなければならない。
この理念の理解の仕方が、天才プログラマのオイラとMFCの設計者や
あなたとの違いだ。
494 :
デフォルトの名無しさん:2014/06/12(木) 12:24:41.32 ID:GvZA3DBS
公開さらたメンバ関数に、CView *pView を引数に持つ場合、本来、
次のようなことが守られて無ければならない。
・pView = new CView した pView でも良い。
・CDocTemplate などから間接的に作成したものでも良い。
・既にどこかで使われている既存の CView でも良い。
・CView は、Create() や CreateEx() などでウィンドウオブジェクト
を作成する前でも後でも良い。
・CView は、クラスの集合で公開されている方法を使ってそうなった
なら、他のどんな種類のウィンドウの子であっても良い。
もし、一般の CWnd の子に成り得てしまうのなら、その場合でも
正常に動作しなければならない。
・CView は、どんなスタイルや属性を持ってCreate()やCreateEx()
されていても良い。
これが、C++ の基本的な理念。これが一つでも守られていなければ
アウト。ただし、CView は、一般の CWnd ではなく、必ず CFrameWnd
に入れる、程度の制約は、ドキュメント化されているならセーフ。
天才じゃなくてもMFCが20年以上前の古代C++と化石PC向けに設計されたことくらい知ってるだろう
これが若気の至りってやつかw
MFCの考え方が素晴らしいから他の環境にもどんどん適用していこう、
なんて奴はどこにもいないから安心して良いよ。
あとは
>>495の通り。MFC1.0はWin3.1より前じゃないかな。
1.0はWindows用でも無かった気がする
499 :
デフォルトの名無しさん:2014/06/12(木) 15:26:31.26 ID:GvZA3DBS
少なくとも、.Net はもっと使いたくないですけどね。
MFC も .NET も糞
Win32API 最高
と言ってしまうのもどうかと思うが。
MFC も .NET も最高
Win32API 糞
ちょ
おまwww
>>493 iteratorにoperator*()があるからといって、end()に対して使ったらアホ。
505 :
デフォルトの名無しさん:2014/06/13(金) 11:27:32.37 ID:V8AWh71l
>>504 end() に対して使っても、不整合は起きませんよね。
そこでiterator 自体がエラー処理するか、一般保護例外などがおきて
停止しませんか。
もしそうだとすれば、最高の安全性が確保されているということです。
AddView() して何のエラーも出ず、内部データの整合性がめちゃくちゃ
になって、後々原因不明のエラーになるのとは大違いです。
天才プログラマなのに2chで質問…
天才プログラマなのに使い方が分からず悪戦苦闘…
MFCなんてソースが付いてるんだからちょっと見れば分かるだろ
適当にやって「うまく動かないのはMFCのせいだ!」って…
天才プログラマなんだから自力で解決しろや
それができないならさっさと諦めろ
天才プログラマはMFCを使わない
Pacalは使うのかね?
おっとsが抜けた、台無しw
天才プログラマはMFCを使わない
↓ ↓
天災プログラマはMFCを使えない
Python
いいよ
なんかと紙一重って言うからな。
513 :
デフォルトの名無しさん:2014/06/14(土) 19:11:48.30 ID:/GIgISes
ウィンドウのアクティブ化なんてものは、大して難しい処理でないことは、
ある程度以上のプログラマなら分かるだろうが、MFCのソースを見ると、
非常に複雑なコーディングになっていて、はっきりいって、こんがらがっ
てる。
514 :
デフォルトの名無しさん:2014/06/14(土) 19:14:18.65 ID:/GIgISes
それだけで数千行を超えてるんじゃないか。
━━MFCユーザーを解放せよ━━
MZC3が始まる……
数年後にこの書き込みを見直したら、
恥ずかしさで転げまわる羽目になるのだろうなw
517 :
デフォルトの名無しさん:2014/06/15(日) 07:29:11.43 ID:CUPMZUG2
ならない。
519 :
デフォルトの名無しさん:2014/06/15(日) 10:25:15.21 ID:CUPMZUG2
人の力の大小を見極めるには、見極める側にも有る程度力が必要だと
いうことが如実に分かるスレですね。
>>519 ですよね〜
MFCのソースはほめられたものじゃないけど、ある程度の経験をつめば
「非常に複雑でこんがらがる」ほどではないことが分かる
だからあの程度で「非常に複雑でこんがらがってしまう」天才プログラマは
本当に天才なのか?って思ってしまう
でも見極める側に力がないからしょうがないですよね
見極められる能力がある天才なら
MFC なんて使い物にならないと
とっくに見切ってるはず
522 :
デフォルトの名無しさん:2014/06/15(日) 13:27:21.91 ID:paCDnv+x
>>521 それも間違い。
MFCはスパゲッティーではあるが、Visual Studio と統合されている
ことで、メッセージ・ハンドラの追加作業が、手でコーディングする
より遥かに効率的に行える。その他、CString が使えたり、
メニューの有効/無効が、OnUpdate 系のハンドラで、CCmdUI を
使って楽に行えたり、自作ダイアログのデータをCStringやintに
最初から入れてくれたりと、とても便利で効率的なことも多い。
つまりWin32を直に使うよりは、遥かに生産性が高い。
しかし、MFCがスパゲッティーで有ることもまた事実。スパゲッティー
だが、IDEとの連携で効率は良い、という複雑な事情が有る。
523 :
デフォルトの名無しさん:2014/06/15(日) 13:32:09.43 ID:paCDnv+x
>>520 それも違うな。
あのソースを「スパゲッティー」だと思わないのは、あなたも
あの程度のスパゲッティーなプログラムしか出来ないからだ。
もっと遥かに美しい設計をいつもしている人なら、あんなソース
は問題外に感じるはず。
>>523 そんな話はしてない
スパゲッティーだろうがなんだろうが天才なら理解出来るでしょ
あの程度が理解出来ないなんて…
実際多いんだよね
プライドだけ高くて何も出来ない奴が…
実力が無いことがばれそうになると言い訳ばっかして逃げる
実力があるならごちゃごちゃ言ってないでさっさと解決すればいいのに、
あれが悪いだのこれが駄目だの…
明日この場所にもう一度来てください
俺が本物のスパゲッティーをお見せしてあげましょう
526 :
デフォルトの名無しさん:2014/06/15(日) 14:14:02.72 ID:paCDnv+x
>>524 実際読んでみたの?
すくなくとも、オイラはスパゲッティーなコードを解読する能力が
高くはない。
ではそれでもなぜ、天才的なプログラミングが出来るのかというと、
スパゲッティーなコードを自分では絶対に書かないからだ。
一目瞭然で、サルでも分かるような単純なコードになっている。
それでも出来上がった作品は、天才的だといわれる。
やっぱり天才だったかw
528 :
デフォルトの名無しさん:2014/06/15(日) 14:25:59.59 ID:paCDnv+x
>>524 何を言ってるの? 「解決」とは何のこと?
スパゲッティーなコードをスパゲッティーだと断言することが、
目的であって、特に解決すべきことはない。
MS は、公式に「MFCのソースを直接変えるな」といっている。
あのレベルのスパゲッティーさを解決するには、
「リファクタリング」するのは最善の策。
それをMSは「禁止」している。
だから、直すためには禁止事項を破る必用が有る。
MFC の中身のコードがすぱげっちぃなんは
人間が書いたものじゃなくて
MSDN の翻訳サイトみたいに
機械生成で造らせたコードだからかも知れないぬ
530 :
デフォルトの名無しさん:2014/06/15(日) 15:01:57.17 ID:paCDnv+x
>>529 そんな可能性は低いと思うけど、ちなみに中身の汚さは外にも出てる。
だから拡張性が低く、ソースがないと利用するのが困難。
本当に美しい論理構造を持っていれば、ソースが無くともスラスラと
利用できるライブラリになる。
熱烈な要望にお応えしてMSが MFC Museum Edition を300万円で発売するってさ
533 :
デフォルトの名無しさん:2014/06/15(日) 15:42:51.93 ID:paCDnv+x
「禁止」というのは言いすぎだった。
よく思い出してみると、「MFCソースは直接、修正すべきではない」
だったような気がする。
そりゃそうかもしれないな。
534 :
デフォルトの名無しさん:2014/06/15(日) 16:02:33.95 ID:paCDnv+x
>>524 >実際多いんだよね
>プライドだけ高くて何も出来ない奴が…
>実力が無いことがばれそうになると言い訳ばっかして逃げる
>実力があるならごちゃごちゃ言ってないでさっさと解決すればいいのに、
>あれが悪いだのこれが駄目だの…
そういう人も多いかもしれないが、オイラはそれには当てはまらない。
作品や他人の評価を知れば、それは証明できる。
遅い
予想を超えたレス…
キチガイに対するレスに素人も玄人もないだろ
キチガイに対するレスに遅いも早いもないだろ
いや、やっぱあるよねw
541 :
デフォルトの名無しさん:2014/06/24(火) 02:16:01.71 ID:4sDn2htr
C++のプログラムを、Windowsのダイアログボックスで操作するMFCベースの
ダイアログプログラムに移植しようとしたが、STLでビルドエラーだ、困った
もんだ。
setコンテナのinsert()メンバ関数とかでエラーになる。
Visual C++ 6.0の[プロジェクトの設定]ダイアログボックスの[C/C++]タブ
の[プロジェクト オプション(O)]に、/GX を追加しても、ビルドで警告表示
は解消しないし、エラーも出てしまう。
どうすれば良いものか。
もちろんヘッダーファイルはインクルードしているし、移植前のプログラム
は、普通にコンパイルが通ったものを使ってる。
Visual C++ 6.0での話しで、それは会社にしかないので、今はそのエラー
メッセージは確認できないが。
自分のVisual C++ .net 2003なら、何も問題なくビルドが普通に通ったが。
どうすれば、STLを普通にビルドを通せるようになるでしょうか。
または、それが無理なら、STLと同様の処理が可能なMFCのライブラリという
ものはないですか。
vc6なんてテンプレート展開が大きすぎるとかで警告出たよな
それなら
#pragma warning disable
つーか、何故既にサポートの切れている環境でしか使えないVC6を使おうとするのか。
保守案件ならSTLを新規に使うことはないわけだし。
VS Express入れて、そいつでビルドしたexeを呼び出す作りにしてみるとか。
VC6でSTLをまともに使おうとするのは一寸無謀すぎる。
545 :
デフォルトの名無しさん:2014/06/24(火) 09:13:55.66 ID:sHZWMGRb
>>543 サポートされていない「機能」でも、自分で解決するのが
プログラマ、だという主張がされているよね。
どんなにMFCがスパゲッティーでも、使いこなせなければプログラマの
能力が低いとされる。
であるならば、サポート切れした開発環境でも使いこなしてみせ
るのが優秀なプログラマだという事だよね。
なぜなら、ちゃんと設計できてないMFCでも、プログラマが苦労して
使うという意味では同じだもの。
弘法筆を選ばず
547 :
デフォルトの名無しさん:2014/06/24(火) 09:58:31.06 ID:sHZWMGRb
実際の弘法は、筆に強いこだわりがあったらしいけれども。
悪い筆でもそれなりに上手く書けるが、良い筆で無いと到達できない
領域が有るのであろう。
>>545 どこにそんな話があったんだ?
自称天才プログラマが人の話を聞かずにギャーギャー騒ぐから
天才なら自分で何とかしろよって話になっただけでしょ。
549 :
名無しさん@0新周年:2014/06/24(火) 11:09:51.36 ID:I/LXKLNz
堂が歪んでは経が読めぬ
サポートが切れているかどうかは個々の企業によるのではないか
サポートが切れているかが問題ではない。VC6で新規開発をすることに意義があるかどうかだ。
552 :
デフォルトの名無しさん:2014/06/24(火) 13:10:51.35 ID:sHZWMGRb
>>548 優秀そうな人の集まりであるかのような書き込みで満ち溢れている2ch
が、実際は凡夫の集まりで有ることに気づかなかったんだよ。
隠しきれずににじみ出てしまう知性と
ギトギトしたアピールとの区别くらいつくやろ
554 :
デフォルトの名無しさん:2014/06/24(火) 13:29:38.06 ID:sHZWMGRb
例えば、灘や開成高校などの環境で育つと周囲には出来るといった
ことは本当に出来る人がほとんど。
「プライドが高い」のではなく本当に出来るから出来ると言っている。
そのつもりで2chを見ていれば、何でも答えられる人の集まりなのだと
勘違いしてしまうんだよ。
仮に何でも答えられる人が居たとしても、
「俺は天才だから、その指摘は俺には当てはまらない」
なんて言ってたら何も答えてくれなくなる
すぐ話をすり替えるし…
いい加減気付けよ
556 :
デフォルトの名無しさん:2014/06/24(火) 13:59:13.02 ID:sHZWMGRb
>>555 はっきり言わないと、世界中からアクセスされてくる2chでは
通用しないんだよ。
それに、天才の言うことを凡人が見ると、知的障害者のように
馬鹿げて見えることが有るようだし。
さらに、2chでは、どのように態度をとっても、「意味有る答えは
めったに返って来ない」ようだし。
557 :
デフォルトの名無しさん:2014/06/24(火) 14:01:28.16 ID:sHZWMGRb
>>555 >仮に何でも答えられる人が居たとしても、
MFCのソースのダメさが理解できない人たちにそれは出来ない。
天才でも歯が立たないMFC
すごいぞMFC
がんばれMFC
やったねMFC
>>557 MFCのソースが良いソースなんて誰も言ってない
最初はMFCの質問かと思っていたけど、要するに
「MFCは糞だよね、天才の自分でも理解できないんだから」って
意見に賛同して欲しかっただけでしょ
563 :
デフォルトの名無しさん:2014/06/24(火) 17:27:47.46 ID:sHZWMGRb
>>562 >>「MFCは糞だよね、天才の自分でも理解できないんだから」って
まあ、勝手に言ってなさいな。
ソースがスパゲッティ云々いう以前に日本語で意思疎通できてない
笑え…ない
>> 541
VC++5のときにSTL系でコンパイルエラーがよく出てた気がする。
そのときはリリースビルドだとエラーがでなくなったことがある。
MFCにCMapってクラスがあるからsetの代わりになるんじゃないの?
もう全然覚えてないけど。
普段は、単一のC++ソースファイルにプログラムを記述して、Visual C++ 6.0の
clコマンドでコンパイル・リンクして、コマンドプロンプト上で実行するプログラム
を作ることが多い。STLは不可欠だ。
そして、Visual C++ 6.0でWindowsプログラムを作成する方法を学習して、少し理解
できてきたところだ。
>>541のプログラムは、標準入出力(コマンドプロンプト)で実行するものを、GUI化
しようとした。
MFCベースのダイアログプログラムを最初にウィザードで作成して、リソースエディタ
を編集して、コマンドライン引数や標準入力から取得していたものは、エディットボックス
から取得するように変更して、コマンドボタンのメッセージハンドラの関数に、main()関数
から実行していたコードを移植して、標準出力していたものは、メッセージボックスで表示
するように変更するという方法で、GUI化を考えた。
STLは使ってるけれど、同じVisual C++ 6.0のclコマンドで、コマンドプロンプトで実行
するプログラムは、問題なく作成できたものだから、ダイアログプログラムにしたからと
いって、ビルドエラーになるとは考えていなかった。clコマンドでは、STLのコードで大量の
警告は出るが、/GX を指定すると出ない。だから、[プロジェクトの設定]ダイアログボックス
で、その設定はしたけれど、効果なしだったし、
>>542で教えてくれた #pragma warning disable
も効果なしだった。
これはもう、MFCでのクラスで代替手段を使ったほうがいいかもしれんな。
>>565がリリースビルド
と言ってるし、明日会社で、リリースビルドで試して、それでも解決しなければ、MFCに変更する。
MFCのクラス階層図を見ると、配列、リスト、マップというものがあるな。これからは、これらを
勉強したほうがいいな。CSetというクラスは存在してないので、
>>565の言う通り、CMapで代用す
るしかないな。そして、CMultiMapも存在してないので、multimapを使ったコードの移植もどう
するか対策の検討が必要になりそうだな。
プロポーショナルフォントだから、「dコマンド」に見えてしまうな。
"d" (D) でなくて、 "c"と"l" (CL) コマンド。
>>543 会社のパソコンのC++コンパイラは、それしかなく、またフリーソフトのダウンロード
は禁止なので、Visual Studio Express等を入れるわけにもいかないので、仕方ないのです。
Visual Studio .net 2003は持ってるけれど、Visual C++ 6.0とは操作方法の違い等
もあることだし、Visual C++ 6.0の学習本で効果的に学習するためと、会社のパソコン
で使うVisual C++ 6.0でのプログラム作成能力を身に付けるために、Visual C++ 6.0
の購入も検討したが、AmazonでEnterprise版の中古は68,000円Professional版は新品で98,000円、中古で4万円、Standard版
の中古で2万もするからな。
これだけのために、この高額な出費は厳しいな。
未だにVC6にしがみついている会社って何なの?
571 :
デフォルトの名無しさん:2014/06/25(水) 07:47:30.11 ID:ddPSuVSv
>>564 意思疎通できてる。もし日本語が変に感じるなら、
天才の言語感覚と、凡人であるあなたの言語感覚とが違っているだけ。
VC6強制とか、追い出し部屋にでも閉じ込められているとしか思えん。
それが割と有るから恐ろしい。
過去製品のサポートだとかでも必要だし、新しい製品と言ってもベースは過去ソースだったり。
VC6とSTL-PORT の組み合わせで使ってます。
.Netでいきなり使いにくくなったりおかしな事になったからVC6を使わざる得ない状態はある。
最新のVSは過去のWindowsどんどん切り捨ててるし
> VC6を使わざる得ない状態はある
え???
staticおじさんキター
>>575 >最新のVSは過去のWindowsどんどん切り捨ててるし
具体的にお願いします:
strhogehoge 関数を使おうとすると
いちいち「もっと secure なの使え」って警告出るのはやめて
>>579 #define _CRT_SECURE_NO_DEPRECATE
>>578 VS2008でWin9X系のバイナリは作れない。2010でWin2kのバイナリは作れない
>>576 お前はプロではないのか?
ちょっと教えてくれ。CRichEditCtrlでDrag&Drop編集の無効化ってできないの?
DragAcceptFiles(FALSE)
だめなら派生させ、WM_DROPFILES/OnDropFiles()で何もせずリターン
DragAcceptFilesはなんか違うだろうと思って調べたら、ES_NOOLEDRAGDROPだった。
ModifyMenuでメニューのテキストを変えたいのですが
HMENUはどれを指定したらいいのでしょうか。
4つ試したのですが、うまく動作しませんでした。
void CMainFrame::OnTestSettext(){
CMenu* main_menu = AfxGetMainWnd()->GetMenu();
CMenu* this_menu = this->GetMenu();
CMenu* menu_menu = this->m_wndMenuBar.GetMenu();
CMenu* tool_menu = this->m_wndToolBar.GetMenu();
::ModifyMenu(tool_menu->m_hMenu,ID_TEST_HELLOWORLD,
MF_BYCOMMAND|MFT_STRING,ID_TEST_HELLOWORLD
,L"こんにちは世界");
}
Windowsネイティブのメニューなら反映されるだろうけど、
メニューバーのように元ネタとしてしか使っていない場合、
メニュー自体を変更しても画面には反映されないような気が。
MFCの流儀に従って、UPDATE_COMMAND_UIメッセージのタイミングで
CCmdUI::SetTextで変更するのがお勧めだな。
587 :
585:2014/07/26(土) 05:33:55.28 ID:ozo5SIol
>>586 おお、ありがとうございました。
WTLでは似たようなやり方でなんとか動いていたのですが、
CCmdUI::SetTextですか。
無事、動きました。
588 :
デフォルトの名無しさん:2014/08/09(土) 13:55:36.09 ID:H0g9sw/6
MFCのダイアログベースアプリをWizardで生成すると
CMyxxxDlgクラスが生成されると思うのですが
これってなんでデストラクタが生成されてないんですか?
MFCのCDialog派生クラスではデストラクタ禁止とか?
589 :
デフォルトの名無しさん:2014/08/09(土) 16:53:38.54 ID:Tp6ekRy+
ComboBox(Type:ドロップダウンリスト)はフォーカス時(ドロップダウンしていなくても)、↑↓キーやマウスホイールに反応しますが、これを簡単に禁止する方法はありませんか?
Spin はリソースのプロパティで止められるのに Comboはできません。メンバ関数も無いようです。
よろしくお願いします。
>>588 (クラスウィザードで生成されたコードには)不要だから。
必要があれば自分で書けばいい。
>>589 派生クラスを作成して PreTranslateMessage で握りつぶす
591 :
588:2014/08/11(月) 22:44:20.22 ID:Tf915yWy
>>590 サンクス!それを聞いて安心して自分で追加できます。
不安神経症で。。
中国語版(簡体字)を作ることになりました。
GB18030に対応するとなると、Unicodeアプリにしないとだめ?
それとも、UTF-8対応アプリとして作成したほうがよいのかな。
経験者いませんか。
593 :
デフォルトの名無しさん:2014/09/01(月) 15:55:55.89 ID:nQghNeel
>>592 んなこと気にするな、ロジックは変わらない。
なんだかんだ言って
使ってるライブラリによって選択肢が絞られるというのが
いつものパターン
>>592 UNICODE(ここでは WIDE 文字の意味)だけだと、2BYTE文字までの対応に
とどまる。
それでは足りないと言うことで、サロゲートペアが導入された。
もともと、1文字を 1 つの wchar_t 変数だけで済まそうと思った
のが Windows における UNICODE 対応だったが、その前提が崩れた。
元々、国産機時代から、SHIFT-JIS が使われていたが、
それは、1文字を全部2BYTEで表すよりは効率が良かったからだ。
8 bits, 16 bits マシンでも効率が良く処理できた。
同様の仕組みの UTF8 は全てを WIDE 文字で表す Windows の
UNICODE 対応よりは効率が良い可能性が高い。
分かりやすい上に、一度対応してしまうとその後何もすること
も無い。
2BYTEでも1BYTEでも今のCPUでは速度が変わらないように思えるが、
使用するメモリが増大することによる効率低下はまだ無視できない。
ASCII文字まで2BYTEで書くのは効率が悪い。最近、ASCII文字まで
2BYTEで表現されたテキストファイルを見たことがあるが、
あれは馬鹿ではなかろうか。
シフトJISだったのはメモリが絶対的に足りなかったから
64kBスモールモデルからやり直せ
もともとASCIIの上に乗っけるために
シフトしてるだけだしなあ
K-IN K-OUT (SI,SOが使われてる体系が大元にあったんだよね
>>598 それは状態変数のある文字コードと呼ばれていて、SJISや
UTF8よりはプログラミングしにくい事が知られている。以下は理由の
一部:
・文字列を別の場所にコピーするような場合、状態まで含めてコピーする
必要がある。
・文字列の内容を正しく示すためには、ポインタだけでは足りず、状態も
必要となる。
一方、SJISや、UTF8は、読み込みと書き込みだけを関数に任してしまえば
プログラミングは楽。uint32 の変数に読み込んだ後の文字を入れてしまい、
それを処理すればよいだけ。それでいてメモリ効率が良い。
本来の意味通りの合理的なSHIFTをしてるのは
むしろEUCの方だと思う
SJISのはギクシャクしてる
SJISは半角カナとBASICで使うコードを避けたからな
5cは裂けませんでした
そこは間が抜けているよな。
CMFCListCtrlを使ったCListViewを作ろうと思うけど、CListView派生型で、GetListCtrl()をオーバーライドするだけじゃダメだよね?
一般的な方法、もしくはその詳細を示しているサイトがあれば教えていただきたいですが…
とある現場ではまだ現役なのに解説本がもう10年出てないってどういうことなの
そういうこと
2〜3千円で本出しても元取れないってこと
基本的な部分は既にある本で間に合うからいいとして、2008sp1で追加された機能の
解説書が出ないうちに消えたのが残念だな。
609 :
デフォルトの名無しさん:2014/10/04(土) 18:27:06.54 ID:IMKf9Y45
MFCって将来消えないのですか?
消える言われて10年ぐらいたってる気がするがなぜか消えない
なぜかはわからんけどフリーでは配布されないぐらいの扱いをされているかもしれない
C++の需要がある限りMFCを捨てるわけにはいかんだろうな。
Win7のサポートが切れる頃にはWinRTに移行してくれると思うが。
C++の需要ってあるの?
614 :
デフォルトの名無しさん:2014/10/06(月) 23:46:27.02 ID:P5y3Kt/6
C#があればVBはもういらないと言っていいと思うけど、C++いらないというところまでは
まだのように思うなぁ。
MS自身、ストアアプリをC#に一本化できずにC++/CXなんてやらざるを得なかったくらいだし。
Windows自身をc#で書いてみろってんだ
VBはいらないと言っても、慣れ親しんだ書き方から、なかなか変えられないからな。
最初に習得した言語で十分と、新しい言語を学ぼうとしない人も多いし。
その結果、技術の進歩に取り残されて、使えない技術者になってしまうんだけどな。
VBは、そうしたロートルを集めるのに役立った。
後は束ねてゴミの日に出すだけだ。
最近は trend micro の製品だと思ってる人の方が多い
VBはほんと糞をまき散らしただけだったなぁ
ポインタも理解できない奴が人類に居ることが驚き
もっと早い段階で免許ないとプログラミング出来ない様にしておくべきだった
その免許を得るための試験問題をひとつあげてみてよ
6809で39hはなにか。
NOP
>>620 プログラミングにおいてポインタを理解していないことは致命的な弱点なのか?
move ip, (sp++)
ポインタを理解できないのは致命的弱点だがな。
高度に規制の掛かった、WEBアプリのような物しか組めなくなる
ポインタを理解できない頭が致命的
ポインタと再帰が理解できない頭ならこの仕事は無理だ
本当は無理なんだが
無理なのに無理やりやらせておかしくなってるのがこの業界でもあるな。
昔々に日立様が「ソフトウェア工場」なんて考えを流布したから
日本ではプログラミングはエンジニアではなくて技能職扱いなんだよね
ドヤ顔でプログラムの「製造」とか言っちゃうでしょ?
へー
ITドカタが標準だと思ってた
それは日立だけの用語?
不治痛でも使ってる?
なんとなく大きな所はどこでもそう言うのかと思ったけど、
そういえば日立用語かも?
で、日立に関わったことがある営業とかマネージャが得意げに言うのよ
製造って
636 :
デフォルトの名無しさん:2014/10/25(土) 08:41:51.34 ID:kNxHTA5N
Visual Studio 2012でMFCを用いて開発するんだけど、
「タイプ ライブラリからの MFC クラスの追加」でExcel 2010を追加したのだが、
xlDialogActivateとかの定数や列挙体ってインポートされないんだっけ?
みんなどうしてる?
自己解決
*.tlhをインクルードするんだったな
すいません、教えて下さい
環境は、VS2013 Pro とWin 8.1 です。
問題は、ダイアログを5つ作り、画面を移れる様にしました。
そのつど、Timerを作り、ダイアログを作りました。
移る時、はkillTimerを使い、Timerを切っていますが
その中の一つが、そのダイアログに移った瞬間
ボタンが、張り付き押せません。
最初は、他のtimerが動いていて、高速で動いている為と思い
debagでブレークポイントを付けて、見て見たのですが、動いている気配が無いです。
timerのIDを変えてみたのですが、それでもボタンが押せません。
Sleep(100)も入れてみました。症状は改善しません
「原因は、何が考えられる」でしょうか?
ソースは、大きいのと仕事なので記載出来ません。
エラー名も出ません、困っています。お願いします。
日本語の勉強からやり直した方が良い
割とマジレス
640 :
片山博文MZ次期CEO ◆T6xkBnTXz7B0 :2014/10/28(火) 23:14:57.34 ID:RQAouJbt
そのダイアログはモーダルかモードレスか。親子関係はどうなっているのか?
なぜそのような画面遷移が必要なのか?
親子関係とは何ですか?
642 :
デフォルトの名無しさん:2014/10/29(水) 07:37:41.85 ID:N8JvcROE
>>641 勉強不足。Win32の基礎からやり直せ
643 :
638:2014/10/29(水) 22:07:35.02 ID:r8pQJvlw
640他
有難う御座います。
ダイアログは、モーダルです。
親1 子4です。
未だ、原因は分かっていませんが
対処は、出来そうです。
新しく、ダイアログを作成して置き換えると
動作しそうです。(リソースが壊れた?)
因みに641は、私では無いです。
644 :
【東電 74.8 %】 :2014/10/30(木) 12:42:12.45 ID:VubmAqci
モーダルの意味が分かってねーだろ?
モードレスにしろよ
ちょっと教えてください。
スレッド内でUpdateDataを使うと
debug asseetion failedになって
あまりよろしくありません。
で検索すると、PostMassage経由でUpdateDataに
アクセスすれば上記のエラーはでない模様です。
でもPostMassageもUpdateDataも
同じCWndメンバーなのに何故UpdateDataは
直接スレッドからアクセスできないのでしょうか。
直接関数呼び出しになるのと
メッセージループで処理されるのとが違う
>>646 UIスレッドと違うスレッドから呼び出したのなら当たり前かと。
MFCのオブジェクトは、基本マルチスレッドには非対応。
PostMessageは殆どAPI直結だから偶々通るだけ。
>>648 > PostMessageは殆どAPI直結だから偶々通るだけ。
嘘書くなよ。メイン(UI)スレッドでしかできない処理(スレッドコンテキストに依存する処理)を
他のスレッドから行わせるときはメッセージをpostして、メッセージループ経由でメインスレッドに
処理させるのは常道。『偶々通る』、なんてことじゃない。
別スレッドからでも問題無くメソッドを呼び出せる、
という思い込みだけで呼び出しているみたいだから、偶々と書いたわけで。
事実UpdateDataはASSERTに引っかかっているし。
厳密には、KB147578に書いてある通りHWNDでPostMessageしろって話なのだろうけど、
流石にそこまではしなくても大丈夫かとw
assertが出るのはCWndオブジェクト管理用のポインタ配列がスレッド単位で
独立しているからでなかったかな。
CWinThread派生クラスにHWND型のデータメンバを追加しておいて、ワーカ
スレッドをサスペンド状態で作成して、ワーカスレッド内からメインスレ
ッドを呼び出す際に、
CWnd *pWnd=CWnd::FromHandle(m_hWnd);
pWnd->UpdateData();
でよかった気がする。
Community版ってPro相当の条件付き無料版みたいだけど
ProってことはMFCもあるんだよね?
個人的にはどうでもいいけどw
MFCないとGUI出来んだろ
自宅のPCにインストール中。
VS2005以来なのでワクワクする。
WTL/ATL も入っちょる
WTL?
657 :
652:2014/11/16(日) 11:07:47.88 ID:fYw/Ek9p
>>653 の真意がよくわからん
>>652で言いたかったのはExpressとかの無料版はMFCなかったけど
Pro相当の無料版はMFCついてるなら、スレ的には価値のあるものかと思った。
個人的にどうでもいいのはVS2010Proもってて新規にMFCのアプリつくることはないので
それで十分とおもっているから。
MFCなくてもGUIのアプリなら
・他のライブラリを使う(QT,wx等)
・WindowsAPIを使う
・Managed系 Cli とかから System.Windows.Forms等を使う
VS2013Communityで遊んでます。
二つのプロジェクト間でリーソースをドラッグでコピーしようとすると
ドラッグされた側が異常終了してコピー出来ません。回避策ありますか?
Comunity版じゃない方はコピーできます?
vs2005で作ったプロジェクトにドッキングウィンドウを仕込もうとしてるんですが
menu,toolbar,statusbarをCMFC?に変えるところで上記問題にぶつかってます。
>>659 リソースビュー上での操作のことであれば、
VS2008やVS2010ではドラッグでもコピーできるようだけど、
まずは普通にキーボードやコンテキストメニューなどでコピーしてみては。
2013Comunityで初めてMFC Feature Packを使ってみた。
何の根拠もなく夢のようなライブラリだと思い込んでたけど
ソース見たら今まで自分でコツコツ作っていた機能を最初から用意している
程度のものもありちょっとショック。
ドッキングウィンドウは良いと思うけどね。
車輪の再発明か
FeaturePack相当のものがC#で手軽に使えたらMFCを捨てて移行してもいいと思ってるんだが、
WPFは自由度が高い代わりに自分でなんとかしろって感じなんだよなぁ。
MFC, WinForms, WPF比較すると自分的にはMFCが一番自由度高いとおもうけどな
ただし、ひたすら面倒。特にダイアログが色んな意味で低レベルだから
なんか自分でポトペタできるようなライブラリか何か作ったほうがいいんじゃないかと思うぐらいだ。
WPFは見た感じや動作をある程度までは比較的簡単にいじれるけど
いちいち覚えることが多いのと、ある程度以上のことはできませんな感じがする。
個人的にはFormsが一番バランスがいいと思う。
>>665 日曜プログラマからの質問ですが
MFC, WinForms, WPFの動作速度(初回起動込)は
MFCを100とするとどんな感じですか?
昔C++/CLIを勉強したことがあるのですが、あまりの遅さに
1週間で見捨てました。今は違うのかな。
速度なんかそんなかわんないんじゃない?
少なくとも体感できるほど遅いのはなんか別の問題だろう。
特にC++/CLIでGUI作ると・・・
動作時の速度じゃないけど、コンパイルがくっそ重かったり
そもそもいきなりGUIエディタがエラーになってGUIいじれなくなったりしてたから
C++/CLIでGUIを作る奴は居ない。
>>667 見捨てた当時、遅すぎると思ったのはシンプルなGDIでの描画です。
VS2013でリビルドしたらだいぶマシになってるようですね。
それでもMFCに比べると倍以上遅いけど、、
669 :
668:2014/11/22(土) 22:33:39.76 ID:w+0AKoeG
訂正
GDIはMFC側の話でDotNet側は中身不明。
670 :
665:2014/11/22(土) 23:41:35.56 ID:nO/Ts9Hc
昔(2005あたり)と比べると初回起動は速くなってるというか、PC自体が速いのが大きいと思う。
最近のWindowsは元から.Net入ってるのも速い理由になってると思う。
C++のアプリと比べると起動遅いと思うときはあるけど問題にするほどでは無い速度と思う。
Windowsは長いこと使ってると起動時間とかどんどん長くなっていって
OSインストールしなおしたりするとOSの起動もアプリの起動も早くなるので
環境や状況によっては遅いと思い込んでいる人もいると思う。
最近WinFormsでDraw系のツールを作ったが実用になる速度ではあると思う。速いとは思わない。
だいぶ以前(VS2005のころ)ビットマップ系のアプリを作成したことがあるが
それは遅いと思った。いわゆるマップチップ表示のようなものだったが、
メモリーDCとかなかったのでビットマップの転送が効率悪いのだろうと思ったが、
最近はPCが速いのか何か改善されたのかわからないけど、以前よりかなり速くなっていた。
C++/CLIとかはほとんど使って無いのでわからない。
671 :
666:2014/11/23(日) 00:10:08.48 ID:b8N83vrz
>>実用になる速度ではあると思う。
リビルドの結果、全く同感です。
>>速いとは思わない。
個人的にはここがネックです。
少しWPFの勉強してみようかな。DirectXで描画みたいだし。
WinFormsはGDI+で描画のはず。
昔はGDI+のハードウェアアクセラレーション予定もあった筈なんだけど、
結局ソフトウェアレンダラで落ち着いたみたいだ。
visual c++はニートになって勉強を続けないと身につけられる気がしない。
週末に学習に専念したくらいでは休み明けに成果を発揮するのは無理だし。
業務でvisual c++の開発をしてるわけではないし、その学習する時間で他の
やるべきことに使う時間が失われるほうが問題かもしれんな。
かなり難しいプログラムコードを書く割に、ウィンドウを表示して画面に
文字や図形を描画する程度で実用性があまりないもののために勉強するの
は大変だな。
単にコンパイラとして使えば良いよ
確かに職場で勉強する暇は無かったな。スケルトンを分かってないとMFCも上手く使えないしな
だが、他の環境よりずっとラクに組めるがなぁ
UIをWin32やMFCで作るのなんてやってられないw
C#が一番楽でいいよw
ただ作るだけ、ならばな。ややこしい仕様を満たすとなると話は違ってくる
MFCでプログラム組む人と、楽なことが一番な人とでは話がかみ合わない
と思う。そんなに大変なものでもないと思うけどね。ニートにならないと
VC身につけられないって人は、何でここ見に来てるんだろう。平日の昼間
に、、いや何でもない。
一ヶ月くらい社内ニートをやってたらそこそこ使えるようになったけどなあ。
そこそこ止まりの頭しか持ってないがw
それは言い方の問題だろ(w
会社から(会社の意図はともかく)学習する時間を貰って、成長した。
と言うか、社内ニートと言うかで大分印象は変わってくる.
私も仕様がいつまでも確定しないでそんなことあったけど、あの時間は
ありがたかったと思う。
社内ニートしてたら会社が潰れたでござる
在宅ニートがはかどるな
ごく初期の学習コストが高めというのはあるかもね。
WIN32APIだけでいろいろやった経験がある人とない人でも違うし
他のフレームワークの経験の有無でも違うだろうけど。
わけわか
686 :
デフォルトの名無しさん:2014/12/07(日) 20:18:42.56 ID:S3RAav3h
www
e
f
g
結局、MS Office は .NET では書かれないんだからな。そりゃCOMとOLEが残るわな。
スレタイ、デバッグライブラリ?
ドトネで書いたらソース丸見えなんだから売れなくなるだろ。
678のように、そんなに大変なものでもないと思う人は、きっと頭がいいんだろうな。
本に書かれているプログラムは、いずれも幼児のおもちゃレベルでしかないけれど、
今はこれで我慢して勉強を続けるしかないんだろうな。
最初から最高のパフォーマンス出せるひとなんてそうそういない
成功の裏にはたくさんの見える失敗や見えない失敗がある
だから初心者は失敗をおそれず色々やればいい
失敗ばかりしてる人が成功するはずが無い
成功者は大抵は失敗がかなり少ない
696 :
デフォルトの名無しさん:2014/12/27(土) 07:22:14.31 ID:w+/gOU5E
なるほど
一理ある
失敗しないのは天賦の才能かね
経験積んで失敗しなくなる訳じゃないんかね
運が良いだけならそうそう続かないと思うんだが
どうなんだろうね
諦めたら失敗が確定する。
最終的に成功すれば、それは試行錯誤となる。
まあ見極めも大事ではある。
699 :
デフォルトの名無しさん:2014/12/28(日) 13:53:50.40 ID:6jddN626
うむ
"成功"が多数の挑戦の結果ならば多数の失敗がある
失敗が少ないのなら成功ではなく安定という名の停滞である
日本人的感覚って気がするなあ
失敗からどれだけ学ぶかじゃない
ノーベル賞を取る人は数限りなく失敗してるんだが
あるいは分量を間違えたら新素材が出来ちゃったとか
ノーベル賞の選考基準に
「失敗からの発見」てのがあるからな
失敗したひとしかノーベル賞取れない
704 :
デフォルトの名無しさん:2014/12/31(水) 07:07:57.90 ID:69RlDRjx
たしかに川上会長は失敗したイメージが全然記憶にないぬ
705 :
デフォルトの名無しさん:2015/01/04(日) 02:10:23.24 ID:OfghjWl9
5.資料を示さず持論が支持されていると思わせる
707 :
デフォルトの名無しさん:2015/01/04(日) 16:34:17.47 ID:w2TCoU2v
一部の特殊な例だけ取り上げて
それが全体の傾向であるように結論付けることはするべきでないが
往々にして成功者ヒストリーは一部の特殊な例である
変な人が一人で意味のない話をしているように見える。
日本語変だし外人さんかな。
VS2013のC++でMFCのアプリケーションウィザードを使うと、自動的に
WindowsのファイルExplorerみたいなアプリが作れますが、例えば、
アプリケーション種類:マルチドキュメント
プロジェクト形式:Office (Ribbon有り)
この上にListBoxとかCheckBoxとかいろんなコントロールを配置して
自作のGUIを作りたいのですが、その場合、Dialogベースのアプリなら、
リソースのエディタでそのダイアログに自由に部品を配置して作成できますが、
上記のアプリの場合、自動生成されたリソースにはIDD_ABOUTBOXくらいしか
ありませんでした。
部品の追加は、プログラムに直接手書きして行くしか方法は無いのでしょうか?
要するにRibbonを持ったGUIを作りたいのですが、部品の配置はDialogを作る場合
のように自由に配置したいのですが。可能でしょうか?
マルチドキュメントなんだからあたりまえ
シングルドキュメント煮汁
>>710 レスありがとございました。
さっそくシングルドキュメントでウィザードで作ってみたのですが
やはり、リソースフォルダの中身を見ると、BitmapとかIconとかMenuとか
いろいろ自動で追加されていますが、Dialogに関しては、IDD_ABOUTBOX
しか見当たりません。部品を自由に配置できるそういうリソースは
自動生成されないのでしょうか?
リボンはDialogじゃなくてRibbonというリソースだよ。マルチ/シングルは関係ない。
>>712 レス有難うございます。
□□□□□□□□□□□□ Ribbon
□□□□□□□□□□□□
■■■■■■■■■■■■
□□□■□□□□□□□□
□□□■□□□□□□□□
□□□■□この部分に□□
□□□■□部品を置きたい
□□□■□□□□□□□□
Ribbonではなくて↑の部分に
部品を置きたいのですが。
Dialogを作るのと同じようにマウスで
部品配置可能でしょうか?
2013は知らないけど、FormViewっていうのがあったような気がする。
>>711 ・CViewではなくCFormViewを使う
・CViewのまま子ダイアログを貼り付けるようにする
デュアルブートできますか?
MFCにはC#のTableLayoutPanelとかSplitContainerに相当する
部品はありませんか?
もし無い場合、皆さん、自作するのでしょうか?
私には難しくて無理です。
2013は知らないけど、CSplitterWndがあったと思う。
動的にすると勝手にスクロールするキモいやつにできる。
> もし無い場合、皆さん、自作するのでしょうか?
ネットで検索したら大体似たものは見つかってたけど最近は知らない。
Win7-64bit+VS2010(SP1)で開発してるんだが、
1ヶ月前あたりからこんな現象が頻発するようになったんだが、同じ症状の人いる?
ttp://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+201205/12050011.txt 今まで問題なかった昔のソースを実行してみても同じ現象になるのよね。
条件はDebugモード、MFCスタティック、CFileDialogを連続して2回以上使う、bVisualStyleを変更しても出る。
CFileDialog使ってから数十秒〜数分の間で出る時もあるし出ない時もある。
出力ログを見るとCOM自動開放時に例外0xC0000005でしくじってる模様(ole.dllがエラー出してる)
OSのFileDialog仕様が変更されたのか、セキュリティのせいなのかよく分からん
>>723 CFileDialog CoInitialize でググったら幸せになれるかな?
Win95のころダイアログ使うとVCのログウインドウによく出てたような気がする。
NT系では出なかった気がする。
プログラム強制終了するわけじゃなかったし原因がわからなかったから放置してたな。
これと一緒かどうかは知らないけど。
726 :
デフォルトの名無しさん:2015/02/19(木) 10:48:51.10 ID:mAv7fs9q
MFCのプログラムでウィンドウのないタスクトレイ常駐プログラムを作っていて
起動時にSetTimerを設定したいのですが、ネットで調べてもウィンドウの初期化時にセットしているものばかりなのですが、
SetTimerはウィンドウがないと使えないでしょうか
ウィンドウはなくてもいいがメッセージループは
廻す必要がある
728 :
デフォルトの名無しさん:2015/02/19(木) 12:10:50.17 ID:mAv7fs9q
起動時にSetTimerを設定する場合はOnInitDialog()の中で行うという解説が多いのですが
ウィンドウがなければOnInitDialog()もないと思うのですが、ウィンドウがない場合はどこにSetTimerを入れるべきでしょうか
そのプログラムがタイマーが必要なタイミングで通るとこに置けばいい
いつからいつまで必要なの?
起動から終了までずっとです
>>730 InitInstanceでSetTimerしてExitInstanceでKillすればいいと思うよ。
あーでもタスクトレイのアプリ作った時はトレイからの通知受け取り用に
表示しないままのウィンドウ作ってたけどな、あまりに昔の話なので
今の状況知らないけど。
>>724 ありがとう。
(*´∀`*)幸せになれた。
2006年頃はAcrobat 7.0が何かしらやらかしてたらしいけど、今回はなんだろうね?
OnTimerは重い処理をさせるときは一度解除したほうがいいんですか?
どうも処理が積み重なっているように感じるのですが
はい
シングルスレッドであれば、タイマーが重い処理を呼び出しているとして、その呼び出しが重複することはないよ。
まあ動作環境知らんけど、再入が気になるなら
フラグとかで対策しとけ
フラグ立てるとatomicな処理とかでまた詰まるんですね
741 :
デフォルトの名無しさん:2015/02/21(土) 06:55:40.51 ID:ZprzlED+
ありがとうござます。
742 :
デフォルトの名無しさん:2015/02/22(日) 23:00:32.38 ID:bfA7aDbz
基本的なことをお聞きしますが、MFCのプログラムを作っていて
ヘッダーファイルで
public:
static const float VAL;
とやってcppのほうで、
CHoge::CHoge()
{
const float VAL = 0.1;
}
とやっているのですが、LNK2001のリンクが未解決というエラーになります。
constの定義はほかにもあるのですが特定の何個かだけエラーになってまして
意味がわかりません、どなたかわかる方教えてください
>>742 const float CHoge::VAL = 0.1;
>>743 あざす
通りました。でもなぜ通るのかわかりません。
どういう意味の違いがあるのでしょうか
一方は関数内ローカル変数になる
746 :
デフォルトの名無しさん:2015/02/23(月) 06:38:22.60 ID:5y2BF+sm
const float ::VAL = 0.1;
ありがとうございます。まだ完全に理解できてませんがスコープが原因ということで調べてみます
748 :
デフォルトの名無しさん:2015/02/23(月) 07:41:28.89 ID:AjFb9vvE
ヘッダに書いてinlineにしてしまえ
C#やJavaと違って、C++は自動でインスタンスフィールド
→クラスフィールドみたいには追いかけてくれない。
……だっけ?
勝手に追いかけてもらったら困る
MFCのクラスの中でstd::mapを使おうとするとアクセス違反で逮捕するってエラーが出るんですが
mapはクラス内で使ってはダメなんでしょうか
どう書いたらどんなエラーが出たのさ?
empty()ではじいたらエラーにならなくなりました。お手数おかけしました
>>751 アクセス違反で逮捕で笑ってしまった。私は懲役だろうなー
755 :
デフォルトの名無しさん:2015/03/01(日) 05:32:10.55 ID:LYwpGVQL
自演つまらん
MFCって.NETと比べるとコントロールが馬鹿に少なくないですか?
こんなんじゃ何も作れないと思うんですが・・・
コントロールやコントロールのようなものをMFCで作るか
ActiveXコントロールならATL(たぶんMFCでも)で作って使えばいいし
むしろDVアーキテクチャなら一般的なコントロールは
ちょっと使いにくいというか、いちいち値を入れたり出したりが
面倒だったりレスポンスが悪くなるような気がする。
.netはコントロールにしないと使えないからでは。
MFCは貧弱だからなぁ
MFCだけじゃなく、C++は標準ライブラリにも恵まれなかったし
.netはその辺の反省も生きているのでは
.netはJavaの真似でしょ。
javaはC++の反省が生かされてるから、
間接的には影響しているんだろうけど。
C++とJavaの反省を生かしているかと
そうはいっても、Windowsアプリ普及期でのMFCの存在はかなり大きかったとおもうよ
APIで書いてた頃のめんどくささったらなかったもの
>>756 作ってたんだよ。必要なコントロールは自分でね。買ってくる時もあるけど。
元々Win32 APIで、C言語での大変な開発に対して、
C++でWin32 APIをラップして使いやすくしたMFCが登場し、
Javaが登場するが、ちょっと理想論的なところが使い難かった、
という反省を踏まえて.NETが登場したという時系列だから
.NETの方がコントロールが多い、便利というのは当たり前
VB6おじさんですねわかります
MFCの設計思想は、名前の通り「ファンデーション」だったんだよ。
APIやメッセージハンドラなどを薄くカプセル化。
今ではだいぶ厚化粧になったけど、根幹は変わっていない。
そうか?
MFCは重ね塗りには向いてなかった設計だが
そもそもMFCってそんなに便利か?
個人的にはWin32APIを直接呼び出すスタイルと比べて、
大差ないと思うんだが。
だから便利じゃんじゃん
大差あったら、いちいちその呼び出しスタイルを覚えなきゃいけないんだぜ
つーか、
>>765 にも
>APIやメッセージハンドラなどを薄くカプセル化。
って書いてるし
>>770 こんなの決まった書き方だから関数化するなりコピペするなりすればよいし。